@zengjing/xmind-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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +574 -0
  3. package/dist/cli.d.ts +7 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +170 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/core/legacy-parser.d.ts +63 -0
  8. package/dist/core/legacy-parser.d.ts.map +1 -0
  9. package/dist/core/legacy-parser.js +139 -0
  10. package/dist/core/legacy-parser.js.map +1 -0
  11. package/dist/core/parser.d.ts +19 -0
  12. package/dist/core/parser.d.ts.map +1 -0
  13. package/dist/core/parser.js +111 -0
  14. package/dist/core/parser.js.map +1 -0
  15. package/dist/core/zen-parser.d.ts +15 -0
  16. package/dist/core/zen-parser.d.ts.map +1 -0
  17. package/dist/core/zen-parser.js +90 -0
  18. package/dist/core/zen-parser.js.map +1 -0
  19. package/dist/formatters/json-formatter.d.ts +69 -0
  20. package/dist/formatters/json-formatter.d.ts.map +1 -0
  21. package/dist/formatters/json-formatter.js +131 -0
  22. package/dist/formatters/json-formatter.js.map +1 -0
  23. package/dist/formatters/markdown-formatter.d.ts +40 -0
  24. package/dist/formatters/markdown-formatter.d.ts.map +1 -0
  25. package/dist/formatters/markdown-formatter.js +136 -0
  26. package/dist/formatters/markdown-formatter.js.map +1 -0
  27. package/dist/index.d.ts +6 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +117 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/model/schemas.d.ts +54 -0
  32. package/dist/model/schemas.d.ts.map +1 -0
  33. package/dist/model/schemas.js +64 -0
  34. package/dist/model/schemas.js.map +1 -0
  35. package/dist/model/types.d.ts +79 -0
  36. package/dist/model/types.d.ts.map +1 -0
  37. package/dist/model/types.js +6 -0
  38. package/dist/model/types.js.map +1 -0
  39. package/dist/tools/branch-tool.d.ts +20 -0
  40. package/dist/tools/branch-tool.d.ts.map +1 -0
  41. package/dist/tools/branch-tool.js +150 -0
  42. package/dist/tools/branch-tool.js.map +1 -0
  43. package/dist/tools/parse-tool.d.ts +27 -0
  44. package/dist/tools/parse-tool.d.ts.map +1 -0
  45. package/dist/tools/parse-tool.js +126 -0
  46. package/dist/tools/parse-tool.js.map +1 -0
  47. package/dist/tools/search-tool.d.ts +27 -0
  48. package/dist/tools/search-tool.d.ts.map +1 -0
  49. package/dist/tools/search-tool.js +179 -0
  50. package/dist/tools/search-tool.js.map +1 -0
  51. package/dist/utils/errors.d.ts +26 -0
  52. package/dist/utils/errors.d.ts.map +1 -0
  53. package/dist/utils/errors.js +41 -0
  54. package/dist/utils/errors.js.map +1 -0
  55. package/dist/utils/file-utils.d.ts +25 -0
  56. package/dist/utils/file-utils.d.ts.map +1 -0
  57. package/dist/utils/file-utils.js +58 -0
  58. package/dist/utils/file-utils.js.map +1 -0
  59. package/dist/utils/logger.d.ts +8 -0
  60. package/dist/utils/logger.d.ts.map +1 -0
  61. package/dist/utils/logger.js +23 -0
  62. package/dist/utils/logger.js.map +1 -0
  63. package/package.json +67 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/model/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Core data types representing the unified XMind AST model.
