@tekmidian/devonthink-mcp 1.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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Matthias Nott
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,149 @@
1
+ # devonthink-mcp
2
+
3
+ DEVONthink MCP server for Claude Code. Zero-config setup — one command and you're done.
4
+
5
+ Powered by [mcp-server-devonthink](https://github.com/dvcrn/mcp-server-devonthink).
6
+
7
+ ---
8
+
9
+ ## Quick start
10
+
11
+ ```bash
12
+ npx @tekmidian/devonthink-mcp setup
13
+ ```
14
+
15
+ The wizard checks prerequisites, configures `~/.claude.json`, and enables the server. Restart Claude Code and DEVONthink tools are immediately available.
16
+
17
+ ---
18
+
19
+ ## What it provides
20
+
21
+ With this server running, Claude Code can:
22
+
23
+ - Search and browse all open DEVONthink databases
24
+ - Read document content (PDFs, Markdown, plain text, HTML, rich text)
25
+ - Create, update, and delete records
26
+ - Add and remove tags, classify documents, manage metadata
27
+ - Move, replicate, and duplicate records across groups
28
+ - Cross-reference emails with archived documents
29
+ - Ask AI about documents (DEVONthink's built-in AI)
30
+ - List and navigate database groups
31
+
32
+ ---
33
+
34
+ ## Requirements
35
+
36
+ - macOS (DEVONthink is macOS-only)
37
+ - [DEVONthink 3](https://www.devontechnologies.com/apps/devonthink) installed and running
38
+ - Node.js >= 18
39
+ - Claude Code
40
+
41
+ ---
42
+
43
+ ## Installation
44
+
45
+ ### Option 1: npx (no install required)
46
+
47
+ ```bash
48
+ npx @tekmidian/devonthink-mcp setup
49
+ ```
50
+
51
+ ### Option 2: Global install
52
+
53
+ ```bash
54
+ npm install -g @tekmidian/devonthink-mcp
55
+ devonthink-mcp setup
56
+ ```
57
+
58
+ ### Option 3: Clone and build
59
+
60
+ ```bash
61
+ git clone https://github.com/mnott/devonthink-mcp ~/dev/ai/devonthink-mcp
62
+ cd ~/dev/ai/devonthink-mcp
63
+ npm install
64
+ npm run build
65
+ node dist/index.js setup
66
+ ```
67
+
68
+ ---
69
+
70
+ ## Manual configuration
71
+
72
+ If you prefer to configure Claude Code manually, add this to the `mcpServers` section of `~/.claude.json`:
73
+
74
+ ```json
75
+ "devonthink": {
76
+ "type": "stdio",
77
+ "command": "npx",
78
+ "args": ["-y", "@tekmidian/devonthink-mcp", "serve"],
79
+ "env": {}
80
+ }
81
+ ```
82
+
83
+ Or if you have it installed locally:
84
+
85
+ ```json
86
+ "devonthink": {
87
+ "type": "stdio",
88
+ "command": "node",
89
+ "args": ["/path/to/devonthink-mcp/dist/index.js", "serve"],
90
+ "env": {}
91
+ }
92
+ ```
93
+
94
+ Restart Claude Code after editing `~/.claude.json`.
95
+
96
+ ---
97
+
98
+ ## Usage
99
+
100
+ Once configured, Claude Code has access to all DEVONthink tools automatically. DEVONthink must be running with at least one database open.
101
+
102
+ Example prompts:
103
+
104
+ - "Search my DEVONthink databases for notes about the Q3 budget"
105
+ - "Find the email from John about the contract and show me related documents"
106
+ - "Create a new markdown note in my Inbox with today's meeting notes"
107
+ - "List all documents tagged 'todo' in my Ablegen database"
108
+ - "Read the content of the PDF I imported yesterday"
109
+
110
+ ---
111
+
112
+ ## How it works
113
+
114
+ `devonthink-mcp` is a thin wrapper around the excellent [mcp-server-devonthink](https://github.com/dvcrn/mcp-server-devonthink) package by [@dvcrn](https://github.com/dvcrn). It adds:
115
+
116
+ 1. **A `setup` command** — interactive wizard that configures Claude Code automatically
117
+ 2. **A stable entry point** — `devonthink-mcp serve` resolves and starts the underlying server
118
+
119
+ The underlying server communicates with DEVONthink via AppleScript over the macOS Scripting Bridge.
120
+
121
+ ---
122
+
123
+ ## Troubleshooting
124
+
125
+ **"DEVONthink not found"**
126
+ Make sure DEVONthink 3 is installed in `/Applications` and running.
127
+
128
+ **"No databases found"**
129
+ Open at least one DEVONthink database before using the MCP tools.
130
+
131
+ **Tools not appearing in Claude Code**
132
+ 1. Verify `~/.claude.json` has the `devonthink` entry
133
+ 2. Restart Claude Code (not just a new session — fully quit and reopen)
134
+ 3. Check that DEVONthink is running
135
+
136
+ **AppleScript errors**
137
+ Grant Claude Code (or Terminal) Automation permissions in System Settings > Privacy & Security > Automation.
138
+
139
+ ---
140
+
141
+ ## Credits
142
+
143
+ The DEVONthink MCP implementation is by [dvcrn](https://github.com/dvcrn/mcp-server-devonthink). This package adds the setup tooling and packaging.
144
+
145
+ ---
146
+
147
+ ## License
148
+
149
+ MIT
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * index.ts — CLI entry point for devonthink-mcp
4
+ *
5
+ * Usage: devonthink-mcp <command>
6
+ *
7
+ * Commands:
8
+ * serve Start the MCP server (pass-through to mcp-server-devonthink)
9
+ * setup Interactive first-time setup — configures ~/.claude.json
10
+ * version Print the version
11
+ */
12
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * index.ts — CLI entry point for devonthink-mcp
4
+ *
5
+ * Usage: devonthink-mcp <command>
6
+ *
7
+ * Commands:
8
+ * serve Start the MCP server (pass-through to mcp-server-devonthink)
9
+ * setup Interactive first-time setup — configures ~/.claude.json
10
+ * version Print the version
11
+ */
12
+ import { runSetup } from "./setup.js";
13
+ import { spawnMcpServer } from "./server.js";
14
+ import { readFileSync } from "node:fs";
15
+ import { join, dirname } from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+ const command = process.argv[2];
18
+ function getVersion() {
19
+ try {
20
+ const __filename = fileURLToPath(import.meta.url);
21
+ const distDir = dirname(__filename);
22
+ const pkgPath = join(distDir, "..", "package.json");
23
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
24
+ return pkg.version ?? "unknown";
25
+ }
26
+ catch {
27
+ return "unknown";
28
+ }
29
+ }
30
+ async function main() {
31
+ switch (command) {
32
+ case "serve":
33
+ case undefined: {
34
+ // Default: start the MCP server (this is what Claude Code invokes)
35
+ await spawnMcpServer();
36
+ break;
37
+ }
38
+ case "setup": {
39
+ await runSetup();
40
+ break;
41
+ }
42
+ case "version":
43
+ case "--version":
44
+ case "-v": {
45
+ process.stdout.write(`devonthink-mcp v${getVersion()}\n`);
46
+ break;
47
+ }
48
+ default: {
49
+ process.stderr.write([
50
+ "Usage: devonthink-mcp <command>",
51
+ "",
52
+ "Commands:",
53
+ " serve Start the MCP server (default if no command given)",
54
+ " setup Interactive first-time setup — configures ~/.claude.json",
55
+ " version Print the version",
56
+ "",
57
+ ].join("\n"));
58
+ process.exit(command ? 1 : 0);
59
+ }
60
+ }
61
+ }
62
+ main().catch((err) => {
63
+ const msg = err instanceof Error ? err.message : String(err);
64
+ process.stderr.write(`[devonthink-mcp] Fatal error: ${msg}\n`);
65
+ process.exit(1);
66
+ });
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAEpD,CAAC;QACF,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO,CAAC;QACb,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,mEAAmE;YACnE,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM;QACR,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,QAAQ,EAAE,CAAC;YACjB,MAAM;QACR,CAAC;QAED,KAAK,SAAS,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,UAAU,EAAE,IAAI,CAAC,CAAC;YAC1D,MAAM;QACR,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;gBACE,iCAAiC;gBACjC,EAAE;gBACF,WAAW;gBACX,+DAA+D;gBAC/D,qEAAqE;gBACrE,8BAA8B;gBAC9B,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,IAAI,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * server.ts — Thin pass-through to mcp-server-devonthink
3
+ *
4
+ * Spawns the underlying mcp-server-devonthink process and pipes stdio.
5
+ * This lets devonthink-mcp act as the MCP entry point while delegating
6
+ * all actual DEVONthink communication to the established package.
7
+ */
8
+ /**
9
+ * Start the MCP server by spawning mcp-server-devonthink with inherited stdio.
10
+ * Claude Code communicates with the child process directly via stdin/stdout.
11
+ */
12
+ export declare function spawnMcpServer(): Promise<void>;
package/dist/server.js ADDED
@@ -0,0 +1,89 @@
1
+ /**
2
+ * server.ts — Thin pass-through to mcp-server-devonthink
3
+ *
4
+ * Spawns the underlying mcp-server-devonthink process and pipes stdio.
5
+ * This lets devonthink-mcp act as the MCP entry point while delegating
6
+ * all actual DEVONthink communication to the established package.
7
+ */
8
+ import { spawn } from "node:child_process";
9
+ import { createRequire } from "node:module";
10
+ import { join, dirname } from "node:path";
11
+ import { existsSync } from "node:fs";
12
+ import { fileURLToPath } from "node:url";
13
+ /**
14
+ * Resolve the path to mcp-server-devonthink's dist/index.js.
15
+ * Tries the local node_modules first (when installed as dependency),
16
+ * then falls back to the globally installed package via npx resolution.
17
+ */
18
+ function resolveMcpServerPath() {
19
+ // Strategy 1: resolve from local node_modules (preferred — deterministic)
20
+ try {
21
+ const require = createRequire(import.meta.url);
22
+ // Resolve the package main entry point
23
+ const resolved = require.resolve("mcp-server-devonthink");
24
+ if (resolved && existsSync(resolved)) {
25
+ return resolved;
26
+ }
27
+ }
28
+ catch {
29
+ // not installed locally
30
+ }
31
+ // Strategy 2: look relative to this file (npx usage — package installed in npx cache)
32
+ const __filename = fileURLToPath(import.meta.url);
33
+ const distDir = dirname(__filename);
34
+ const candidates = [
35
+ join(distDir, "..", "node_modules", "mcp-server-devonthink", "dist", "index.js"),
36
+ join(distDir, "..", "..", "mcp-server-devonthink", "dist", "index.js"),
37
+ ];
38
+ for (const candidate of candidates) {
39
+ if (existsSync(candidate)) {
40
+ return candidate;
41
+ }
42
+ }
43
+ return null;
44
+ }
45
+ /**
46
+ * Start the MCP server by spawning mcp-server-devonthink with inherited stdio.
47
+ * Claude Code communicates with the child process directly via stdin/stdout.
48
+ */
49
+ export async function spawnMcpServer() {
50
+ const serverPath = resolveMcpServerPath();
51
+ if (serverPath) {
52
+ // Spawn via Node.js directly (fastest, no PATH lookup needed)
53
+ const child = spawn(process.execPath, [serverPath], {
54
+ stdio: "inherit",
55
+ env: process.env,
56
+ });
57
+ await new Promise((resolve, reject) => {
58
+ child.on("exit", (code) => {
59
+ if (code === 0 || code === null) {
60
+ resolve();
61
+ }
62
+ else {
63
+ reject(new Error(`mcp-server-devonthink exited with code ${code}`));
64
+ }
65
+ });
66
+ child.on("error", reject);
67
+ });
68
+ }
69
+ else {
70
+ // Fallback: run via npx (works without local install)
71
+ process.stderr.write("[devonthink-mcp] mcp-server-devonthink not found locally — falling back to npx\n");
72
+ const child = spawn("npx", ["-y", "mcp-server-devonthink"], {
73
+ stdio: "inherit",
74
+ env: process.env,
75
+ });
76
+ await new Promise((resolve, reject) => {
77
+ child.on("exit", (code) => {
78
+ if (code === 0 || code === null) {
79
+ resolve();
80
+ }
81
+ else {
82
+ reject(new Error(`mcp-server-devonthink (npx) exited with code ${code}`));
83
+ }
84
+ });
85
+ child.on("error", reject);
86
+ });
87
+ }
88
+ }
89
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * setup.ts — Interactive first-time setup for devonthink-mcp
3
+ *
4
+ * Run with: npx @tekmidian/devonthink-mcp setup
5
+ *
6
+ * Walks the user through:
7
+ * 1. Prerequisites check (macOS, Node version, DEVONthink installed)
8
+ * 2. Update ~/.claude.json mcpServers
9
+ * 3. Update ~/.claude/settings.json enabledMcpjsonServers (if present)
10
+ * 4. Done summary with next steps
11
+ */
12
+ export declare function runSetup(): Promise<void>;
package/dist/setup.js ADDED
@@ -0,0 +1,323 @@
1
+ /**
2
+ * setup.ts — Interactive first-time setup for devonthink-mcp
3
+ *
4
+ * Run with: npx @tekmidian/devonthink-mcp setup
5
+ *
6
+ * Walks the user through:
7
+ * 1. Prerequisites check (macOS, Node version, DEVONthink installed)
8
+ * 2. Update ~/.claude.json mcpServers
9
+ * 3. Update ~/.claude/settings.json enabledMcpjsonServers (if present)
10
+ * 4. Done summary with next steps
11
+ */
12
+ import { createInterface } from "node:readline";
13
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
14
+ import { homedir, platform } from "node:os";
15
+ import { join, dirname } from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+ import { execSync } from "node:child_process";
18
+ // ---------------------------------------------------------------------------
19
+ // ANSI color helpers (no external deps)
20
+ // ---------------------------------------------------------------------------
21
+ const RESET = "\x1b[0m";
22
+ const BOLD = "\x1b[1m";
23
+ const GREEN = "\x1b[32m";
24
+ const RED = "\x1b[31m";
25
+ const YELLOW = "\x1b[33m";
26
+ const CYAN = "\x1b[36m";
27
+ const DIM = "\x1b[2m";
28
+ function bold(s) {
29
+ return `${BOLD}${s}${RESET}`;
30
+ }
31
+ function green(s) {
32
+ return `${GREEN}${s}${RESET}`;
33
+ }
34
+ function red(s) {
35
+ return `${RED}${s}${RESET}`;
36
+ }
37
+ function yellow(s) {
38
+ return `${YELLOW}${s}${RESET}`;
39
+ }
40
+ function cyan(s) {
41
+ return `${CYAN}${s}${RESET}`;
42
+ }
43
+ function dim(s) {
44
+ return `${DIM}${s}${RESET}`;
45
+ }
46
+ function ok(msg) {
47
+ process.stdout.write(` ${green("✓")} ${msg}\n`);
48
+ }
49
+ function fail(msg) {
50
+ process.stdout.write(` ${red("✗")} ${msg}\n`);
51
+ }
52
+ function warn(msg) {
53
+ process.stdout.write(` ${yellow("!")} ${msg}\n`);
54
+ }
55
+ function info(msg) {
56
+ process.stdout.write(` ${dim("·")} ${msg}\n`);
57
+ }
58
+ function header(title) {
59
+ process.stdout.write(`\n${bold(title)}\n`);
60
+ process.stdout.write("─".repeat(title.length) + "\n");
61
+ }
62
+ // ---------------------------------------------------------------------------
63
+ // Readline helpers
64
+ // ---------------------------------------------------------------------------
65
+ let rl = null;
66
+ function getReadline() {
67
+ if (!rl) {
68
+ rl = createInterface({ input: process.stdin, output: process.stdout });
69
+ rl.on("close", () => { });
70
+ }
71
+ return rl;
72
+ }
73
+ function closeReadline() {
74
+ if (rl) {
75
+ rl.close();
76
+ rl = null;
77
+ }
78
+ }
79
+ function prompt(question) {
80
+ return new Promise((resolve) => {
81
+ getReadline().question(question, (answer) => resolve(answer.trim()));
82
+ });
83
+ }
84
+ async function promptYesNo(question, defaultYes = true) {
85
+ const hint = defaultYes ? "[Y/n]" : "[y/N]";
86
+ const answer = await prompt(` ${question} ${dim(hint)}: `);
87
+ if (answer === "")
88
+ return defaultYes;
89
+ return answer.toLowerCase().startsWith("y");
90
+ }
91
+ // ---------------------------------------------------------------------------
92
+ // Resolve the path to this package's dist/index.js
93
+ // ---------------------------------------------------------------------------
94
+ function getIndexJsPath() {
95
+ const __filename = fileURLToPath(import.meta.url);
96
+ const distDir = dirname(__filename);
97
+ return join(distDir, "index.js");
98
+ }
99
+ function checkDevonThinkInstalled() {
100
+ const candidates = [
101
+ "/Applications/DEVONthink 3.app",
102
+ "/Applications/DEVONthink Pro.app",
103
+ "/Applications/DEVONthink Personal.app",
104
+ "/Applications/DEVONthink.app",
105
+ ];
106
+ for (const candidate of candidates) {
107
+ if (existsSync(candidate)) {
108
+ return { installed: true, path: candidate };
109
+ }
110
+ }
111
+ // Try mdfind as a fallback
112
+ try {
113
+ const result = execSync('mdfind "kMDItemCFBundleIdentifier == \'com.devon-technologies.think3\'" 2>/dev/null', { encoding: "utf-8", timeout: 5000 }).trim();
114
+ if (result) {
115
+ const firstPath = result.split("\n")[0];
116
+ return { installed: true, path: firstPath ?? null };
117
+ }
118
+ }
119
+ catch {
120
+ // mdfind failed or not available
121
+ }
122
+ return { installed: false, path: null };
123
+ }
124
+ async function stepPrerequisites() {
125
+ header("Step 1: Prerequisites");
126
+ const isMacOS = platform() === "darwin";
127
+ const nodeVersion = process.version;
128
+ if (isMacOS) {
129
+ ok("macOS detected");
130
+ }
131
+ else {
132
+ fail(`Platform: ${platform()} — DEVONthink is macOS-only`);
133
+ warn("devonthink-mcp requires macOS with DEVONthink 3 installed.");
134
+ warn("This setup cannot continue on non-macOS platforms.");
135
+ throw new Error("devonthink-mcp requires macOS.");
136
+ }
137
+ const nodeOk = nodeVersion.startsWith("v") && parseInt(nodeVersion.slice(1)) >= 18;
138
+ if (nodeOk) {
139
+ ok(`Node ${nodeVersion} — supported`);
140
+ }
141
+ else {
142
+ warn(`Node ${nodeVersion} may be too old. Node 18+ recommended.`);
143
+ }
144
+ const { installed, path: devonthinkPath } = checkDevonThinkInstalled();
145
+ if (installed) {
146
+ ok(`DEVONthink found: ${cyan(devonthinkPath ?? "yes")}`);
147
+ }
148
+ else {
149
+ fail("DEVONthink 3 not found in /Applications");
150
+ warn("Install DEVONthink from https://www.devontechnologies.com/apps/devonthink");
151
+ warn("Note: The MCP server still works if DEVONthink is installed elsewhere.");
152
+ }
153
+ return { isMacOS, nodeVersion, devonthinkInstalled: installed, devonthinkPath };
154
+ }
155
+ // ---------------------------------------------------------------------------
156
+ // Step 2: Update ~/.claude.json
157
+ // ---------------------------------------------------------------------------
158
+ async function stepUpdateClaudeJson(indexJsPath) {
159
+ header("Step 2: Configure Claude Code (/.claude.json)");
160
+ const claudeJsonPath = join(homedir(), ".claude.json");
161
+ if (!existsSync(claudeJsonPath)) {
162
+ warn("~/.claude.json not found.");
163
+ warn("This file is created the first time you run Claude Code. Run Claude Code once, then re-run setup.");
164
+ return false;
165
+ }
166
+ let parsed;
167
+ try {
168
+ const raw = readFileSync(claudeJsonPath, "utf-8");
169
+ parsed = JSON.parse(raw);
170
+ }
171
+ catch (err) {
172
+ warn(`Could not parse ~/.claude.json: ${err}`);
173
+ return false;
174
+ }
175
+ const mcpServers = parsed["mcpServers"] ?? {};
176
+ // Check if already configured
177
+ const existingEntry = mcpServers["devonthink"];
178
+ if (existingEntry) {
179
+ const currentArgs = existingEntry["args"] ?? [];
180
+ const currentCmd = existingEntry["command"] ?? "";
181
+ info(`Existing entry: ${cyan([currentCmd, ...currentArgs].join(" "))}`);
182
+ info(`Proposed entry: ${cyan(`node ${indexJsPath} serve`)}`);
183
+ process.stdout.write("\n");
184
+ const doUpdate = await promptYesNo("Update the existing devonthink entry to use this installation?", true);
185
+ if (!doUpdate) {
186
+ warn("Skipping ~/.claude.json update");
187
+ return false;
188
+ }
189
+ }
190
+ else {
191
+ info(`Will add: ${cyan(`devonthink`)}`);
192
+ info(`Command: ${cyan(`node ${indexJsPath} serve`)}`);
193
+ process.stdout.write("\n");
194
+ const doAdd = await promptYesNo('Add "devonthink" MCP server to ~/.claude.json?', true);
195
+ if (!doAdd) {
196
+ warn("Skipping ~/.claude.json update");
197
+ return false;
198
+ }
199
+ }
200
+ // Update the mcpServers entry
201
+ const updatedServers = { ...mcpServers };
202
+ updatedServers["devonthink"] = {
203
+ type: "stdio",
204
+ command: "node",
205
+ args: [indexJsPath, "serve"],
206
+ env: {},
207
+ };
208
+ parsed["mcpServers"] = updatedServers;
209
+ try {
210
+ writeFileSync(claudeJsonPath, JSON.stringify(parsed, null, 2) + "\n", "utf-8");
211
+ ok(`Updated ~/.claude.json — "devonthink" MCP server configured`);
212
+ }
213
+ catch (err) {
214
+ throw new Error(`Failed to write ~/.claude.json: ${err}`);
215
+ }
216
+ return true;
217
+ }
218
+ // ---------------------------------------------------------------------------
219
+ // Step 3: Update ~/.claude/settings.json (enabledMcpjsonServers)
220
+ // ---------------------------------------------------------------------------
221
+ async function stepUpdateSettings() {
222
+ header("Step 3: Enable in Claude Code Settings");
223
+ const settingsPath = join(homedir(), ".claude", "settings.json");
224
+ if (!existsSync(settingsPath)) {
225
+ info("~/.claude/settings.json not found — skipping");
226
+ info("(This file is optional; Claude Code creates it when needed)");
227
+ return false;
228
+ }
229
+ let parsed;
230
+ try {
231
+ const raw = readFileSync(settingsPath, "utf-8");
232
+ parsed = JSON.parse(raw);
233
+ }
234
+ catch (err) {
235
+ warn(`Could not parse ~/.claude/settings.json: ${err}`);
236
+ return false;
237
+ }
238
+ const enabled = parsed["enabledMcpjsonServers"] ?? [];
239
+ if (enabled.includes("devonthink")) {
240
+ ok('"devonthink" is already in enabledMcpjsonServers');
241
+ return true;
242
+ }
243
+ const disabled = parsed["disabledMcpjsonServers"] ?? [];
244
+ const doEnable = await promptYesNo('Add "devonthink" to enabledMcpjsonServers in ~/.claude/settings.json?', true);
245
+ if (!doEnable) {
246
+ warn("Skipping settings.json update");
247
+ return false;
248
+ }
249
+ parsed["enabledMcpjsonServers"] = [...enabled, "devonthink"];
250
+ // Remove from disabled list if present
251
+ if (disabled.includes("devonthink")) {
252
+ parsed["disabledMcpjsonServers"] = disabled.filter((s) => s !== "devonthink");
253
+ info('Removed "devonthink" from disabledMcpjsonServers');
254
+ }
255
+ try {
256
+ writeFileSync(settingsPath, JSON.stringify(parsed, null, 2) + "\n", "utf-8");
257
+ ok('Added "devonthink" to enabledMcpjsonServers in ~/.claude/settings.json');
258
+ }
259
+ catch (err) {
260
+ throw new Error(`Failed to write ~/.claude/settings.json: ${err}`);
261
+ }
262
+ return true;
263
+ }
264
+ // ---------------------------------------------------------------------------
265
+ // Step 4: Done summary
266
+ // ---------------------------------------------------------------------------
267
+ function stepDone(opts) {
268
+ header("Setup Complete!");
269
+ const { claudeJsonUpdated, settingsUpdated, indexJsPath } = opts;
270
+ process.stdout.write("\n");
271
+ if (claudeJsonUpdated || settingsUpdated) {
272
+ ok('DEVONthink MCP server is now configured for Claude Code');
273
+ warn("Restart Claude Code to load the new MCP server.");
274
+ }
275
+ else {
276
+ info("Configuration was not updated. You can run setup again or configure manually.");
277
+ process.stdout.write("\n");
278
+ process.stdout.write(bold(" Manual configuration:\n"));
279
+ process.stdout.write(" Add this to the mcpServers section of ~/.claude.json:\n\n");
280
+ process.stdout.write(` "devonthink": {\n "type": "stdio",\n "command": "node",\n "args": ["${indexJsPath}", "serve"],\n "env": {}\n }\n`);
281
+ }
282
+ process.stdout.write("\n");
283
+ process.stdout.write(bold(" What this MCP server provides:\n"));
284
+ process.stdout.write(" · Search and browse DEVONthink databases\n");
285
+ process.stdout.write(" · Read document content\n");
286
+ process.stdout.write(" · Create, update, and organize records\n");
287
+ process.stdout.write(" · Add tags, classify, and manage metadata\n");
288
+ process.stdout.write(" · Cross-reference emails and documents\n");
289
+ process.stdout.write("\n");
290
+ process.stdout.write(bold(" Requires:\n"));
291
+ process.stdout.write(" · DEVONthink 3 running on macOS\n");
292
+ process.stdout.write(" · One or more open databases\n");
293
+ process.stdout.write("\n");
294
+ }
295
+ // ---------------------------------------------------------------------------
296
+ // Main entry point
297
+ // ---------------------------------------------------------------------------
298
+ export async function runSetup() {
299
+ process.stdout.write("\n");
300
+ process.stdout.write(bold("devonthink-mcp setup") + "\n");
301
+ process.stdout.write("====================\n");
302
+ process.stdout.write(dim("Configure devonthink-mcp for Claude Code. Press Ctrl+C to abort.\n"));
303
+ const indexJsPath = getIndexJsPath();
304
+ try {
305
+ // Step 1: Prerequisites
306
+ await stepPrerequisites();
307
+ // Step 2: Update ~/.claude.json
308
+ const claudeJsonUpdated = await stepUpdateClaudeJson(indexJsPath);
309
+ // Step 3: Update ~/.claude/settings.json
310
+ const settingsUpdated = await stepUpdateSettings();
311
+ // Step 4: Done
312
+ stepDone({ claudeJsonUpdated, settingsUpdated, indexJsPath });
313
+ }
314
+ catch (err) {
315
+ const msg = err instanceof Error ? err.message : String(err);
316
+ process.stdout.write(`\n${red("Setup failed:")} ${msg}\n`);
317
+ process.exit(1);
318
+ }
319
+ finally {
320
+ closeReadline();
321
+ }
322
+ }
323
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@tekmidian/devonthink-mcp",
3
+ "version": "1.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
+ "devonthink-mcp": "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/devonthink-mcp.git"
35
+ },
36
+ "engines": {
37
+ "node": ">=18.0.0"
38
+ },
39
+ "dependencies": {
40
+ "mcp-server-devonthink": "^1.7.1"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^22",
44
+ "typescript": "^5.7"
45
+ }
46
+ }