@tekmidian/devonthink-mcp 1.0.0 → 2.0.1
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/README.md +54 -9
- package/dist/index.d.ts +1 -1
- package/dist/index.js +19 -4
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +15 -9
- package/dist/server.js +177 -83
- package/dist/server.js.map +1 -1
- package/dist/tools/columnLayout.d.ts +79 -0
- package/dist/tools/columnLayout.js +414 -0
- package/dist/tools/columnLayout.js.map +1 -0
- package/dist/tools/listSmartGroups.d.ts +55 -0
- package/dist/tools/listSmartGroups.js +202 -0
- package/dist/tools/listSmartGroups.js.map +1 -0
- package/dist/tools/listSmartRules.d.ts +36 -0
- package/dist/tools/listSmartRules.js +115 -0
- package/dist/tools/listSmartRules.js.map +1 -0
- package/dist/tools/parseEmlHeaders.d.ts +40 -0
- package/dist/tools/parseEmlHeaders.js +183 -0
- package/dist/tools/parseEmlHeaders.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listSmartGroups.js","sourceRoot":"","sources":["../../src/tools/listSmartGroups.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* listSmartRules.ts — Parse DEVONthink SmartRules.plist to enumerate all smart rules.
|
|
3
|
+
*
|
|
4
|
+
* Smart rules are NOT accessible via the standard MCP or AppleScript scripting dictionary.
|
|
5
|
+
* This tool reads the plist file directly using `plutil -convert xml1` to return
|
|
6
|
+
* all smart rules with their names, UUIDs, enabled state, and other metadata.
|
|
7
|
+
*
|
|
8
|
+
* Note: `plutil -convert json` fails because the `data` field contains binary NSKeyedArchiver
|
|
9
|
+
* content that cannot be represented in JSON. XML format represents it as base64, which we skip.
|
|
10
|
+
*/
|
|
11
|
+
interface SmartRuleEntry {
|
|
12
|
+
name: string;
|
|
13
|
+
uuid: string;
|
|
14
|
+
enabled: boolean | null;
|
|
15
|
+
indexOffset: number | null;
|
|
16
|
+
lastExecution: number | null;
|
|
17
|
+
syncDate: string | null;
|
|
18
|
+
useUuidKey: boolean | null;
|
|
19
|
+
}
|
|
20
|
+
interface SmartRulesResult {
|
|
21
|
+
success: boolean;
|
|
22
|
+
smartRules?: SmartRuleEntry[];
|
|
23
|
+
totalCount?: number;
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare const listSmartRulesTool: {
|
|
27
|
+
name: string;
|
|
28
|
+
description: string;
|
|
29
|
+
inputSchema: {
|
|
30
|
+
type: "object";
|
|
31
|
+
properties: {};
|
|
32
|
+
required: never[];
|
|
33
|
+
};
|
|
34
|
+
run: () => Promise<SmartRulesResult>;
|
|
35
|
+
};
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* listSmartRules.ts — Parse DEVONthink SmartRules.plist to enumerate all smart rules.
|
|
3
|
+
*
|
|
4
|
+
* Smart rules are NOT accessible via the standard MCP or AppleScript scripting dictionary.
|
|
5
|
+
* This tool reads the plist file directly using `plutil -convert xml1` to return
|
|
6
|
+
* all smart rules with their names, UUIDs, enabled state, and other metadata.
|
|
7
|
+
*
|
|
8
|
+
* Note: `plutil -convert json` fails because the `data` field contains binary NSKeyedArchiver
|
|
9
|
+
* content that cannot be represented in JSON. XML format represents it as base64, which we skip.
|
|
10
|
+
*/
|
|
11
|
+
import { execSync } from "node:child_process";
|
|
12
|
+
import { homedir } from "node:os";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { existsSync } from "node:fs";
|
|
15
|
+
import { extractStringAfterKey, extractBoolAfterKey, extractIntegerAfterKey, extractRealAfterKey, extractDateAfterKey, extractSubDictAfterKey, extractTopLevelDicts, } from "./listSmartGroups.js";
|
|
16
|
+
const PLIST_PATH = join(homedir(), "Library", "Application Support", "DEVONthink", "SmartRules.plist");
|
|
17
|
+
/**
|
|
18
|
+
* Parse a plist XML string (output of `plutil -convert xml1`) and return
|
|
19
|
+
* an array of smart rule entries.
|
|
20
|
+
*
|
|
21
|
+
* The top-level structure is:
|
|
22
|
+
* <plist><array>
|
|
23
|
+
* <dict>
|
|
24
|
+
* <key>Enabled</key><true/> or <false/>
|
|
25
|
+
* <key>IndexOffset</key><integer>...</integer>
|
|
26
|
+
* <key>LastExecution</key><real>...</real>
|
|
27
|
+
* <key>UseUUIDKey</key><true/> or <false/>
|
|
28
|
+
* <key>data</key><data>...</data> <!-- binary, skip -->
|
|
29
|
+
* <key>name</key><string>...</string>
|
|
30
|
+
* <key>settings</key><dict>...</dict> <!-- skip -->
|
|
31
|
+
* <key>sync</key>
|
|
32
|
+
* <dict>
|
|
33
|
+
* <key>UUID</key><string>...</string>
|
|
34
|
+
* <key>date</key><date>...</date>
|
|
35
|
+
* </dict>
|
|
36
|
+
* </dict>
|
|
37
|
+
* ...
|
|
38
|
+
* </array></plist>
|
|
39
|
+
*/
|
|
40
|
+
function parsePlistXmlToSmartRules(xml) {
|
|
41
|
+
const topLevelDicts = extractTopLevelDicts(xml);
|
|
42
|
+
const results = [];
|
|
43
|
+
for (const dictContent of topLevelDicts) {
|
|
44
|
+
const name = extractStringAfterKey(dictContent, "name");
|
|
45
|
+
const enabled = extractBoolAfterKey(dictContent, "Enabled");
|
|
46
|
+
const indexOffset = extractIntegerAfterKey(dictContent, "IndexOffset");
|
|
47
|
+
const lastExecution = extractRealAfterKey(dictContent, "LastExecution");
|
|
48
|
+
const useUuidKey = extractBoolAfterKey(dictContent, "UseUUIDKey");
|
|
49
|
+
// The sync sub-dict: find the <dict> that follows the <key>sync</key>
|
|
50
|
+
const syncContent = extractSubDictAfterKey(dictContent, "sync");
|
|
51
|
+
const uuid = syncContent ? extractStringAfterKey(syncContent, "UUID") : null;
|
|
52
|
+
const syncDate = syncContent ? extractDateAfterKey(syncContent, "date") : null;
|
|
53
|
+
// Skip entries with no name or UUID (shouldn't happen, but be defensive)
|
|
54
|
+
if (!name && !uuid)
|
|
55
|
+
continue;
|
|
56
|
+
results.push({
|
|
57
|
+
name: name ?? "(unnamed)",
|
|
58
|
+
uuid: uuid ?? "",
|
|
59
|
+
enabled: enabled,
|
|
60
|
+
indexOffset: indexOffset,
|
|
61
|
+
lastExecution: lastExecution,
|
|
62
|
+
syncDate: syncDate ?? null,
|
|
63
|
+
useUuidKey: useUuidKey,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return results;
|
|
67
|
+
}
|
|
68
|
+
const listSmartRules = async () => {
|
|
69
|
+
if (!existsSync(PLIST_PATH)) {
|
|
70
|
+
return {
|
|
71
|
+
success: false,
|
|
72
|
+
error: `SmartRules.plist not found at: ${PLIST_PATH}. Ensure DEVONthink has been run at least once and smart rules have been created.`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
let xml;
|
|
76
|
+
try {
|
|
77
|
+
xml = execSync(`plutil -convert xml1 -o - "${PLIST_PATH}"`, {
|
|
78
|
+
encoding: "utf-8",
|
|
79
|
+
timeout: 10000,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
error: `Failed to parse SmartRules.plist: ${err instanceof Error ? err.message : String(err)}`,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
let smartRules;
|
|
89
|
+
try {
|
|
90
|
+
smartRules = parsePlistXmlToSmartRules(xml);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
return {
|
|
94
|
+
success: false,
|
|
95
|
+
error: `Failed to parse XML output from plutil: ${err instanceof Error ? err.message : String(err)}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// Sort alphabetically by name
|
|
99
|
+
smartRules.sort((a, b) => a.name.localeCompare(b.name));
|
|
100
|
+
return { success: true, smartRules, totalCount: smartRules.length };
|
|
101
|
+
};
|
|
102
|
+
export const listSmartRulesTool = {
|
|
103
|
+
name: "list_smart_rules",
|
|
104
|
+
description: "List all DEVONthink smart rules by parsing SmartRules.plist. " +
|
|
105
|
+
"Returns name, UUID (from sync.UUID), enabled state, indexOffset, lastExecution timestamp, " +
|
|
106
|
+
"and sync date for each rule. " +
|
|
107
|
+
"Smart rules are NOT accessible via the standard AppleScript API — this is the only way to enumerate them.",
|
|
108
|
+
inputSchema: {
|
|
109
|
+
type: "object",
|
|
110
|
+
properties: {},
|
|
111
|
+
required: [],
|
|
112
|
+
},
|
|
113
|
+
run: listSmartRules,
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=listSmartRules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listSmartRules.js","sourceRoot":"","sources":["../../src/tools/listSmartRules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,UAAU,GAAG,IAAI,CACrB,OAAO,EAAE,EACT,SAAS,EACT,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,CACnB,CAAC;AAmBF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,SAAS,yBAAyB,CAAC,GAAW;IAC5C,MAAM,aAAa,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,sBAAsB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QACvE,MAAM,aAAa,GAAG,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACxE,MAAM,UAAU,GAAG,mBAAmB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAElE,sEAAsE;QACtE,MAAM,WAAW,GAAG,sBAAsB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7E,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE/E,yEAAyE;QACzE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;YAAE,SAAS;QAE7B,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,IAAI,IAAI,WAAW;YACzB,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,WAAW;YACxB,aAAa,EAAE,aAAa;YAC5B,QAAQ,EAAE,QAAQ,IAAI,IAAI;YAC1B,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,cAAc,GAAG,KAAK,IAA+B,EAAE;IAC3D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,kCAAkC,UAAU,mFAAmF;SACvI,CAAC;IACJ,CAAC;IAED,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,QAAQ,CAAC,8BAA8B,UAAU,GAAG,EAAE;YAC1D,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,qCAAqC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SAC/F,CAAC;IACJ,CAAC;IAED,IAAI,UAA4B,CAAC;IACjC,IAAI,CAAC;QACH,UAAU,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,2CAA2C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;SACrG,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAExD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;AACtE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,+DAA+D;QAC/D,4FAA4F;QAC5F,+BAA+B;QAC/B,2GAA2G;IAC7G,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;KACb;IACD,GAAG,EAAE,cAAc;CACpB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* parseEmlHeaders.ts — Extract MIME headers from .eml files.
|
|
3
|
+
*
|
|
4
|
+
* Reads an RFC 2822 email file and returns the key headers needed for
|
|
5
|
+
* thread correlation: Message-ID, In-Reply-To, References, Subject, From, To, Date.
|
|
6
|
+
*
|
|
7
|
+
* Handles:
|
|
8
|
+
* - CRLF and LF line endings
|
|
9
|
+
* - Folded headers (continuation lines starting with whitespace)
|
|
10
|
+
* - Encoded words (=?charset?encoding?text?=) in Subject/From/To — decoded to UTF-8
|
|
11
|
+
*/
|
|
12
|
+
interface EmlHeadersResult {
|
|
13
|
+
success: boolean;
|
|
14
|
+
filePath?: string;
|
|
15
|
+
messageId?: string | null;
|
|
16
|
+
inReplyTo?: string | null;
|
|
17
|
+
references?: string[];
|
|
18
|
+
subject?: string | null;
|
|
19
|
+
from?: string | null;
|
|
20
|
+
to?: string | null;
|
|
21
|
+
cc?: string | null;
|
|
22
|
+
date?: string | null;
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare const parseEmlHeadersTool: {
|
|
26
|
+
name: string;
|
|
27
|
+
description: string;
|
|
28
|
+
inputSchema: {
|
|
29
|
+
type: "object";
|
|
30
|
+
properties: {
|
|
31
|
+
filePath: {
|
|
32
|
+
type: string;
|
|
33
|
+
description: string;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
required: string[];
|
|
37
|
+
};
|
|
38
|
+
run: (args: Record<string, unknown>) => Promise<EmlHeadersResult>;
|
|
39
|
+
};
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* parseEmlHeaders.ts — Extract MIME headers from .eml files.
|
|
3
|
+
*
|
|
4
|
+
* Reads an RFC 2822 email file and returns the key headers needed for
|
|
5
|
+
* thread correlation: Message-ID, In-Reply-To, References, Subject, From, To, Date.
|
|
6
|
+
*
|
|
7
|
+
* Handles:
|
|
8
|
+
* - CRLF and LF line endings
|
|
9
|
+
* - Folded headers (continuation lines starting with whitespace)
|
|
10
|
+
* - Encoded words (=?charset?encoding?text?=) in Subject/From/To — decoded to UTF-8
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync } from "node:fs";
|
|
13
|
+
/**
|
|
14
|
+
* Decode RFC 2047 encoded-word sequences like =?utf-8?B?...?= or =?utf-8?Q?...?=
|
|
15
|
+
*/
|
|
16
|
+
function decodeEncodedWords(input) {
|
|
17
|
+
// Match encoded-word: =?charset?encoding?encoded_text?=
|
|
18
|
+
return input.replace(/=\?([^?]+)\?([BbQq])\?([^?]*)\?=/g, (_match, charset, encoding, text) => {
|
|
19
|
+
try {
|
|
20
|
+
const enc = encoding.toUpperCase();
|
|
21
|
+
let bytes;
|
|
22
|
+
if (enc === "B") {
|
|
23
|
+
bytes = Buffer.from(text, "base64");
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// Q encoding: _ is space, = followed by hex digits
|
|
27
|
+
const decoded = text
|
|
28
|
+
.replace(/_/g, " ")
|
|
29
|
+
.replace(/=([0-9A-Fa-f]{2})/g, (_m, h) => String.fromCharCode(parseInt(h, 16)));
|
|
30
|
+
bytes = Buffer.from(decoded, "binary");
|
|
31
|
+
}
|
|
32
|
+
return bytes.toString(charset.toLowerCase() || "utf-8");
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return _match;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Parse RFC 2822 headers from a raw string (the header section of an .eml).
|
|
41
|
+
* Returns a map of lower-cased header names to their unfolded values.
|
|
42
|
+
*/
|
|
43
|
+
function parseHeaders(headerSection) {
|
|
44
|
+
const headers = new Map();
|
|
45
|
+
// Normalise CRLF to LF
|
|
46
|
+
const normalised = headerSection.replace(/\r\n/g, "\n");
|
|
47
|
+
const lines = normalised.split("\n");
|
|
48
|
+
let currentName = null;
|
|
49
|
+
let currentValue = "";
|
|
50
|
+
const flush = () => {
|
|
51
|
+
if (currentName !== null) {
|
|
52
|
+
// Fold whitespace: collapse folded continuation into a single space
|
|
53
|
+
const unfolded = currentValue.replace(/\n[ \t]+/g, " ").trim();
|
|
54
|
+
// Multiple values for the same header (e.g. multiple Received:) — append
|
|
55
|
+
const key = currentName.toLowerCase();
|
|
56
|
+
if (headers.has(key)) {
|
|
57
|
+
headers.set(key, headers.get(key) + "\n" + unfolded);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
headers.set(key, unfolded);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
for (const line of lines) {
|
|
65
|
+
if (line === "") {
|
|
66
|
+
// Blank line signals end of header section (should not appear if we split correctly)
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
if (line[0] === " " || line[0] === "\t") {
|
|
70
|
+
// Continuation line
|
|
71
|
+
if (currentName !== null) {
|
|
72
|
+
currentValue += "\n" + line;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// New header line
|
|
77
|
+
flush();
|
|
78
|
+
const colonIdx = line.indexOf(":");
|
|
79
|
+
if (colonIdx > 0) {
|
|
80
|
+
currentName = line.slice(0, colonIdx).trim();
|
|
81
|
+
currentValue = line.slice(colonIdx + 1);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
currentName = null;
|
|
85
|
+
currentValue = "";
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
flush();
|
|
90
|
+
return headers;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Parse the References header into an array of individual message IDs.
|
|
94
|
+
* References is a whitespace-separated list of <...> tokens.
|
|
95
|
+
*/
|
|
96
|
+
function parseReferences(raw) {
|
|
97
|
+
const matches = raw.match(/<[^>]+>/g);
|
|
98
|
+
return matches ?? [];
|
|
99
|
+
}
|
|
100
|
+
const parseEmlHeaders = async (args) => {
|
|
101
|
+
const { filePath } = args;
|
|
102
|
+
if (!filePath || typeof filePath !== "string") {
|
|
103
|
+
return { success: false, error: "filePath parameter is required and must be a string" };
|
|
104
|
+
}
|
|
105
|
+
if (!existsSync(filePath)) {
|
|
106
|
+
return { success: false, filePath, error: `File not found: ${filePath}` };
|
|
107
|
+
}
|
|
108
|
+
let rawContent;
|
|
109
|
+
try {
|
|
110
|
+
// Read only the first 64 KB — headers are always at the start and rarely exceed a few KB
|
|
111
|
+
const HEADER_READ_LIMIT = 65536;
|
|
112
|
+
const buf = Buffer.alloc(HEADER_READ_LIMIT);
|
|
113
|
+
const fd = await import("node:fs").then((fs) => {
|
|
114
|
+
return new Promise((resolve, reject) => {
|
|
115
|
+
const stream = fs.createReadStream(filePath, { start: 0, end: HEADER_READ_LIMIT - 1 });
|
|
116
|
+
const chunks = [];
|
|
117
|
+
stream.on("data", (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
|
|
118
|
+
stream.on("end", () => resolve(Buffer.concat(chunks)));
|
|
119
|
+
stream.on("error", reject);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
void buf; // suppress unused variable warning
|
|
123
|
+
rawContent = fd.toString("utf-8");
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
return {
|
|
127
|
+
success: false,
|
|
128
|
+
filePath,
|
|
129
|
+
error: `Failed to read file: ${err instanceof Error ? err.message : String(err)}`,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// Split on first blank line (CRLF or LF) to isolate headers from body
|
|
133
|
+
const crlf = rawContent.indexOf("\r\n\r\n");
|
|
134
|
+
const lf = rawContent.indexOf("\n\n");
|
|
135
|
+
let headerSection;
|
|
136
|
+
if (crlf !== -1 && (lf === -1 || crlf < lf)) {
|
|
137
|
+
headerSection = rawContent.slice(0, crlf);
|
|
138
|
+
}
|
|
139
|
+
else if (lf !== -1) {
|
|
140
|
+
headerSection = rawContent.slice(0, lf);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// No blank line found — treat entire content as headers (unusual but handle gracefully)
|
|
144
|
+
headerSection = rawContent;
|
|
145
|
+
}
|
|
146
|
+
const headers = parseHeaders(headerSection);
|
|
147
|
+
const get = (name) => {
|
|
148
|
+
const val = headers.get(name);
|
|
149
|
+
return val !== undefined ? decodeEncodedWords(val.trim()) : null;
|
|
150
|
+
};
|
|
151
|
+
const referencesRaw = get("references");
|
|
152
|
+
return {
|
|
153
|
+
success: true,
|
|
154
|
+
filePath,
|
|
155
|
+
messageId: get("message-id"),
|
|
156
|
+
inReplyTo: get("in-reply-to"),
|
|
157
|
+
references: referencesRaw ? parseReferences(referencesRaw) : [],
|
|
158
|
+
subject: get("subject"),
|
|
159
|
+
from: get("from"),
|
|
160
|
+
to: get("to"),
|
|
161
|
+
cc: get("cc"),
|
|
162
|
+
date: get("date"),
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
export const parseEmlHeadersTool = {
|
|
166
|
+
name: "parse_eml_headers",
|
|
167
|
+
description: "Extract MIME headers from an .eml file for email thread correlation. " +
|
|
168
|
+
"Returns message_id, in_reply_to, references (array), subject, from, to, cc, and date. " +
|
|
169
|
+
"Handles CRLF/LF line endings, folded headers, and RFC 2047 encoded words in Subject/From/To. " +
|
|
170
|
+
'Input: { "filePath": "/path/to/email.eml" }',
|
|
171
|
+
inputSchema: {
|
|
172
|
+
type: "object",
|
|
173
|
+
properties: {
|
|
174
|
+
filePath: {
|
|
175
|
+
type: "string",
|
|
176
|
+
description: "Absolute path to the .eml file to parse",
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
required: ["filePath"],
|
|
180
|
+
},
|
|
181
|
+
run: parseEmlHeaders,
|
|
182
|
+
};
|
|
183
|
+
//# sourceMappingURL=parseEmlHeaders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseEmlHeaders.js","sourceRoot":"","sources":["../../src/tools/parseEmlHeaders.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tekmidian/devonthink-mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "DEVONthink MCP server for Claude Code. Zero-config setup with automatic Claude configuration.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"node": ">=18.0.0"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
+
"@modelcontextprotocol/sdk": "1.0.1",
|
|
40
41
|
"mcp-server-devonthink": "^1.7.1"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|