3
+ * Both Zen (JSON) and Legacy (XML) formats are normalized to this structure.
4
+ */
5
+ export interface XMindNode {
6
+ /** Globally unique node identifier within the document */
7
+ id: string;
8
+ /** Node display title */
9
+ title: string;
10
+ /** Optional notes/description attached to the node */
11
+ note?: string;
12
+ /** Array of label strings (e.g., "Important", "Review") */
13
+ labels?: string[];
14
+ /** Array of marker types (e.g., "priority-1", "task-done", "bookmark") */
15
+ markers?: string[];
16
+ /** Child nodes in hierarchical order */
17
+ children: XMindNode[];
18
+ /** Optional hyperlink or internal node reference ID */
19
+ href?: string;
20
+ /** Optional position metadata (for layout preservation, if needed) */
21
+ position?: {
22
+ x?: number;
23
+ y?: number;
24
+ };
25
+ }
26
+ export interface XMindRelationship {
27
+ /** Unique relationship identifier */
28
+ id: string;
29
+ /** Optional relationship label/title */
30
+ title?: string;
31
+ /** Source node ID */
32
+ sourceId: string;
33
+ /** Target node ID */
34
+ targetId: string;
35
+ }
36
+ export interface XMindSheet {
37
+ /** Sheet unique identifier */
38
+ id: string;
39
+ /** Sheet display title */
40
+ title: string;
41
+ /** Root topic of the sheet (required in XMind) */
42
+ rootTopic: XMindNode;
43
+ /** Cross-node relationships/connectors (optional) */
44
+ relationships?: XMindRelationship[];
45
+ }
46
+ export interface XMindParsedResult {
47
+ /** Absolute file path of the parsed .xmind file */
48
+ filePath: string;
49
+ /** Array of sheets (typically 1, but XMind supports multiple) */
50
+ sheets: XMindSheet[];
51
+ /** Metadata about the parsing operation */
52
+ meta?: {
53
+ /** Format version detected: 'zen' (modern JSON) or 'legacy' (XML-based) */
54
+ formatVersion: 'zen' | 'legacy';
55
+ /** Total count of topics across all sheets */
56
+ topicCount: number;
57
+ /** Timestamp of parsing operation */
58
+ parsedAt: string;
59
+ };
60
+ }
61
+ export interface SearchResult {
62
+ /** The matched node */
63
+ node: XMindNode;
64
+ /** Where the match occurred: "title", "note", or "label" */
65
+ matchType: 'title' | 'note' | 'label';
66
+ /** The matched text excerpt */
67
+ matchText: string;
68
+ /** Breadcrumb path from root to this node (node IDs) */
69
+ pathToRoot: string[];
70
+ }
71
+ export interface BranchExtractionResult {
72
+ /** The root of the extracted subtree */
73
+ rootNode: XMindNode;
74
+ /** Actual depth reached (≤ requested depth) */
75
+ depthReached: number;
76
+ /** Total nodes in the extracted branch */
77
+ nodeCount: number;
78
+ }
79
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/model/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB,0DAA0D;IAC1D,EAAE,EAAE,MAAM,CAAC;IAEX,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IAEd,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,wCAAwC;IACxC,QAAQ,EAAE,SAAS,EAAE,CAAC;IAEtB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,sEAAsE;IACtE,QAAQ,CAAC,EAAE;QACT,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;KACZ,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IAEX,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IAEjB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IAEX,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IAEd,kDAAkD;IAClD,SAAS,EAAE,SAAS,CAAC;IAErB,qDAAqD;IACrD,aAAa,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IAEjB,iEAAiE;IACjE,MAAM,EAAE,UAAU,EAAE,CAAC;IAErB,2CAA2C;IAC3C,IAAI,CAAC,EAAE;QACL,2EAA2E;QAC3E,aAAa,EAAE,KAAK,GAAG,QAAQ,CAAC;QAEhC,8CAA8C;QAC9C,UAAU,EAAE,MAAM,CAAC;QAEnB,qCAAqC;QACrC,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,IAAI,EAAE,SAAS,CAAC;IAEhB,4DAA4D;IAC5D,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAEtC,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAElB,wDAAwD;IACxD,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,wCAAwC;IACxC,QAAQ,EAAE,SAAS,CAAC;IAEpB,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IAErB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Core data types representing the unified XMind AST model.
3
+ * Both Zen (JSON) and Legacy (XML) formats are normalized to this structure.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/model/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * MCP Tool: get_xmind_node_branch
3
+ * Extract a specific node and its descendants (up to specified depth).
4
+ */
5
+ import type { Tool } from '@modelcontextprotocol/sdk/types';
6
+ export declare const GET_BRANCH_TOOL: Tool;
7
+ export interface BranchToolInput {
8
+ path: string;
9
+ nodeId: string;
10
+ depth?: number;
11
+ }
12
+ /**
13
+ * Execute the get_xmind_node_branch tool.
14
+ * Parses the file, finds the target node, extracts its branch with depth limit, and formats output.
15
+ *
16
+ * @param input - Tool input containing path, nodeId, and optional depth
17
+ * @returns Formatted branch output with Markdown outline and metadata
18
+ */
19
+ export declare function executeBranchTool(input: BranchToolInput): Promise<string>;
20
+ //# sourceMappingURL=branch-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-tool.d.ts","sourceRoot":"","sources":["../../src/tools/branch-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AAS5D,eAAO,MAAM,eAAe,EAAE,IAuB7B,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA0DD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA4E/E"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * MCP Tool: get_xmind_node_branch
3
+ * Extract a specific node and its descendants (up to specified depth).
4
+ */
5
+ import { parseXMindFile } from '../core/parser.js';
6
+ import { GetBranchInputSchema } from '../model/schemas.js';
7
+ import { xmindToMarkdown } from '../formatters/markdown-formatter.js';
8
+ import { resolveFilePath, isValidNodeId } from '../utils/file-utils.js';
9
+ import { isXMindError } from '../utils/errors.js';
10
+ import { debug, info, warn, error as logError } from '../utils/logger.js';
11
+ export const GET_BRANCH_TOOL = {
12
+ name: 'get_xmind_node_branch',
13
+ description: 'Extract a specific node and its subtree (up to specified depth) from an XMind file. ' +
14
+ 'Useful for large mind maps to avoid token overload by retrieving only relevant branches.',
15
+ inputSchema: {
16
+ type: 'object',
17
+ properties: {
18
+ path: {
19
+ type: 'string',
20
+ description: 'Absolute file path to the .xmind file',
21
+ },
22
+ nodeId: {
23
+ type: 'string',
24
+ description: 'Target node ID to extract (get available IDs via search_xmind_nodes or parse_xmind)',
25
+ },
26
+ depth: {
27
+ type: 'number',
28
+ description: 'Maximum recursion depth for children (optional, default unlimited)',
29
+ },
30
+ },
31
+ required: ['path', 'nodeId'],
32
+ },
33
+ };
34
+ /**
35
+ * Find a node by ID in the tree using recursive search.
36
+ * Returns the first matching node or null if not found.
37
+ *
38
+ * @param node - Root node to start searching from
39
+ * @param targetId - ID of the node to find
40
+ * @returns The matching XMindNode or null
41
+ */
42
+ function findNodeById(node, targetId) {
43
+ if (node.id === targetId) {
44
+ return node;
45
+ }
46
+ for (const child of node.children) {
47
+ const found = findNodeById(child, targetId);
48
+ if (found)
49
+ return found;
50
+ }
51
+ return null;
52
+ }
53
+ /**
54
+ * Extract a subtree with optional depth limit.
55
+ * Traverses the tree and returns extracted node, actual depth reached, and node count.
56
+ *
57
+ * @param node - Root node of the subtree to extract
58
+ * @param maxDepth - Maximum depth to traverse (optional)
59
+ * @returns Object containing extracted node, actual depth, and node count
60
+ */
61
+ function extractBranch(node, maxDepth) {
62
+ let actualDepth = 0;
63
+ let nodeCount = 0;
64
+ const extract = (n, currentDepth) => {
65
+ nodeCount++;
66
+ actualDepth = Math.max(actualDepth, currentDepth);
67
+ if (maxDepth !== undefined && currentDepth >= maxDepth) {
68
+ return { ...n, children: [] };
69
+ }
70
+ return {
71
+ ...n,
72
+ children: n.children.map(child => extract(child, currentDepth + 1)),
73
+ };
74
+ };
75
+ const extractedNode = extract(node, 0);
76
+ return { node: extractedNode, actualDepth, nodeCount };
77
+ }
78
+ /**
79
+ * Execute the get_xmind_node_branch tool.
80
+ * Parses the file, finds the target node, extracts its branch with depth limit, and formats output.
81
+ *
82
+ * @param input - Tool input containing path, nodeId, and optional depth
83
+ * @returns Formatted branch output with Markdown outline and metadata
84
+ */
85
+ export async function executeBranchTool(input) {
86
+ try {
87
+ // Step 1: Validate input
88
+ const validated = GetBranchInputSchema.parse(input);
89
+ const filePath = resolveFilePath(validated.path);
90
+ if (!isValidNodeId(validated.nodeId)) {
91
+ warn('Invalid node ID format', { nodeId: validated.nodeId });
92
+ return `Invalid node ID format: "${validated.nodeId}". Node IDs should be alphanumeric with hyphens/underscores.`;
93
+ }
94
+ // Step 2: Parse the XMind file
95
+ debug('Extracting branch', { nodeId: validated.nodeId, maxDepth: validated.depth });
96
+ const parsed = await parseXMindFile(filePath);
97
+ info('File parsed successfully for branch extraction', {
98
+ sheetCount: parsed.sheets.length,
99
+ nodeId: validated.nodeId,
100
+ });
101
+ // Step 3: Find the target node across all sheets
102
+ let targetNode = null;
103
+ for (const sheet of parsed.sheets) {
104
+ targetNode = findNodeById(sheet.rootTopic, validated.nodeId);
105
+ if (targetNode)
106
+ break;
107
+ }
108
+ if (!targetNode) {
109
+ warn('Node not found', { nodeId: validated.nodeId });
110
+ return `Node not found: "${validated.nodeId}". Verify the ID using search_xmind_nodes or parse_xmind first.`;
111
+ }
112
+ // Step 4: Extract the branch with depth limit
113
+ const { node: extractedNode, actualDepth, nodeCount } = extractBranch(targetNode, validated.depth);
114
+ debug('Branch extracted successfully', { nodeCount, actualDepth });
115
+ // Step 5: Format output as Markdown
116
+ const markdown = xmindToMarkdown({
117
+ filePath,
118
+ sheets: [
119
+ {
120
+ id: 'extracted',
121
+ title: 'Extracted Branch',
122
+ rootTopic: extractedNode,
123
+ },
124
+ ],
125
+ meta: {
126
+ formatVersion: parsed.meta?.formatVersion || 'zen',
127
+ topicCount: nodeCount,
128
+ parsedAt: new Date().toISOString(),
129
+ },
130
+ });
131
+ info('Branch extraction completed', { nodeCount, depth: actualDepth });
132
+ // Step 6: Return formatted results
133
+ const depthInfo = validated.depth ? `${actualDepth}/${validated.depth}` : `${actualDepth}/∞`;
134
+ return `Extracted ${nodeCount} nodes (depth: ${depthInfo})\n\n${markdown}`;
135
+ }
136
+ catch (err) {
137
+ // Step 7: Error handling with user-friendly messages
138
+ if (isXMindError(err)) {
139
+ warn('XMind error during branch extraction', { code: err.code, message: err.message });
140
+ return `Error: ${err.message}`;
141
+ }
142
+ if (err instanceof Error) {
143
+ logError('Unexpected error in get_xmind_node_branch', err);
144
+ return `Unexpected error: ${err.message}`;
145
+ }
146
+ logError('Unknown error in get_xmind_node_branch', err);
147
+ return 'Error: An unknown error occurred while extracting the branch.';
148
+ }
149
+ }
150
+ //# sourceMappingURL=branch-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-tool.js","sourceRoot":"","sources":["../../src/tools/branch-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Parse Tool - MCP tool for full document parsing.
3
+ * Parses XMind files (.xmind) and returns formatted output (Markdown or JSON).
4
+ * Includes token estimation and helpful suggestions for large documents.
5
+ */
6
+ import type { Tool } from '@modelcontextprotocol/sdk/types';
7
+ import { z } from 'zod';
8
+ import { ParseXMindInputSchema } from '../model/schemas.js';
9
+ /**
10
+ * Input type for parse_xmind tool.
11
+ * Requires absolute path to .xmind file and optional output format.
12
+ */
13
+ export type ParseToolInput = z.infer<typeof ParseXMindInputSchema>;
14
+ /**
15
+ * MCP Tool definition for parse_xmind.
16
+ * Enables full document parsing with format selection and output formatting.
17
+ */
18
+ export declare const PARSE_XMIND_TOOL: Tool;
19
+ /**
20
+ * Executes the parse_xmind tool.
21
+ *
22
+ * @param input - Tool input containing path and optional format
23
+ * @returns Formatted document output with metadata and token estimation
24
+ * @throws Error with user-friendly message if parsing fails
25
+ */
26
+ export declare function executeParseTool(input: ParseToolInput): Promise<string>;
27
+ //# sourceMappingURL=parse-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-tool.d.ts","sourceRoot":"","sources":["../../src/tools/parse-tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAQ5D;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEnE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,IAyB9B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAuF7E"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Parse Tool - MCP tool for full document parsing.
3
+ * Parses XMind files (.xmind) and returns formatted output (Markdown or JSON).
4
+ * Includes token estimation and helpful suggestions for large documents.
5
+ */
6
+ import { parseXMindFile } from '../core/parser.js';
7
+ import { xmindToMarkdown, getMarkdownTokenEstimate } from '../formatters/markdown-formatter.js';
8
+ import { xmindToJSON, getJSONTokenEstimate, getStructureSummary } from '../formatters/json-formatter.js';
9
+ import { resolveFilePath, validateXMindPath } from '../utils/file-utils.js';
10
+ import { isXMindError } from '../utils/errors.js';
11
+ import { info, warn, error as logError } from '../utils/logger.js';
12
+ /**
13
+ * MCP Tool definition for parse_xmind.
14
+ * Enables full document parsing with format selection and output formatting.
15
+ */
16
+ export const PARSE_XMIND_TOOL = {
17
+ name: 'parse_xmind',
18
+ description: 'Parse an entire XMind document (.xmind file) and return formatted output (Markdown or JSON). ' +
19
+ 'Markdown format is more token-efficient and recommended for large documents. ' +
20
+ 'JSON format includes structure summary and detailed metadata. ' +
21
+ 'Supports both Zen (modern) and Legacy (XMind 8) formats.',
22
+ inputSchema: {
23
+ type: 'object',
24
+ properties: {
25
+ path: {
26
+ type: 'string',
27
+ description: 'Absolute file path to the .xmind file. Supports ~ for home directory expansion.',
28
+ },
29
+ format: {
30
+ type: 'string',
31
+ enum: ['markdown', 'json'],
32
+ default: 'markdown',
33
+ description: 'Output format. "markdown" (default) is more token-efficient; "json" is more structured. ' +
34
+ 'Markdown recommended for large documents.',
35
+ },
36
+ },
37
+ required: ['path'],
38
+ },
39
+ };
40
+ /**
41
+ * Executes the parse_xmind tool.
42
+ *
43
+ * @param input - Tool input containing path and optional format
44
+ * @returns Formatted document output with metadata and token estimation
45
+ * @throws Error with user-friendly message if parsing fails
46
+ */
47
+ export async function executeParseTool(input) {
48
+ try {
49
+ // Step 1: Validate and resolve file path
50
+ info('parse_xmind tool invoked', { path: input.path, format: input.format || 'markdown' });
51
+ const resolvedPath = resolveFilePath(input.path);
52
+ await validateXMindPath(resolvedPath);
53
+ // Step 2: Parse the XMind file
54
+ const parsedResult = await parseXMindFile(resolvedPath);
55
+ info('File parsed successfully', { sheetCount: parsedResult.sheets.length });
56
+ // Step 3: Format output based on requested format
57
+ const format = input.format || 'markdown';
58
+ let formattedOutput;
59
+ let tokenInfo;
60
+ if (format === 'json') {
61
+ // JSON format with structure summary
62
+ const summary = getStructureSummary(parsedResult);
63
+ const jsonContent = xmindToJSON(parsedResult, false);
64
+ tokenInfo = getJSONTokenEstimate(jsonContent);
65
+ formattedOutput = [
66
+ '## JSON Format Output',
67
+ '',
68
+ '### Structure Summary',
69
+ '',
70
+ JSON.stringify(summary, null, 2),
71
+ '',
72
+ '### Full Content',
73
+ '',
74
+ jsonContent,
75
+ ].join('\n');
76
+ }
77
+ else {
78
+ // Markdown format (default, more token-efficient)
79
+ formattedOutput = xmindToMarkdown(parsedResult);
80
+ tokenInfo = getMarkdownTokenEstimate(formattedOutput);
81
+ }
82
+ // Step 4: Build result with token estimation and suggestions
83
+ const result = [
84
+ formattedOutput,
85
+ '',
86
+ '---',
87
+ '',
88
+ '## Parse Tool Metadata',
89
+ '',
90
+ `- **Format**: ${format}`,
91
+ `- **File**: ${resolvedPath}`,
92
+ `- **XMind Format**: ${parsedResult.meta?.formatVersion || 'unknown'}`,
93
+ `- **Sheets**: ${parsedResult.sheets.length}`,
94
+ `- **Total Topics**: ${parsedResult.meta?.topicCount || 0}`,
95
+ `- **Characters**: ${tokenInfo.characterCount}`,
96
+ `- **Estimated Tokens**: ${tokenInfo.estimatedTokens}`,
97
+ ];
98
+ // Add suggestion if content is large
99
+ if (tokenInfo.hint) {
100
+ result.push(`- **Suggestion**: ${tokenInfo.hint}`);
101
+ }
102
+ // Add recommendations for best practices
103
+ if (format === 'markdown' && tokenInfo.estimatedTokens > 20000) {
104
+ result.push('');
105
+ result.push('**For optimal context efficiency with large documents:**');
106
+ result.push('- Consider using the `search_xmind` tool to find specific topics');
107
+ result.push('- Use `get_branch` to extract relevant subtrees');
108
+ result.push('- Break analysis into smaller, focused queries');
109
+ }
110
+ return result.join('\n');
111
+ }
112
+ catch (err) {
113
+ // Step 5: Error handling with user-friendly messages
114
+ if (isXMindError(err)) {
115
+ warn('XMind parsing error', { code: err.code, message: err.message });
116
+ return `Error: ${err.message}`;
117
+ }
118
+ if (err instanceof Error) {
119
+ logError('Unexpected error in parse_xmind', err);
120
+ return `Error: ${err.message}`;
121
+ }
122
+ logError('Unknown error in parse_xmind', err);
123
+ return 'Error: An unknown error occurred while parsing the file.';
124
+ }
125
+ }
126
+ //# sourceMappingURL=parse-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-tool.js","sourceRoot":"","sources":["../../src/tools/parse-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * MCP Tool: search_xmind_nodes
3
+ * Search XMind nodes by keyword, label, or status marker.
4
+ */
5
+ import type { Tool } from '@modelcontextprotocol/sdk/types';
6
+ import { z } from 'zod';
7
+ import { SearchXMindInputSchema } from '../model/schemas.js';
8
+ /**
9
+ * Input type for search_xmind_nodes tool.
10
+ * Requires file path and search query, with optional field filtering and case sensitivity.
11
+ */
12
+ export type SearchToolInput = z.infer<typeof SearchXMindInputSchema>;
13
+ /**
14
+ * MCP Tool definition for search_xmind_nodes.
15
+ * Enables keyword/label/marker filtering with breadcrumb path resolution.
16
+ */
17
+ export declare const SEARCH_XMIND_TOOL: Tool;
18
+ /**
19
+ * Executes the search_xmind_nodes tool.
20
+ * Parses the file, searches all sheets, and returns formatted results with breadcrumb paths.
21
+ *
22
+ * @param input - Tool input containing path, query, and optional search parameters
23
+ * @returns Formatted search results or error message
24
+ * @throws Does not throw; returns user-friendly error messages
25
+ */
26
+ export declare function executeSearchTool(input: SearchToolInput): Promise<string>;
27
+ //# sourceMappingURL=search-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-tool.d.ts","sourceRoot":"","sources":["../../src/tools/search-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAK7D;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAErE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,IA+B/B,CAAC;AAmHF;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAgD/E"}