@augmnt-sh/mindcache 0.2.0 → 0.3.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/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/markdown.ts","../src/obsidian.ts","../src/utils/dates.ts","../src/tools/find.ts","../src/tools/read.ts","../src/templates.ts","../src/tools/remember.ts","../src/tools/journal.ts","../src/tools/write.ts","../src/tools/connect.ts","../src/tools/organize.ts","../src/tools/understand.ts","../src/tools/tasks.ts","../src/resources/index.ts","../src/utils/logger.ts","../src/server.ts","../src/config.ts","../src/cli.ts"],"names":["extractSection","content","heading","lines","capturing","headingLevel","result","line","headingMatch","level","text","replaceSection","newContent","skipping","parseFrontmatter","match","frontmatter","colonIdx","key","value","extractWikilinks","m","extractTags","matches","extractTasks","tasks","i","wordCount","body","w","ObsidianClient","config","existsSync","watch","_event","filename","notePath","resolved","join","filePath","dir","dirname","mkdirSync","results","entries","readdirSync","entry","fullPath","stat","statSync","t","query","fileName","mtime","contentLower","queryLower","tokens","matchPositions","score","pos","exactCount","start","end","tokensFound","token","count","coverage","idx","fileNameLower","ageDays","mdFiles","f","file","readFileSync","a","b","path","writeFileSync","appendFileSync","options","existing","updated","headingLower","insertIdx","j","nextMatch","unlinkSync","now","allFiles","relPath","relative","name","basename","extname","extension","contextLength","err","formatDate","date","y","d","today","startOfWeek","day","diff","weekDates","dates","parseDateRange","range","lower","thisWeekStart","lastWeekStart","lastWeekEnd","rangeMatch","daysMatch","registerFindTools","server","client","_config","z","formatted","contexts","question","topResults","notes","tags","links","truncated","l","outlinks","related","link","r","tag","noteName","backlinkResults","sorted","info","limit","from","to","fromStr","toStr","age","mins","hours","days","timeAgo","term","context","registerReadTools","section","words","k","v","dailyPath","__dirname","fileURLToPath","TEMPLATES_DIR","TEMPLATE_CACHE","loadTemplate","applyTemplate","template","variables","allVars","renderTemplate","registerRememberTools","title","folder","noteTitle","tagLine","noteContent","attendees","agenda","action_items","follow_up","decision","consequences","alternatives","idea","why","next_steps","concept","key_points","examples","application","source","role","organization","contact","interaction","url","summary","takeaways","thoughts","registerJournalTools","formattedEntry","task","formattedTask","todayContent","selected","response","p","registerWriteTools","overwrite","finalContent","registerConnectTools","target","linkLine","existingLinks","suggestions","reasons","word","files","existingNotes","gaps","sampleSize","sampled","sources","linked","orphans","registerOrganizeTools","existingTags","tagStr","tagYaml","fmEntries","properties","merged","old_path","new_path","destination","newPath","registerUnderstandTools","otherFiles","folderCounts","parts","topFolders","tagCounts","topTags","folders","tree","depth","indent","registerTaskTools","status","allTasks","displayed","targetLine","registerResources","uri","projectName","PREFIX","log","message","logError","logWarn","SERVER_VERSION","createServer","McpServer","DEFAULT_CONFIG","parseSimpleYaml","currentSection","rawLine","trimmed","findConfigFile","candidates","resolve","homedir","candidate","loadConfig","configPath","raw","parsed","daily","templates","inbox","HELP","prompt","rl","createInterface","answer","runInit","defaultVault","vault","dailyFolder","configContent","configDir","health","runDoctor","showConfig","startServer","nodeVersion","transport","StdioServerTransport","shutdown","command"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * Extract a section from markdown content by heading.\n * Returns content under the heading until the next heading of same or higher level.\n */\nexport function extractSection(content: string, heading: string): string | null {\n const lines = content.split('\\n');\n let capturing = false;\n let headingLevel = 0;\n const result: string[] = [];\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n\n if (headingMatch) {\n const level = headingMatch[1].length;\n const text = headingMatch[2].trim();\n\n if (capturing) {\n if (level <= headingLevel) break;\n result.push(line);\n } else if (text.toLowerCase() === heading.toLowerCase()) {\n capturing = true;\n headingLevel = level;\n result.push(line);\n }\n } else if (capturing) {\n result.push(line);\n }\n }\n\n return result.length > 0 ? result.join('\\n').trim() : null;\n}\n\n/**\n * Replace a section in markdown content by heading.\n */\nexport function replaceSection(content: string, heading: string, newContent: string): string {\n const lines = content.split('\\n');\n const result: string[] = [];\n let skipping = false;\n let headingLevel = 0;\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n\n if (headingMatch) {\n const level = headingMatch[1].length;\n const text = headingMatch[2].trim();\n\n if (skipping && level <= headingLevel) {\n skipping = false;\n result.push(line);\n } else if (text.toLowerCase() === heading.toLowerCase()) {\n skipping = true;\n headingLevel = level;\n result.push(line);\n result.push('');\n result.push(newContent);\n result.push('');\n } else {\n result.push(line);\n }\n } else if (!skipping) {\n result.push(line);\n }\n }\n\n return result.join('\\n');\n}\n\n/**\n * Parse YAML frontmatter from markdown content.\n */\nexport function parseFrontmatter(content: string): { frontmatter: Record<string, string>; body: string } {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) return { frontmatter: {}, body: content };\n\n const frontmatter: Record<string, string> = {};\n for (const line of match[1].split('\\n')) {\n const colonIdx = line.indexOf(':');\n if (colonIdx > 0) {\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n frontmatter[key] = value;\n }\n }\n\n return { frontmatter, body: match[2] };\n}\n\n/**\n * Extract all [[wikilinks]] from markdown content.\n */\nexport function extractWikilinks(content: string): string[] {\n const matches = content.matchAll(/\\[\\[([^\\]|]+)(?:\\|[^\\]]+)?\\]\\]/g);\n return [...matches].map(m => m[1]);\n}\n\n/**\n * Extract all #tags from markdown content.\n */\nexport function extractTags(content: string): string[] {\n const matches = content.matchAll(/(?:^|\\s)#([a-zA-Z0-9_/-]+)/g);\n return [...new Set([...matches].map(m => m[1]))];\n}\n\n/**\n * Extract all tasks (checkbox items) from markdown content.\n */\nexport function extractTasks(content: string): Array<{ text: string; done: boolean; line: number }> {\n const tasks: Array<{ text: string; done: boolean; line: number }> = [];\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/^[\\s]*-\\s+\\[([ xX])\\]\\s+(.+)$/);\n if (match) {\n tasks.push({\n text: match[2],\n done: match[1] !== ' ',\n line: i + 1,\n });\n }\n }\n\n return tasks;\n}\n\n/**\n * Count words in text (excluding frontmatter).\n */\nexport function wordCount(content: string): number {\n const { body } = parseFrontmatter(content);\n return body.split(/\\s+/).filter(w => w.length > 0).length;\n}\n","import { readFileSync, writeFileSync, appendFileSync, unlinkSync, existsSync, mkdirSync, readdirSync, statSync, watch } from 'fs';\nimport { join, relative, dirname, extname, basename } from 'path';\nimport { type MindCacheConfig } from '@/config.js';\nimport { extractSection, replaceSection } from '@/utils/markdown.js';\n\nexport interface SearchResult {\n filename: string;\n score: number;\n matches: Array<{\n match: { start: number; end: number };\n context: string;\n }>;\n}\n\nexport interface VaultFile {\n path: string;\n name: string;\n extension: string;\n mtime: number;\n}\n\n/**\n * Direct filesystem client for Obsidian vaults.\n * Reads and writes markdown files directly — no plugin required.\n */\nexport class ObsidianClient {\n private vaultPath: string;\n private fileCache: VaultFile[] | null = null;\n private fileCacheTime = 0;\n private readonly CACHE_TTL = 5000;\n private watcher: ReturnType<typeof watch> | null = null;\n\n constructor(config: MindCacheConfig) {\n this.vaultPath = config.vault;\n if (this.vaultPath && existsSync(this.vaultPath)) {\n this.startWatcher();\n }\n }\n\n /**\n * Watch the vault for changes and invalidate cache.\n */\n private startWatcher(): void {\n try {\n this.watcher = watch(this.vaultPath, { recursive: true }, (_event, filename) => {\n if (filename && !filename.startsWith('.')) {\n this.fileCache = null;\n }\n });\n this.watcher.on('error', () => {\n // Silently ignore watch errors — fall back to TTL cache\n });\n } catch {\n // Watching not supported — fall back to TTL cache\n }\n }\n\n private resolve(notePath: string): string {\n const resolved = join(this.vaultPath, notePath);\n if (!resolved.startsWith(this.vaultPath)) {\n throw new Error('Path traversal not allowed');\n }\n return resolved;\n }\n\n private ensureDir(filePath: string): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n /**\n * Walk the vault directory and collect all files with metadata.\n */\n private walkDir(dir: string): Array<{ fullPath: string; mtime: number }> {\n const results: Array<{ fullPath: string; mtime: number }> = [];\n let entries;\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n for (const entry of entries) {\n if (entry.name.startsWith('.')) continue;\n if (entry.name === 'node_modules') continue;\n\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n results.push(...this.walkDir(fullPath));\n } else {\n try {\n const stat = statSync(fullPath);\n results.push({ fullPath, mtime: stat.mtimeMs });\n } catch {\n results.push({ fullPath, mtime: 0 });\n }\n }\n }\n return results;\n }\n\n /**\n * Tokenize a query into individual words for multi-term matching.\n */\n private tokenize(text: string): string[] {\n return text.toLowerCase().split(/\\s+/).filter(t => t.length > 1);\n }\n\n /**\n * Score how well content matches a query.\n * Supports multi-word queries — each word is matched independently.\n * Boosts: title match, word frequency, recency.\n */\n private scoreMatch(query: string, content: string, fileName: string, mtime: number): {\n score: number;\n matchPositions: Array<{ start: number; end: number; context: string }>;\n } {\n const contentLower = content.toLowerCase();\n const queryLower = query.toLowerCase();\n const tokens = this.tokenize(query);\n const matchPositions: Array<{ start: number; end: number; context: string }> = [];\n\n let score = 0;\n\n // Exact phrase match — highest value\n const exactIdx = contentLower.indexOf(queryLower);\n if (exactIdx >= 0) {\n score += 100;\n let pos = 0;\n let exactCount = 0;\n while ((pos = contentLower.indexOf(queryLower, pos)) !== -1 && exactCount < 5) {\n const start = Math.max(0, pos - 80);\n const end = Math.min(content.length, pos + query.length + 80);\n matchPositions.push({\n start: pos,\n end: pos + query.length,\n context: content.slice(start, end).replace(/\\n/g, ' ').trim(),\n });\n pos += queryLower.length;\n exactCount++;\n }\n score += exactCount * 10;\n }\n\n // Individual word matches — for multi-word queries\n if (tokens.length > 1) {\n let tokensFound = 0;\n for (const token of tokens) {\n if (contentLower.includes(token)) {\n tokensFound++;\n // Count occurrences\n let pos = 0;\n let count = 0;\n while ((pos = contentLower.indexOf(token, pos)) !== -1) {\n count++;\n pos += token.length;\n }\n score += count * 3;\n }\n }\n // Bonus for having all/most tokens present\n const coverage = tokensFound / tokens.length;\n score += coverage * 50;\n\n // If no exact match but tokens found, extract context from first token match\n if (matchPositions.length === 0 && tokensFound > 0) {\n for (const token of tokens) {\n const idx = contentLower.indexOf(token);\n if (idx >= 0) {\n const start = Math.max(0, idx - 80);\n const end = Math.min(content.length, idx + token.length + 80);\n matchPositions.push({\n start: idx,\n end: idx + token.length,\n context: content.slice(start, end).replace(/\\n/g, ' ').trim(),\n });\n break;\n }\n }\n }\n }\n\n // Title/filename match boost\n const fileNameLower = fileName.toLowerCase();\n if (fileNameLower.includes(queryLower)) {\n score += 80;\n } else {\n for (const token of tokens) {\n if (fileNameLower.includes(token)) score += 25;\n }\n }\n\n // Recency boost — notes modified recently score higher\n const ageMs = Date.now() - mtime;\n const ageDays = ageMs / (1000 * 60 * 60 * 24);\n if (ageDays < 1) score += 20;\n else if (ageDays < 7) score += 10;\n else if (ageDays < 30) score += 5;\n\n return { score, matchPositions };\n }\n\n async ping(): Promise<boolean> {\n return existsSync(this.vaultPath);\n }\n\n /**\n * Search the vault with multi-word fuzzy matching and smart scoring.\n */\n async search(query: string): Promise<SearchResult[]> {\n const files = await this.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n const results: SearchResult[] = [];\n\n for (const file of mdFiles) {\n try {\n const content = readFileSync(this.resolve(file.path), 'utf-8');\n const { score, matchPositions } = this.scoreMatch(query, content, file.name, file.mtime);\n\n if (score > 0 && matchPositions.length > 0) {\n results.push({\n filename: file.path,\n score,\n matches: matchPositions.map(m => ({\n match: { start: m.start, end: m.end },\n context: m.context,\n })),\n });\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n return results.sort((a, b) => b.score - a.score);\n }\n\n async readNote(path: string): Promise<string> {\n const fullPath = this.resolve(path);\n if (!existsSync(fullPath)) {\n throw new Error(`Note not found: ${path}`);\n }\n return readFileSync(fullPath, 'utf-8');\n }\n\n async writeNote(path: string, content: string): Promise<void> {\n const fullPath = this.resolve(path);\n this.ensureDir(fullPath);\n writeFileSync(fullPath, content, 'utf-8');\n this.fileCache = null;\n }\n\n async appendToNote(path: string, content: string): Promise<void> {\n const fullPath = this.resolve(path);\n if (!existsSync(fullPath)) {\n throw new Error(`Note not found: ${path}`);\n }\n appendFileSync(fullPath, content, 'utf-8');\n }\n\n async patchNote(path: string, content: string, options?: {\n operation?: 'append' | 'prepend' | 'replace';\n targetHeading?: string;\n targetLine?: number;\n }): Promise<void> {\n const fullPath = this.resolve(path);\n const existing = readFileSync(fullPath, 'utf-8');\n\n if (options?.targetHeading) {\n const section = extractSection(existing, options.targetHeading);\n if (!section) {\n throw new Error(`Heading \"${options.targetHeading}\" not found`);\n }\n\n if (options.operation === 'replace') {\n const updated = replaceSection(existing, options.targetHeading, content);\n writeFileSync(fullPath, updated, 'utf-8');\n } else {\n const lines = existing.split('\\n');\n const headingLower = options.targetHeading.toLowerCase();\n let insertIdx = -1;\n\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/^#{1,6}\\s+(.+)$/);\n if (match && match[1].trim().toLowerCase() === headingLower) {\n const headingLevel = lines[i].indexOf(' ');\n insertIdx = i + 1;\n for (let j = i + 1; j < lines.length; j++) {\n const nextMatch = lines[j].match(/^(#{1,6})\\s/);\n if (nextMatch && nextMatch[1].length <= headingLevel) break;\n insertIdx = j + 1;\n }\n break;\n }\n }\n\n if (insertIdx >= 0) {\n lines.splice(insertIdx, 0, content);\n writeFileSync(fullPath, lines.join('\\n'), 'utf-8');\n } else {\n throw new Error(`Heading \"${options.targetHeading}\" not found`);\n }\n }\n } else if (options?.targetLine !== undefined) {\n const lines = existing.split('\\n');\n lines.splice(options.targetLine, 0, content);\n writeFileSync(fullPath, lines.join('\\n'), 'utf-8');\n } else {\n appendFileSync(fullPath, content, 'utf-8');\n }\n }\n\n async deleteNote(path: string): Promise<void> {\n const fullPath = this.resolve(path);\n if (!existsSync(fullPath)) {\n throw new Error(`Note not found: ${path}`);\n }\n unlinkSync(fullPath);\n this.fileCache = null;\n }\n\n /**\n * List all files in the vault, sorted by modification time (newest first).\n */\n async listFiles(): Promise<VaultFile[]> {\n const now = Date.now();\n if (this.fileCache && now - this.fileCacheTime < this.CACHE_TTL) {\n return this.fileCache;\n }\n\n const allFiles = this.walkDir(this.vaultPath);\n this.fileCache = allFiles\n .map(({ fullPath, mtime }) => {\n const relPath = relative(this.vaultPath, fullPath);\n const name = basename(relPath, extname(relPath));\n const extension = extname(relPath).slice(1);\n return { path: relPath, name, extension, mtime };\n })\n .sort((a, b) => b.mtime - a.mtime);\n\n this.fileCacheTime = now;\n return this.fileCache;\n }\n\n async getActiveNote(): Promise<string> {\n throw new Error('Active note detection requires Obsidian to be running. Use search or read_note instead.');\n }\n\n async getActiveNotePath(): Promise<string> {\n throw new Error('Active note detection requires Obsidian to be running. Use search or read_note instead.');\n }\n\n /**\n * Search with context around matches.\n */\n async searchWithContext(query: string, contextLength: number = 100): Promise<SearchResult[]> {\n const files = await this.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n const tokens = this.tokenize(query);\n const queryLower = query.toLowerCase();\n const results: SearchResult[] = [];\n\n for (const file of mdFiles) {\n try {\n const content = readFileSync(this.resolve(file.path), 'utf-8');\n const { score } = this.scoreMatch(query, content, file.name, file.mtime);\n\n if (score > 0) {\n // Re-extract with the requested context length\n const contentLower = content.toLowerCase();\n const matches: SearchResult['matches'] = [];\n\n // Try exact phrase first\n let pos = 0;\n while ((pos = contentLower.indexOf(queryLower, pos)) !== -1 && matches.length < 5) {\n const start = Math.max(0, pos - contextLength);\n const end = Math.min(content.length, pos + query.length + contextLength);\n matches.push({\n match: { start: pos, end: pos + query.length },\n context: content.slice(start, end).replace(/\\n/g, ' ').trim(),\n });\n pos += queryLower.length;\n }\n\n // Fall back to token matches if no exact phrase\n if (matches.length === 0) {\n for (const token of tokens) {\n const idx = contentLower.indexOf(token);\n if (idx >= 0 && matches.length < 3) {\n const start = Math.max(0, idx - contextLength);\n const end = Math.min(content.length, idx + token.length + contextLength);\n matches.push({\n match: { start: idx, end: idx + token.length },\n context: content.slice(start, end).replace(/\\n/g, ' ').trim(),\n });\n }\n }\n }\n\n if (matches.length > 0) {\n results.push({ filename: file.path, score, matches });\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n return results.sort((a, b) => b.score - a.score);\n }\n\n async health(): Promise<{ ok: boolean; error?: string; noteCount?: number }> {\n if (!this.vaultPath) {\n return { ok: false, error: 'No vault path configured. Run: mindcache init' };\n }\n if (!existsSync(this.vaultPath)) {\n return { ok: false, error: `Vault not found at: ${this.vaultPath}` };\n }\n\n try {\n const files = await this.listFiles();\n const mdCount = files.filter(f => f.extension === 'md').length;\n return { ok: true, noteCount: mdCount };\n } catch (err) {\n return { ok: false, error: `Cannot read vault: ${err instanceof Error ? err.message : String(err)}` };\n }\n }\n\n /**\n * Clean up the file watcher.\n */\n close(): void {\n if (this.watcher) {\n this.watcher.close();\n this.watcher = null;\n }\n }\n}\n","/**\n * Format a date as YYYY-MM-DD.\n */\nexport function formatDate(date: Date): string {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, '0');\n const d = String(date.getDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n}\n\n/**\n * Get today's date formatted.\n */\nexport function today(): string {\n return formatDate(new Date());\n}\n\n/**\n * Get the start of the current week (Monday).\n */\nexport function startOfWeek(date: Date = new Date()): Date {\n const d = new Date(date);\n const day = d.getDay();\n const diff = d.getDate() - day + (day === 0 ? -6 : 1);\n d.setDate(diff);\n d.setHours(0, 0, 0, 0);\n return d;\n}\n\n/**\n * Get dates for the current week (Mon-Sun).\n */\nexport function weekDates(date: Date = new Date()): string[] {\n const start = startOfWeek(date);\n const dates: string[] = [];\n for (let i = 0; i < 7; i++) {\n const d = new Date(start);\n d.setDate(start.getDate() + i);\n dates.push(formatDate(d));\n }\n return dates;\n}\n\n/**\n * Parse a date range string like \"last week\", \"this month\", \"2026-01-01 to 2026-01-31\".\n */\nexport function parseDateRange(range: string): { from: Date; to: Date } {\n const now = new Date();\n const lower = range.toLowerCase().trim();\n\n if (lower === 'today') {\n const start = new Date(now);\n start.setHours(0, 0, 0, 0);\n const end = new Date(now);\n end.setHours(23, 59, 59, 999);\n return { from: start, to: end };\n }\n\n if (lower === 'yesterday') {\n const start = new Date(now);\n start.setDate(start.getDate() - 1);\n start.setHours(0, 0, 0, 0);\n const end = new Date(start);\n end.setHours(23, 59, 59, 999);\n return { from: start, to: end };\n }\n\n if (lower === 'this week') {\n const start = startOfWeek(now);\n return { from: start, to: now };\n }\n\n if (lower === 'last week') {\n const thisWeekStart = startOfWeek(now);\n const lastWeekStart = new Date(thisWeekStart);\n lastWeekStart.setDate(lastWeekStart.getDate() - 7);\n const lastWeekEnd = new Date(thisWeekStart);\n lastWeekEnd.setMilliseconds(-1);\n return { from: lastWeekStart, to: lastWeekEnd };\n }\n\n if (lower === 'this month') {\n const start = new Date(now.getFullYear(), now.getMonth(), 1);\n return { from: start, to: now };\n }\n\n if (lower === 'last month') {\n const start = new Date(now.getFullYear(), now.getMonth() - 1, 1);\n const end = new Date(now.getFullYear(), now.getMonth(), 0, 23, 59, 59, 999);\n return { from: start, to: end };\n }\n\n // Try \"YYYY-MM-DD to YYYY-MM-DD\" format\n const rangeMatch = lower.match(/(\\d{4}-\\d{2}-\\d{2})\\s+to\\s+(\\d{4}-\\d{2}-\\d{2})/);\n if (rangeMatch) {\n return { from: new Date(rangeMatch[1]), to: new Date(rangeMatch[2]) };\n }\n\n // Try \"last N days\"\n const daysMatch = lower.match(/last\\s+(\\d+)\\s+days?/);\n if (daysMatch) {\n const start = new Date(now);\n start.setDate(start.getDate() - parseInt(daysMatch[1]));\n start.setHours(0, 0, 0, 0);\n return { from: start, to: now };\n }\n\n // Default: last 7 days\n const start = new Date(now);\n start.setDate(start.getDate() - 7);\n start.setHours(0, 0, 0, 0);\n return { from: start, to: now };\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { extractTags, extractWikilinks, parseFrontmatter } from '@/utils/markdown.js';\nimport { parseDateRange } from '@/utils/dates.js';\n\nexport function registerFindTools(server: McpServer, client: ObsidianClient, _config: MindCacheConfig): void {\n // ─── search ────────────────────────────────────────────────────────\n server.tool(\n 'search',\n 'Full-text search across your Obsidian vault. Supports Obsidian search operators: \"exact phrase\", path:folder, tag:#tag, file:filename. Returns matching notes with context snippets.',\n { query: z.string().describe('Search query — supports Obsidian search operators') },\n async ({ query }) => {\n try {\n const results = await client.searchWithContext(query, 200);\n if (results.length === 0) {\n return { content: [{ type: 'text', text: `No results found for \"${query}\"` }] };\n }\n\n const formatted = results.slice(0, 20).map((r, i) => {\n const contexts = r.matches.slice(0, 3).map(m => ` > ${m.context.trim()}`).join('\\n');\n return `${i + 1}. **${r.filename}** (score: ${r.score.toFixed(1)})\\n${contexts}`;\n }).join('\\n\\n');\n\n return {\n content: [{ type: 'text', text: `Found ${results.length} results for \"${query}\":\\n\\n${formatted}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Search error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── ask ───────────────────────────────────────────────────────────\n server.tool(\n 'ask',\n 'Ask a natural language question about your vault. Searches for relevant notes and returns their content so you can synthesize an answer. Use this when you need to understand what the user knows about a topic.',\n { question: z.string().describe('Natural language question to answer from vault knowledge') },\n async ({ question }) => {\n try {\n // Extract key terms and search\n const results = await client.searchWithContext(question, 300);\n if (results.length === 0) {\n return { content: [{ type: 'text', text: `No relevant notes found for: \"${question}\"` }] };\n }\n\n // Get content from top results\n const topResults = results.slice(0, 5);\n const notes: string[] = [];\n\n for (const result of topResults) {\n try {\n const content = await client.readNote(result.filename);\n const { frontmatter } = parseFrontmatter(content);\n const tags = extractTags(content);\n const links = extractWikilinks(content);\n\n // Truncate long notes\n const truncated = content.length > 2000 ? content.slice(0, 2000) + '\\n...(truncated)' : content;\n\n notes.push(\n `---\\n**${result.filename}**` +\n (tags.length > 0 ? ` | Tags: ${tags.map(t => `#${t}`).join(', ')}` : '') +\n (links.length > 0 ? ` | Links: ${links.map(l => `[[${l}]]`).join(', ')}` : '') +\n (frontmatter.type ? ` | Type: ${frontmatter.type}` : '') +\n `\\n\\n${truncated}`\n );\n } catch {\n // Skip notes that can't be read\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Found ${results.length} relevant notes for \"${question}\". Here are the top ${notes.length}:\\n\\n${notes.join('\\n\\n')}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Ask error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_related ──────────────────────────────────────────────────\n server.tool(\n 'find_related',\n 'Find notes related to a given note via backlinks, shared tags, or shared wikilinks. Returns notes that are connected in the knowledge graph.',\n { path: z.string().describe('Path to the note (e.g., \"Projects/My Project.md\")') },\n async ({ path }) => {\n try {\n const content = await client.readNote(path);\n const outlinks = extractWikilinks(content);\n const tags = extractTags(content);\n\n const related = new Map<string, { reason: string; score: number }>();\n\n // Find notes linked from this note\n for (const link of outlinks) {\n const results = await client.search(`file:${link}`);\n for (const r of results.slice(0, 3)) {\n if (r.filename !== path) {\n related.set(r.filename, {\n reason: `Linked from this note: [[${link}]]`,\n score: (related.get(r.filename)?.score ?? 0) + 2,\n });\n }\n }\n }\n\n // Find notes with shared tags\n for (const tag of tags.slice(0, 5)) {\n const results = await client.search(`tag:#${tag}`);\n for (const r of results.slice(0, 5)) {\n if (r.filename !== path) {\n const existing = related.get(r.filename);\n related.set(r.filename, {\n reason: existing ? `${existing.reason}; Shared tag: #${tag}` : `Shared tag: #${tag}`,\n score: (existing?.score ?? 0) + 1,\n });\n }\n }\n }\n\n // Find notes that link to this note (backlinks)\n const noteName = path.replace(/\\.md$/, '').split('/').pop() ?? path;\n const backlinkResults = await client.search(`\"[[${noteName}]]\"`);\n for (const r of backlinkResults) {\n if (r.filename !== path) {\n const existing = related.get(r.filename);\n related.set(r.filename, {\n reason: existing ? `${existing.reason}; Links to this note` : 'Links to this note',\n score: (existing?.score ?? 0) + 3,\n });\n }\n }\n\n const sorted = [...related.entries()]\n .sort((a, b) => b[1].score - a[1].score)\n .slice(0, 15);\n\n if (sorted.length === 0) {\n return { content: [{ type: 'text', text: `No related notes found for \"${path}\"` }] };\n }\n\n const formatted = sorted.map(([file, info], i) =>\n `${i + 1}. **${file}** — ${info.reason}`\n ).join('\\n');\n\n return {\n content: [{ type: 'text', text: `Related notes for \"${path}\":\\n\\n${formatted}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Find related error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_by_tag ───────────────────────────────────────────────────\n server.tool(\n 'find_by_tag',\n 'Find all notes with specific tags. Supports multiple tags (all must match). Use without # prefix.',\n {\n tags: z.array(z.string()).describe('Tags to search for (without # prefix, e.g., [\"project\", \"active\"])'),\n limit: z.number().optional().default(20).describe('Maximum number of results'),\n },\n async ({ tags, limit }) => {\n try {\n const query = tags.map(t => `tag:#${t}`).join(' ');\n const results = await client.search(query);\n\n if (results.length === 0) {\n return { content: [{ type: 'text', text: `No notes found with tags: ${tags.map(t => `#${t}`).join(', ')}` }] };\n }\n\n const formatted = results.slice(0, limit).map((r, i) =>\n `${i + 1}. ${r.filename}`\n ).join('\\n');\n\n return {\n content: [{ type: 'text', text: `Notes tagged ${tags.map(t => `#${t}`).join(', ')} (${results.length} total):\\n\\n${formatted}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Tag search error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_by_date ──────────────────────────────────────────────────\n server.tool(\n 'find_by_date',\n 'Find notes created or modified within a date range. Supports natural language like \"today\", \"this week\", \"last month\", \"last 7 days\", or explicit \"YYYY-MM-DD to YYYY-MM-DD\".',\n {\n range: z.string().describe('Date range — \"today\", \"this week\", \"last month\", \"last 30 days\", or \"YYYY-MM-DD to YYYY-MM-DD\"'),\n limit: z.number().optional().default(20).describe('Maximum results'),\n },\n async ({ range, limit }) => {\n try {\n const { from, to } = parseDateRange(range);\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n // Search for notes with dates in the range\n const fromStr = from.toISOString().split('T')[0];\n const toStr = to.toISOString().split('T')[0];\n\n // Use search to find notes mentioning dates in the range\n const results = await client.search(`\"${fromStr}\"`);\n\n const formatted = results.slice(0, limit).map((r, i) =>\n `${i + 1}. ${r.filename}`\n ).join('\\n');\n\n return {\n content: [{\n type: 'text',\n text: `Notes from ${fromStr} to ${toStr} (searched by date reference):\\n\\n` +\n (formatted || 'No notes found in this range.') +\n `\\n\\nTotal markdown files in vault: ${mdFiles.length}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Date search error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_recent ───────────────────────────────────────────────────\n server.tool(\n 'find_recent',\n 'Get recently modified notes in the vault, sorted by modification time (newest first).',\n {\n limit: z.number().optional().default(10).describe('Number of recent notes to return'),\n },\n async ({ limit }) => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n const recent = mdFiles.slice(0, limit);\n\n const formatted = recent.map((f, i) => {\n const age = Date.now() - f.mtime;\n const mins = Math.floor(age / 60000);\n const hours = Math.floor(mins / 60);\n const days = Math.floor(hours / 24);\n const timeAgo = days > 0 ? `${days}d ago` : hours > 0 ? `${hours}h ago` : `${mins}m ago`;\n return `${i + 1}. ${f.path} — ${timeAgo}`;\n }).join('\\n');\n\n return {\n content: [{\n type: 'text',\n text: `Recently modified notes (${mdFiles.length} total):\\n\\n${formatted}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Recent notes error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_mentions ─────────────────────────────────────────────────\n server.tool(\n 'find_mentions',\n 'Find all notes that mention a specific term, concept, or person. Searches for exact text matches across the vault.',\n {\n term: z.string().describe('Term or concept to search for'),\n limit: z.number().optional().default(20).describe('Maximum results'),\n },\n async ({ term, limit }) => {\n try {\n const results = await client.searchWithContext(term, 150);\n\n if (results.length === 0) {\n return { content: [{ type: 'text', text: `\"${term}\" is not mentioned in any notes.` }] };\n }\n\n const formatted = results.slice(0, limit).map((r, i) => {\n const context = r.matches[0]?.context?.trim() ?? '';\n return `${i + 1}. **${r.filename}**\\n > ${context}`;\n }).join('\\n\\n');\n\n return {\n content: [{ type: 'text', text: `\"${term}\" mentioned in ${results.length} notes:\\n\\n${formatted}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Mentions search error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { extractSection, parseFrontmatter, extractTags, extractWikilinks, wordCount } from '@/utils/markdown.js';\nimport { today, weekDates } from '@/utils/dates.js';\n\nexport function registerReadTools(server: McpServer, client: ObsidianClient, config: MindCacheConfig): void {\n // ─── read_note ─────────────────────────────────────────────────────\n server.tool(\n 'read_note',\n 'Read the full content of a note by its path. Returns the complete markdown including frontmatter.',\n { path: z.string().describe('Path to the note (e.g., \"Projects/My Project.md\")') },\n async ({ path }) => {\n try {\n const content = await client.readNote(path);\n return { content: [{ type: 'text', text: content }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not read \"${path}\": ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── read_section ──────────────────────────────────────────────────\n server.tool(\n 'read_section',\n 'Read a specific section from a note, identified by its heading. Returns content from the heading to the next heading of the same or higher level.',\n {\n path: z.string().describe('Path to the note'),\n heading: z.string().describe('Heading text to extract (e.g., \"Key Points\", \"Action Items\")'),\n },\n async ({ path, heading }) => {\n try {\n const content = await client.readNote(path);\n const section = extractSection(content, heading);\n\n if (!section) {\n return {\n content: [{ type: 'text', text: `No section \"${heading}\" found in \"${path}\"` }],\n };\n }\n\n return { content: [{ type: 'text', text: section }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not read section: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── read_summary ─────────────────────────────────────────────────\n server.tool(\n 'read_summary',\n 'Get a note with its metadata: frontmatter properties, tags, wikilinks, and word count. Useful for understanding a note without reading it fully.',\n { path: z.string().describe('Path to the note') },\n async ({ path }) => {\n try {\n const content = await client.readNote(path);\n const { frontmatter } = parseFrontmatter(content);\n const tags = extractTags(content);\n const links = extractWikilinks(content);\n const words = wordCount(content);\n\n const summary = [\n `**${path}**`,\n '',\n `**Words:** ${words}`,\n tags.length > 0 ? `**Tags:** ${tags.map(t => `#${t}`).join(', ')}` : null,\n links.length > 0 ? `**Links:** ${links.map(l => `[[${l}]]`).join(', ')}` : null,\n Object.keys(frontmatter).length > 0\n ? `**Properties:**\\n${Object.entries(frontmatter).map(([k, v]) => ` - ${k}: ${v}`).join('\\n')}`\n : null,\n '',\n '---',\n '',\n content,\n ].filter(Boolean).join('\\n');\n\n return { content: [{ type: 'text', text: summary }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not read summary: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── read_properties ──────────────────────────────────────────────\n server.tool(\n 'read_properties',\n 'Read only the YAML frontmatter properties of a note. Fast way to check metadata without reading the full content.',\n { path: z.string().describe('Path to the note') },\n async ({ path }) => {\n try {\n const content = await client.readNote(path);\n const { frontmatter } = parseFrontmatter(content);\n\n if (Object.keys(frontmatter).length === 0) {\n return { content: [{ type: 'text', text: `No frontmatter found in \"${path}\"` }] };\n }\n\n const formatted = Object.entries(frontmatter)\n .map(([k, v]) => `${k}: ${v}`)\n .join('\\n');\n\n return { content: [{ type: 'text', text: `Properties of \"${path}\":\\n\\n${formatted}` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not read properties: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── read_today ────────────────────────────────────────────────────\n server.tool(\n 'read_today',\n \"Read today's daily note. Returns the content of today's daily note based on your configured daily notes folder and format.\",\n {},\n async () => {\n try {\n const dailyPath = `${config.dailyNotes.folder}/${today()}.md`;\n const content = await client.readNote(dailyPath);\n return { content: [{ type: 'text', text: `**Today's Daily Note (${today()}):**\\n\\n${content}` }] };\n } catch {\n return {\n content: [{ type: 'text', text: `No daily note found for today (${today()}). Expected at: ${config.dailyNotes.folder}/${today()}.md` }],\n };\n }\n }\n );\n\n // ─── read_this_week ────────────────────────────────────────────────\n server.tool(\n 'read_this_week',\n \"Read all daily notes from the current week (Monday to Sunday). Useful for getting a weekly overview of activity.\",\n {},\n async () => {\n try {\n const dates = weekDates();\n const notes: string[] = [];\n\n for (const date of dates) {\n const path = `${config.dailyNotes.folder}/${date}.md`;\n try {\n const content = await client.readNote(path);\n notes.push(`## ${date}\\n\\n${content}`);\n } catch {\n // Skip missing daily notes\n }\n }\n\n if (notes.length === 0) {\n return { content: [{ type: 'text', text: `No daily notes found for this week (${dates[0]} to ${dates[6]}).` }] };\n }\n\n return {\n content: [{ type: 'text', text: `**This Week's Daily Notes:**\\n\\n${notes.join('\\n\\n---\\n\\n')}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not read weekly notes: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── get_active_note ───────────────────────────────────────────────\n server.tool(\n 'get_active_note',\n 'Get the currently active/open note in Obsidian. Returns both the path and content of the note the user is currently viewing.',\n {},\n async () => {\n try {\n const content = await client.getActiveNote();\n let path = '';\n try {\n path = await client.getActiveNotePath();\n } catch {\n // Path endpoint may not be available\n }\n\n return {\n content: [{\n type: 'text',\n text: path\n ? `**Active Note: ${path}**\\n\\n${content}`\n : `**Active Note:**\\n\\n${content}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not get active note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { today } from '@/utils/dates.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst TEMPLATES_DIR = join(__dirname, '..', 'templates');\n\nexport type TemplateName =\n | 'decision'\n | 'meeting'\n | 'learning'\n | 'idea'\n | 'person'\n | 'project'\n | 'book'\n | 'article'\n | 'weekly-review'\n | 'session';\n\nconst TEMPLATE_CACHE = new Map<string, string>();\n\n/**\n * Load a built-in template by name.\n */\nexport function loadTemplate(name: TemplateName): string {\n if (TEMPLATE_CACHE.has(name)) return TEMPLATE_CACHE.get(name)!;\n\n const path = join(TEMPLATES_DIR, `${name}.md`);\n if (!existsSync(path)) {\n throw new Error(`Template \"${name}\" not found at ${path}`);\n }\n\n const content = readFileSync(path, 'utf-8');\n TEMPLATE_CACHE.set(name, content);\n return content;\n}\n\n/**\n * Apply variables to a template string.\n * Variables are in {{variable}} format.\n */\nexport function applyTemplate(template: string, variables: Record<string, string>): string {\n let result = template;\n\n // Built-in variables\n const builtins: Record<string, string> = {\n date: today(),\n timestamp: new Date().toISOString(),\n year: String(new Date().getFullYear()),\n month: String(new Date().getMonth() + 1).padStart(2, '0'),\n day: String(new Date().getDate()).padStart(2, '0'),\n };\n\n const allVars = { ...builtins, ...variables };\n\n for (const [key, value] of Object.entries(allVars)) {\n result = result.replaceAll(`{{${key}}}`, value ?? '');\n }\n\n // Remove any remaining unresolved variables\n result = result.replace(/\\{\\{[^}]+\\}\\}/g, '');\n\n return result;\n}\n\n/**\n * Get a template and apply variables.\n */\nexport function renderTemplate(name: TemplateName, variables: Record<string, string> = {}): string {\n const template = loadTemplate(name);\n return applyTemplate(template, variables);\n}\n\n/**\n * List all available template names.\n */\nexport function listTemplates(): TemplateName[] {\n return [\n 'decision', 'meeting', 'learning', 'idea', 'person',\n 'project', 'book', 'article', 'weekly-review', 'session',\n ];\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { renderTemplate } from '@/templates.js';\nimport { today } from '@/utils/dates.js';\n\nexport function registerRememberTools(server: McpServer, client: ObsidianClient, config: MindCacheConfig): void {\n // ─── remember ──────────────────────────────────────────────────────\n server.tool(\n 'remember',\n 'Quick capture — save a thought, note, or piece of information to the vault. Auto-saves to the inbox folder. Use this for quick, unstructured captures.',\n {\n content: z.string().describe('The content to save'),\n title: z.string().optional().describe('Optional title for the note. If omitted, generates from content.'),\n tags: z.array(z.string()).optional().describe('Optional tags to add (without # prefix)'),\n folder: z.string().optional().describe('Optional folder to save to (defaults to inbox)'),\n },\n async ({ content, title, tags, folder }) => {\n try {\n const noteTitle = title ?? `Quick Note - ${today()} ${new Date().toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit' })}`;\n const targetFolder = folder ?? config.inbox.folder;\n const path = `${targetFolder}/${noteTitle}.md`;\n\n const tagLine = tags && tags.length > 0\n ? `tags:\\n${tags.map(t => ` - ${t}`).join('\\n')}`\n : 'tags:\\n - inbox';\n\n const noteContent = `---\\ndate: ${today()}\\n${tagLine}\\n---\\n\\n${content}\\n`;\n\n await client.writeNote(path, noteContent);\n\n return {\n content: [{ type: 'text', text: `Saved to \"${path}\"` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not save note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── remember_meeting ──────────────────────────────────────────────\n server.tool(\n 'remember_meeting',\n 'Create a structured meeting note with attendees, agenda, notes, and action items. Uses the meeting template.',\n {\n title: z.string().describe('Meeting title'),\n attendees: z.string().describe('Comma-separated list of attendees'),\n agenda: z.string().optional().default('').describe('Meeting agenda'),\n notes: z.string().optional().default('').describe('Meeting notes'),\n action_items: z.string().optional().default('').describe('Action items from the meeting'),\n follow_up: z.string().optional().default('').describe('Follow-up items'),\n folder: z.string().optional().describe('Folder to save to (defaults to inbox)'),\n },\n async ({ title, attendees, agenda, notes, action_items, follow_up, folder }) => {\n try {\n const content = renderTemplate('meeting', {\n title, attendees, agenda, notes, action_items, follow_up,\n });\n const targetFolder = folder ?? config.inbox.folder;\n const path = `${targetFolder}/${title}.md`;\n await client.writeNote(path, content);\n\n return { content: [{ type: 'text', text: `Meeting note created at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not create meeting note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── remember_decision ─────────────────────────────────────────────\n server.tool(\n 'remember_decision',\n 'Log a decision using the ADR (Architecture Decision Record) format. Captures the context, decision, consequences, and alternatives considered.',\n {\n title: z.string().describe('Decision title'),\n context: z.string().describe('Why this decision needed to be made'),\n decision: z.string().describe('What was decided'),\n consequences: z.string().optional().default('').describe('What happens as a result'),\n alternatives: z.string().optional().default('').describe('Other options that were considered'),\n related: z.string().optional().default('').describe('Related notes or concepts'),\n folder: z.string().optional().describe('Folder to save to'),\n },\n async ({ title, context, decision, consequences, alternatives, related, folder }) => {\n try {\n const content = renderTemplate('decision', {\n title, context, decision, consequences, alternatives, related,\n });\n const targetFolder = folder ?? config.inbox.folder;\n const path = `${targetFolder}/${title}.md`;\n await client.writeNote(path, content);\n\n return { content: [{ type: 'text', text: `Decision logged at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not log decision: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── remember_idea ─────────────────────────────────────────────────\n server.tool(\n 'remember_idea',\n 'Capture an idea with context on why it matters and potential next steps.',\n {\n title: z.string().describe('Idea title'),\n idea: z.string().describe('Description of the idea'),\n why: z.string().optional().default('').describe('Why this idea matters'),\n next_steps: z.string().optional().default('').describe('Potential next steps'),\n related: z.string().optional().default('').describe('Related notes or concepts'),\n tags: z.array(z.string()).optional().describe('Additional tags'),\n folder: z.string().optional().describe('Folder to save to'),\n },\n async ({ title, idea, why, next_steps, related, folder }) => {\n try {\n const content = renderTemplate('idea', {\n title, idea, why, next_steps, related,\n });\n const targetFolder = folder ?? config.inbox.folder;\n const path = `${targetFolder}/${title}.md`;\n await client.writeNote(path, content);\n\n return { content: [{ type: 'text', text: `Idea captured at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not capture idea: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── remember_learning ─────────────────────────────────────────────\n server.tool(\n 'remember_learning',\n 'Save something new you learned — a concept, technique, insight, or skill with examples and application notes.',\n {\n title: z.string().describe('What was learned'),\n concept: z.string().describe('The concept or insight'),\n key_points: z.string().optional().default('').describe('Key points to remember'),\n examples: z.string().optional().default('').describe('Examples or illustrations'),\n application: z.string().optional().default('').describe('How to apply this learning'),\n source: z.string().optional().default('').describe('Where you learned this'),\n related: z.string().optional().default('').describe('Related notes'),\n folder: z.string().optional().describe('Folder to save to'),\n },\n async ({ title, concept, key_points, examples, application, source, related, folder }) => {\n try {\n const content = renderTemplate('learning', {\n title, concept, key_points, examples, application, source, related,\n });\n const targetFolder = folder ?? config.inbox.folder;\n const path = `${targetFolder}/${title}.md`;\n await client.writeNote(path, content);\n\n return { content: [{ type: 'text', text: `Learning saved at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not save learning: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── remember_person ───────────────────────────────────────────────\n server.tool(\n 'remember_person',\n 'Create or update a note about a person — their role, organization, context, and interactions.',\n {\n name: z.string().describe('Person\\'s name'),\n role: z.string().optional().default('').describe('Their role or title'),\n organization: z.string().optional().default('').describe('Their organization'),\n contact: z.string().optional().default('').describe('Contact information'),\n context: z.string().optional().default('').describe('How you know them or relevant context'),\n interaction: z.string().optional().default('').describe('Notes from recent interaction'),\n notes: z.string().optional().default('').describe('Additional notes'),\n folder: z.string().optional().describe('Folder to save to'),\n },\n async ({ name, role, organization, contact, context, interaction, notes, folder }) => {\n try {\n const content = renderTemplate('person', {\n name, role, organization, contact, context, interaction, notes,\n });\n const targetFolder = folder ?? config.inbox.folder;\n const path = `${targetFolder}/${name}.md`;\n await client.writeNote(path, content);\n\n return { content: [{ type: 'text', text: `Person note created at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not create person note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── remember_reference ────────────────────────────────────────────\n server.tool(\n 'remember_reference',\n 'Bookmark a URL or resource with a summary, tags, and personal notes. Great for saving articles, videos, tools, or documentation.',\n {\n title: z.string().describe('Title of the resource'),\n url: z.string().describe('URL of the resource'),\n source: z.string().optional().default('').describe('Source (e.g., \"Hacker News\", \"Twitter\")'),\n summary: z.string().optional().default('').describe('Brief summary'),\n takeaways: z.string().optional().default('').describe('Key takeaways'),\n thoughts: z.string().optional().default('').describe('Your personal thoughts'),\n related: z.string().optional().default('').describe('Related notes'),\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\n folder: z.string().optional().describe('Folder to save to'),\n },\n async ({ title, url, source, summary, takeaways, thoughts, related, folder }) => {\n try {\n const content = renderTemplate('article', {\n title, url, source, summary, takeaways, thoughts, related,\n });\n const targetFolder = folder ?? config.inbox.folder;\n const path = `${targetFolder}/${title}.md`;\n await client.writeNote(path, content);\n\n return { content: [{ type: 'text', text: `Reference saved at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not save reference: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { today } from '@/utils/dates.js';\n\nexport function registerJournalTools(server: McpServer, client: ObsidianClient, config: MindCacheConfig): void {\n // ─── log ───────────────────────────────────────────────────────────\n server.tool(\n 'log',\n \"Append an entry to today's daily note. Creates the daily note if it doesn't exist. Adds entries under a configurable heading with timestamps.\",\n {\n entry: z.string().describe('The entry to add to the daily note'),\n heading: z.string().optional().default('Log').describe('Heading to add the entry under (default: \"Log\")'),\n },\n async ({ entry, heading }) => {\n try {\n const dailyPath = `${config.dailyNotes.folder}/${today()}.md`;\n const time = new Date().toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n });\n const formattedEntry = `\\n- ${time} — ${entry}`;\n\n // Try to append to existing note\n try {\n await client.readNote(dailyPath);\n // Note exists, append under the heading\n try {\n await client.patchNote(dailyPath, formattedEntry, {\n operation: 'append',\n targetHeading: heading,\n });\n } catch {\n // Heading might not exist, just append to end\n await client.appendToNote(dailyPath, `\\n## ${heading}\\n${formattedEntry}\\n`);\n }\n } catch {\n // Note doesn't exist, create it\n const content = `---\\ndate: ${today()}\\ntags:\\n - daily\\n---\\n\\n# ${today()}\\n\\n## ${heading}\\n${formattedEntry}\\n`;\n await client.writeNote(dailyPath, content);\n }\n\n return {\n content: [{ type: 'text', text: `Logged to daily note (${today()}): ${entry}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not log entry: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── log_task ──────────────────────────────────────────────────────\n server.tool(\n 'log_task',\n \"Add a task (checkbox item) to today's daily note. Creates the daily note if it doesn't exist.\",\n {\n task: z.string().describe('The task description'),\n heading: z.string().optional().default('Tasks').describe('Heading to add the task under (default: \"Tasks\")'),\n },\n async ({ task, heading }) => {\n try {\n const dailyPath = `${config.dailyNotes.folder}/${today()}.md`;\n const formattedTask = `\\n- [ ] ${task}`;\n\n try {\n await client.readNote(dailyPath);\n try {\n await client.patchNote(dailyPath, formattedTask, {\n operation: 'append',\n targetHeading: heading,\n });\n } catch {\n await client.appendToNote(dailyPath, `\\n## ${heading}\\n${formattedTask}\\n`);\n }\n } catch {\n const content = `---\\ndate: ${today()}\\ntags:\\n - daily\\n---\\n\\n# ${today()}\\n\\n## ${heading}\\n${formattedTask}\\n`;\n await client.writeNote(dailyPath, content);\n }\n\n return {\n content: [{ type: 'text', text: `Task added to daily note: ${task}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not add task: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── reflect ───────────────────────────────────────────────────────\n server.tool(\n 'reflect',\n \"Generate reflection prompts based on recent vault activity. Reads today's and recent daily notes to suggest areas for reflection.\",\n {},\n async () => {\n try {\n // Try to read today's daily note for context\n let todayContent = '';\n try {\n const dailyPath = `${config.dailyNotes.folder}/${today()}.md`;\n todayContent = await client.readNote(dailyPath);\n } catch {\n // No daily note today\n }\n\n // Search for recent activity\n const recentFiles = await client.listFiles();\n const mdFiles = recentFiles.filter(f => f.extension === 'md');\n\n const prompts = [\n \"What was the most important thing you learned today?\",\n \"What decision did you make that you want to remember?\",\n \"What are you most proud of from today's work?\",\n \"What would you do differently next time?\",\n \"What's one thing you want to explore further?\",\n \"Who helped you today, and how?\",\n \"What's blocking you right now?\",\n \"What's one thing you're grateful for today?\",\n ];\n\n // Pick 3-4 relevant prompts\n const selected = prompts.sort(() => Math.random() - 0.5).slice(0, 4);\n\n let response = `**Reflection Prompts for ${today()}:**\\n\\n`;\n response += selected.map((p, i) => `${i + 1}. ${p}`).join('\\n');\n\n if (todayContent) {\n response += `\\n\\n---\\n\\n**Today's note preview:**\\n${todayContent.slice(0, 500)}`;\n }\n\n response += `\\n\\n---\\n\\nVault stats: ${mdFiles.length} notes total.`;\n response += '\\n\\nTip: Use `log` to add your reflections to today\\'s daily note.';\n\n return { content: [{ type: 'text', text: response }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Reflection error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { renderTemplate } from '@/templates.js';\nimport { replaceSection } from '@/utils/markdown.js';\n\nexport function registerWriteTools(server: McpServer, client: ObsidianClient, _config: MindCacheConfig): void {\n // ─── create_note ───────────────────────────────────────────────────\n server.tool(\n 'create_note',\n 'Create a new note in the vault. Supports optional templates, folder routing, and frontmatter. Will not overwrite existing notes unless explicitly requested.',\n {\n path: z.string().describe('Path for the new note (e.g., \"Projects/My Project.md\")'),\n content: z.string().describe('Markdown content for the note'),\n template: z.enum(['decision', 'meeting', 'learning', 'idea', 'person', 'project', 'book', 'article', 'weekly-review', 'session']).optional().describe('Optional template to use'),\n variables: z.record(z.string()).optional().describe('Template variables as key-value pairs'),\n overwrite: z.boolean().optional().default(false).describe('Whether to overwrite if note already exists'),\n },\n async ({ path, content, template, variables, overwrite }) => {\n try {\n // Check if note exists\n if (!overwrite) {\n try {\n await client.readNote(path);\n return {\n content: [{ type: 'text', text: `Note already exists at \"${path}\". Set overwrite=true to replace it.` }],\n };\n } catch {\n // Note doesn't exist, proceed\n }\n }\n\n let finalContent = content;\n if (template) {\n finalContent = renderTemplate(template, { ...variables, content });\n }\n\n await client.writeNote(path, finalContent);\n\n return { content: [{ type: 'text', text: `Note created at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not create note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── append_to_note ────────────────────────────────────────────────\n server.tool(\n 'append_to_note',\n 'Append content to the end of an existing note. The note must already exist.',\n {\n path: z.string().describe('Path to the note to append to'),\n content: z.string().describe('Content to append'),\n },\n async ({ path, content }) => {\n try {\n await client.appendToNote(path, `\\n${content}\\n`);\n return { content: [{ type: 'text', text: `Content appended to \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not append to note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── update_section ────────────────────────────────────────────────\n server.tool(\n 'update_section',\n 'Replace the content under a specific heading in a note. Useful for updating a section without modifying the rest of the note.',\n {\n path: z.string().describe('Path to the note'),\n heading: z.string().describe('Heading text of the section to replace'),\n content: z.string().describe('New content for the section'),\n },\n async ({ path, heading, content }) => {\n try {\n const noteContent = await client.readNote(path);\n const updated = replaceSection(noteContent, heading, content);\n await client.writeNote(path, updated);\n\n return { content: [{ type: 'text', text: `Section \"${heading}\" updated in \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not update section: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { extractWikilinks, extractTags } from '@/utils/markdown.js';\n\nexport function registerConnectTools(server: McpServer, client: ObsidianClient, _config: MindCacheConfig): void {\n // ─── add_link ──────────────────────────────────────────────────────\n server.tool(\n 'add_link',\n 'Add a [[wikilink]] to a note, connecting it to another note in the vault. Appends the link under a \"Related\" heading or at the end of the note.',\n {\n path: z.string().describe('Path of the note to add the link to'),\n target: z.string().describe('Name of the note to link to (without .md extension)'),\n context: z.string().optional().describe('Optional context for why these notes are related'),\n },\n async ({ path, target, context }) => {\n try {\n const content = await client.readNote(path);\n const existingLinks = extractWikilinks(content);\n\n if (existingLinks.includes(target)) {\n return {\n content: [{ type: 'text', text: `\"${path}\" already links to [[${target}]]` }],\n };\n }\n\n const linkLine = context\n ? `\\n- [[${target}]] — ${context}`\n : `\\n- [[${target}]]`;\n\n // Try to append under \"Related\" heading\n try {\n await client.patchNote(path, linkLine, {\n operation: 'append',\n targetHeading: 'Related',\n });\n } catch {\n // No \"Related\" heading, append to end\n await client.appendToNote(path, `\\n## Related\\n${linkLine}\\n`);\n }\n\n return {\n content: [{ type: 'text', text: `Added link to [[${target}]] in \"${path}\"` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not add link: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── suggest_connections ───────────────────────────────────────────\n server.tool(\n 'suggest_connections',\n 'Analyze a note and suggest other notes that could be linked to it. Uses shared tags, mentions, and content similarity to find connections.',\n {\n path: z.string().describe('Path to the note to analyze'),\n limit: z.number().optional().default(10).describe('Maximum suggestions to return'),\n },\n async ({ path, limit }) => {\n try {\n const content = await client.readNote(path);\n const existingLinks = extractWikilinks(content);\n const tags = extractTags(content);\n\n const suggestions = new Map<string, string[]>();\n\n // Find notes with shared tags\n for (const tag of tags.slice(0, 5)) {\n try {\n const results = await client.search(`tag:#${tag}`);\n for (const r of results) {\n if (r.filename !== path && !existingLinks.includes(r.filename.replace(/\\.md$/, ''))) {\n const reasons = suggestions.get(r.filename) ?? [];\n reasons.push(`Shared tag: #${tag}`);\n suggestions.set(r.filename, reasons);\n }\n }\n } catch {\n // Skip failed searches\n }\n }\n\n // Find notes with similar content (search using key phrases)\n const words = content.split(/\\s+/).filter(w => w.length > 5).slice(0, 10);\n for (const word of words.slice(0, 3)) {\n try {\n const results = await client.search(word);\n for (const r of results.slice(0, 5)) {\n if (r.filename !== path && !existingLinks.includes(r.filename.replace(/\\.md$/, ''))) {\n const reasons = suggestions.get(r.filename) ?? [];\n if (!reasons.some(r => r.startsWith('Mentions:'))) {\n reasons.push(`Mentions: \"${word}\"`);\n suggestions.set(r.filename, reasons);\n }\n }\n }\n } catch {\n // Skip failed searches\n }\n }\n\n const sorted = [...suggestions.entries()]\n .sort((a, b) => b[1].length - a[1].length)\n .slice(0, limit);\n\n if (sorted.length === 0) {\n return {\n content: [{ type: 'text', text: `No connection suggestions found for \"${path}\". The note may be well-connected already!` }],\n };\n }\n\n const formatted = sorted.map(([file, reasons], i) =>\n `${i + 1}. **${file}**\\n ${reasons.join(', ')}`\n ).join('\\n\\n');\n\n return {\n content: [{\n type: 'text',\n text: `Suggested connections for \"${path}\":\\n\\n${formatted}\\n\\nUse \\`add_link\\` to connect any of these notes.`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not suggest connections: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_gaps ─────────────────────────────────────────────────────\n server.tool(\n 'find_gaps',\n 'Find broken links in the vault — [[wikilinks]] that point to notes that don\\'t exist. These represent knowledge gaps or notes waiting to be written.',\n {\n limit: z.number().optional().default(20).describe('Maximum gaps to return'),\n },\n async ({ limit }) => {\n try {\n const files = await client.listFiles();\n const existingNotes = new Set(\n files.filter(f => f.extension === 'md').map(f => f.name.toLowerCase())\n );\n\n const gaps = new Map<string, string[]>();\n\n // Sample notes to find broken links\n const mdFiles = files.filter(f => f.extension === 'md');\n const sampleSize = Math.min(mdFiles.length, 100);\n const sampled = mdFiles.sort(() => Math.random() - 0.5).slice(0, sampleSize);\n\n for (const file of sampled) {\n try {\n const content = await client.readNote(file.path);\n const links = extractWikilinks(content);\n\n for (const link of links) {\n if (!existingNotes.has(link.toLowerCase())) {\n const sources = gaps.get(link) ?? [];\n sources.push(file.path);\n gaps.set(link, sources);\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n const sorted = [...gaps.entries()]\n .sort((a, b) => b[1].length - a[1].length)\n .slice(0, limit);\n\n if (sorted.length === 0) {\n return {\n content: [{ type: 'text', text: `No broken links found (sampled ${sampleSize} of ${mdFiles.length} notes).` }],\n };\n }\n\n const formatted = sorted.map(([link, sources], i) =>\n `${i + 1}. **[[${link}]]** — referenced by ${sources.length} note(s): ${sources.slice(0, 3).join(', ')}${sources.length > 3 ? '...' : ''}`\n ).join('\\n');\n\n return {\n content: [{\n type: 'text',\n text: `Knowledge gaps (broken links) found in vault:\\n\\n${formatted}\\n\\nThese are concepts referenced but not yet written about. Use \\`create_note\\` to fill them in.`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not find gaps: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_orphans ──────────────────────────────────────────────────\n server.tool(\n 'find_orphans',\n 'Find orphan notes — notes with no incoming or outgoing links. These are disconnected from the knowledge graph and might need connecting.',\n {\n limit: z.number().optional().default(20).describe('Maximum orphans to return'),\n },\n async ({ limit }) => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n // Build a set of all notes that are linked to or link out\n const linked = new Set<string>();\n const sampleSize = Math.min(mdFiles.length, 100);\n const sampled = mdFiles.sort(() => Math.random() - 0.5).slice(0, sampleSize);\n\n for (const file of sampled) {\n try {\n const content = await client.readNote(file.path);\n const outlinks = extractWikilinks(content);\n\n if (outlinks.length > 0) {\n linked.add(file.path);\n for (const link of outlinks) {\n // Find the actual file path for this link\n const target = mdFiles.find(f => f.name.toLowerCase() === link.toLowerCase());\n if (target) linked.add(target.path);\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n const orphans = sampled\n .filter(f => !linked.has(f.path))\n .slice(0, limit);\n\n if (orphans.length === 0) {\n return {\n content: [{ type: 'text', text: `No orphan notes found (sampled ${sampleSize} notes). Your vault is well-connected!` }],\n };\n }\n\n const formatted = orphans.map((f, i) =>\n `${i + 1}. ${f.path}`\n ).join('\\n');\n\n return {\n content: [{\n type: 'text',\n text: `Orphan notes (no links in or out):\\n\\n${formatted}\\n\\nConsider linking these to related notes using \\`add_link\\` or \\`suggest_connections\\`.`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not find orphans: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { parseFrontmatter } from '@/utils/markdown.js';\n\nexport function registerOrganizeTools(server: McpServer, client: ObsidianClient, _config: MindCacheConfig): void {\n // ─── add_tag ───────────────────────────────────────────────────────\n server.tool(\n 'add_tag',\n 'Add one or more tags to a note. Tags are added to the YAML frontmatter. If the note has no frontmatter, it will be created.',\n {\n path: z.string().describe('Path to the note'),\n tags: z.array(z.string()).describe('Tags to add (without # prefix)'),\n },\n async ({ path, tags }) => {\n try {\n const content = await client.readNote(path);\n const { frontmatter, body } = parseFrontmatter(content);\n\n // Parse existing tags\n const existingTags: string[] = [];\n if (frontmatter.tags) {\n // Handle both comma-separated and array-like formats\n const tagStr = frontmatter.tags;\n if (tagStr.startsWith('[')) {\n existingTags.push(...tagStr.slice(1, -1).split(',').map(t => t.trim()));\n } else {\n existingTags.push(tagStr);\n }\n }\n\n const allTags = [...new Set([...existingTags, ...tags])];\n const tagYaml = allTags.map(t => ` - ${t}`).join('\\n');\n\n // Rebuild frontmatter\n const fmEntries = Object.entries(frontmatter)\n .filter(([k]) => k !== 'tags')\n .map(([k, v]) => `${k}: ${v}`)\n .join('\\n');\n\n const newContent = `---\\n${fmEntries}${fmEntries ? '\\n' : ''}tags:\\n${tagYaml}\\n---\\n\\n${body}`;\n await client.writeNote(path, newContent);\n\n return {\n content: [{ type: 'text', text: `Added tags ${tags.map(t => `#${t}`).join(', ')} to \"${path}\"` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not add tags: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── update_properties ─────────────────────────────────────────────\n server.tool(\n 'update_properties',\n 'Update YAML frontmatter properties of a note. Can add new properties or modify existing ones.',\n {\n path: z.string().describe('Path to the note'),\n properties: z.record(z.string()).describe('Properties to set as key-value pairs (e.g., {\"status\": \"done\", \"priority\": \"high\"})'),\n },\n async ({ path, properties }) => {\n try {\n const content = await client.readNote(path);\n const { frontmatter, body } = parseFrontmatter(content);\n\n const merged = { ...frontmatter, ...properties };\n const fmYaml = Object.entries(merged)\n .map(([k, v]) => `${k}: ${v}`)\n .join('\\n');\n\n const newContent = `---\\n${fmYaml}\\n---\\n\\n${body}`;\n await client.writeNote(path, newContent);\n\n const updated = Object.entries(properties)\n .map(([k, v]) => `${k}: ${v}`)\n .join(', ');\n\n return {\n content: [{ type: 'text', text: `Updated properties in \"${path}\": ${updated}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not update properties: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── rename_note ───────────────────────────────────────────────────\n server.tool(\n 'rename_note',\n 'Rename a note by creating a copy at the new path and deleting the original. Note: Obsidian will update backlinks if the app is running.',\n {\n old_path: z.string().describe('Current path of the note'),\n new_path: z.string().describe('New path for the note'),\n },\n async ({ old_path, new_path }) => {\n try {\n const content = await client.readNote(old_path);\n\n // Check if target exists\n try {\n await client.readNote(new_path);\n return {\n content: [{ type: 'text', text: `A note already exists at \"${new_path}\". Choose a different name.` }],\n };\n } catch {\n // Target doesn't exist, proceed\n }\n\n await client.writeNote(new_path, content);\n await client.deleteNote(old_path);\n\n return {\n content: [{ type: 'text', text: `Renamed \"${old_path}\" to \"${new_path}\"` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not rename note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── move_note ─────────────────────────────────────────────────────\n server.tool(\n 'move_note',\n 'Move a note to a different folder in the vault. Preserves the filename.',\n {\n path: z.string().describe('Current path of the note'),\n destination: z.string().describe('Destination folder (e.g., \"Projects\", \"Archive\")'),\n },\n async ({ path, destination }) => {\n try {\n const content = await client.readNote(path);\n const filename = path.split('/').pop() ?? path;\n const newPath = `${destination}/${filename}`;\n\n // Check if target exists\n try {\n await client.readNote(newPath);\n return {\n content: [{ type: 'text', text: `A note already exists at \"${newPath}\". Rename the note first.` }],\n };\n } catch {\n // Target doesn't exist, proceed\n }\n\n await client.writeNote(newPath, content);\n await client.deleteNote(path);\n\n return {\n content: [{ type: 'text', text: `Moved \"${path}\" to \"${newPath}\"` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not move note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { extractTags } from '@/utils/markdown.js';\n\nexport function registerUnderstandTools(server: McpServer, client: ObsidianClient, _config: MindCacheConfig): void {\n // ─── vault_overview ────────────────────────────────────────────────\n server.tool(\n 'vault_overview',\n 'Get an overview of your Obsidian vault: total notes, folder structure, tag distribution, and general statistics.',\n {},\n async () => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n const otherFiles = files.filter(f => f.extension !== 'md');\n\n // Count files per folder\n const folderCounts = new Map<string, number>();\n for (const file of mdFiles) {\n const parts = file.path.split('/');\n const folder = parts.length > 1 ? parts.slice(0, -1).join('/') : '(root)';\n folderCounts.set(folder, (folderCounts.get(folder) ?? 0) + 1);\n }\n\n const topFolders = [...folderCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 15);\n\n // Sample tags from recent notes\n const tagCounts = new Map<string, number>();\n const sampleSize = Math.min(mdFiles.length, 50);\n const sampled = mdFiles.slice(0, sampleSize);\n\n for (const file of sampled) {\n try {\n const content = await client.readNote(file.path);\n const tags = extractTags(content);\n for (const tag of tags) {\n tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n const topTags = [...tagCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 15);\n\n let response = `**Vault Overview**\\n\\n`;\n response += `- **Total notes:** ${mdFiles.length}\\n`;\n response += `- **Other files:** ${otherFiles.length} (images, PDFs, etc.)\\n`;\n response += `- **Folders:** ${folderCounts.size}\\n\\n`;\n\n response += `**Top Folders:**\\n`;\n response += topFolders.map(([folder, count]) =>\n ` - ${folder}: ${count} notes`\n ).join('\\n');\n\n if (topTags.length > 0) {\n response += `\\n\\n**Top Tags** (sampled from ${sampleSize} notes):\\n`;\n response += topTags.map(([tag, count]) =>\n ` - #${tag}: ${count}`\n ).join('\\n');\n }\n\n return { content: [{ type: 'text', text: response }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not get vault overview: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── list_tags ─────────────────────────────────────────────────────\n server.tool(\n 'list_tags',\n 'List all tags used in the vault with their occurrence counts. Samples notes to build the tag list.',\n {\n limit: z.number().optional().default(50).describe('Maximum tags to return'),\n },\n async ({ limit }) => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n const tagCounts = new Map<string, number>();\n const sampleSize = Math.min(mdFiles.length, 200);\n const sampled = mdFiles.slice(0, sampleSize);\n\n for (const file of sampled) {\n try {\n const content = await client.readNote(file.path);\n const tags = extractTags(content);\n for (const tag of tags) {\n tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n const sorted = [...tagCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, limit);\n\n if (sorted.length === 0) {\n return { content: [{ type: 'text', text: 'No tags found in vault.' }] };\n }\n\n const formatted = sorted.map(([tag, count]) =>\n `#${tag} (${count})`\n ).join('\\n');\n\n return {\n content: [{\n type: 'text',\n text: `**Tags in vault** (sampled ${sampleSize} of ${mdFiles.length} notes):\\n\\n${formatted}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not list tags: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── get_vault_structure ───────────────────────────────────────────\n server.tool(\n 'get_vault_structure',\n 'Get the folder structure of the vault as a tree with note counts per folder. Useful for understanding vault organization.',\n {},\n async () => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n // Build folder tree\n const folders = new Map<string, number>();\n for (const file of mdFiles) {\n const parts = file.path.split('/');\n if (parts.length > 1) {\n // Add all parent folders\n for (let i = 1; i < parts.length; i++) {\n const folder = parts.slice(0, i).join('/');\n if (i === parts.length - 1) {\n // This is the direct parent\n folders.set(folder, (folders.get(folder) ?? 0) + 1);\n } else if (!folders.has(folder)) {\n folders.set(folder, 0);\n }\n }\n } else {\n folders.set('(root)', (folders.get('(root)') ?? 0) + 1);\n }\n }\n\n const sorted = [...folders.entries()].sort((a, b) => a[0].localeCompare(b[0]));\n\n const tree = sorted.map(([folder, count]) => {\n const depth = folder.split('/').length - 1;\n const indent = ' '.repeat(depth);\n const name = folder.split('/').pop() ?? folder;\n return `${indent}${name}/ (${count} notes)`;\n }).join('\\n');\n\n return {\n content: [{\n type: 'text',\n text: `**Vault Structure** (${mdFiles.length} total notes):\\n\\n${tree}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not get vault structure: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { extractTasks } from '@/utils/markdown.js';\n\nexport function registerTaskTools(server: McpServer, client: ObsidianClient, _config: MindCacheConfig): void {\n // ─── find_tasks ────────────────────────────────────────────────────\n server.tool(\n 'find_tasks',\n 'Find all checkbox tasks across the vault. Filter by status (open, done, or all). Returns tasks with their source note and line number.',\n {\n status: z.enum(['open', 'done', 'all']).optional().default('open').describe('Filter by task status'),\n query: z.string().optional().describe('Optional search query to filter tasks by text'),\n limit: z.number().optional().default(30).describe('Maximum tasks to return'),\n },\n async ({ status, query, limit }) => {\n try {\n // Search for tasks via checkbox pattern\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n const allTasks: Array<{\n text: string;\n done: boolean;\n file: string;\n line: number;\n }> = [];\n\n // Sample files for tasks\n const sampleSize = Math.min(mdFiles.length, 100);\n const sampled = mdFiles.slice(0, sampleSize);\n\n for (const file of sampled) {\n try {\n const content = await client.readNote(file.path);\n const tasks = extractTasks(content);\n\n for (const task of tasks) {\n if (query && !task.text.toLowerCase().includes(query.toLowerCase())) continue;\n if (status === 'open' && task.done) continue;\n if (status === 'done' && !task.done) continue;\n\n allTasks.push({\n text: task.text,\n done: task.done,\n file: file.path,\n line: task.line,\n });\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n if (allTasks.length === 0) {\n return {\n content: [{ type: 'text', text: `No ${status === 'all' ? '' : status + ' '}tasks found${query ? ` matching \"${query}\"` : ''}.` }],\n };\n }\n\n const displayed = allTasks.slice(0, limit);\n const formatted = displayed.map((t, i) =>\n `${i + 1}. [${t.done ? 'x' : ' '}] ${t.text}\\n *${t.file}:${t.line}*`\n ).join('\\n\\n');\n\n return {\n content: [{\n type: 'text',\n text: `**${status === 'all' ? 'All' : status === 'open' ? 'Open' : 'Completed'} Tasks** (${allTasks.length} found, showing ${displayed.length}):\\n\\n${formatted}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not find tasks: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── complete_task ─────────────────────────────────────────────────\n server.tool(\n 'complete_task',\n 'Mark a specific task as done by replacing [ ] with [x] at the given line in a note.',\n {\n path: z.string().describe('Path to the note containing the task'),\n line: z.number().describe('Line number of the task (1-based)'),\n },\n async ({ path, line }) => {\n try {\n const content = await client.readNote(path);\n const lines = content.split('\\n');\n\n if (line < 1 || line > lines.length) {\n return {\n content: [{ type: 'text', text: `Line ${line} is out of range (note has ${lines.length} lines)` }],\n isError: true,\n };\n }\n\n const targetLine = lines[line - 1];\n const match = targetLine.match(/^(\\s*-\\s+)\\[[ ]\\](\\s+.+)$/);\n\n if (!match) {\n return {\n content: [{ type: 'text', text: `Line ${line} is not an open task: \"${targetLine.trim()}\"` }],\n isError: true,\n };\n }\n\n lines[line - 1] = `${match[1]}[x]${match[2]}`;\n await client.writeNote(path, lines.join('\\n'));\n\n const taskText = match[2].trim();\n return {\n content: [{ type: 'text', text: `Completed task: \"${taskText}\" in \"${path}\"` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not complete task: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { today } from '@/utils/dates.js';\nimport { extractTags } from '@/utils/markdown.js';\n\nexport function registerResources(server: McpServer, client: ObsidianClient, config: MindCacheConfig): void {\n // ─── vault://today ─────────────────────────────────────────────────\n server.resource(\n 'today',\n 'vault://today',\n { description: \"Today's daily note content. Auto-updates with the current day's note.\", mimeType: 'text/markdown' },\n async (uri) => {\n try {\n const dailyPath = `${config.dailyNotes.folder}/${today()}.md`;\n const content = await client.readNote(dailyPath);\n return {\n contents: [{ uri: uri.href, text: `# Today's Daily Note (${today()})\\n\\n${content}`, mimeType: 'text/markdown' }],\n };\n } catch {\n return {\n contents: [{ uri: uri.href, text: `No daily note for today (${today()}).`, mimeType: 'text/plain' }],\n };\n }\n }\n );\n\n // ─── vault://recent ────────────────────────────────────────────────\n server.resource(\n 'recent',\n 'vault://recent',\n { description: 'Summary of recently modified notes in the vault.', mimeType: 'text/markdown' },\n async (uri) => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md').slice(0, 10);\n\n const lines = mdFiles.map((f, i) => `${i + 1}. ${f.path}`).join('\\n');\n\n return {\n contents: [{\n uri: uri.href,\n text: `# Recent Notes\\n\\n${lines}`,\n mimeType: 'text/markdown',\n }],\n };\n } catch {\n return {\n contents: [{ uri: uri.href, text: 'Could not fetch recent notes.', mimeType: 'text/plain' }],\n };\n }\n }\n );\n\n // ─── vault://tags ──────────────────────────────────────────────────\n server.resource(\n 'tags',\n 'vault://tags',\n { description: 'Tag cloud with counts from the vault.', mimeType: 'text/markdown' },\n async (uri) => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n const tagCounts = new Map<string, number>();\n const sampleSize = Math.min(mdFiles.length, 50);\n\n for (const file of mdFiles.slice(0, sampleSize)) {\n try {\n const content = await client.readNote(file.path);\n for (const tag of extractTags(content)) {\n tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);\n }\n } catch {\n // Skip\n }\n }\n\n const sorted = [...tagCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 30);\n\n const lines = sorted.map(([tag, count]) => `- #${tag} (${count})`).join('\\n');\n\n return {\n contents: [{\n uri: uri.href,\n text: `# Vault Tags\\n\\n${lines || 'No tags found.'}`,\n mimeType: 'text/markdown',\n }],\n };\n } catch {\n return {\n contents: [{ uri: uri.href, text: 'Could not fetch tags.', mimeType: 'text/plain' }],\n };\n }\n }\n );\n\n // ─── vault://context ───────────────────────────────────────────────\n server.resource(\n 'context',\n 'vault://context',\n {\n description: 'Contextual notes relevant to the current working directory or project. Auto-infers which notes may be useful.',\n mimeType: 'text/markdown',\n },\n async (uri) => {\n try {\n const cwd = process.cwd();\n const projectName = cwd.split('/').pop() ?? '';\n\n // Search for notes related to the current project\n let results: string[] = [];\n if (projectName) {\n try {\n const searchResults = await client.search(projectName);\n results = searchResults.slice(0, 5).map(r => r.filename);\n } catch {\n // Search failed, that's ok\n }\n }\n\n if (results.length === 0) {\n return {\n contents: [{\n uri: uri.href,\n text: `# Context\\n\\nNo vault notes found related to the current project \"${projectName}\".`,\n mimeType: 'text/markdown',\n }],\n };\n }\n\n const lines = results.map((f, i) => `${i + 1}. ${f}`).join('\\n');\n return {\n contents: [{\n uri: uri.href,\n text: `# Context for \"${projectName}\"\\n\\nRelevant vault notes:\\n\\n${lines}`,\n mimeType: 'text/markdown',\n }],\n };\n } catch {\n return {\n contents: [{ uri: uri.href, text: 'Could not determine context.', mimeType: 'text/plain' }],\n };\n }\n }\n );\n}\n","const PREFIX = 'mindcache';\n\nexport function log(message: string): void {\n process.stderr.write(`[${PREFIX}] ${message}\\n`);\n}\n\nexport function logError(message: string): void {\n process.stderr.write(`[${PREFIX}] ERROR: ${message}\\n`);\n}\n\nexport function logWarn(message: string): void {\n process.stderr.write(`[${PREFIX}] WARN: ${message}\\n`);\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { registerFindTools } from '@/tools/find.js';\nimport { registerReadTools } from '@/tools/read.js';\nimport { registerRememberTools } from '@/tools/remember.js';\nimport { registerJournalTools } from '@/tools/journal.js';\nimport { registerWriteTools } from '@/tools/write.js';\nimport { registerConnectTools } from '@/tools/connect.js';\nimport { registerOrganizeTools } from '@/tools/organize.js';\nimport { registerUnderstandTools } from '@/tools/understand.js';\nimport { registerTaskTools } from '@/tools/tasks.js';\nimport { registerResources } from '@/resources/index.js';\nimport { log } from '@/utils/logger.js';\n\nexport const SERVER_VERSION = '0.2.0';\n\nexport function createServer(config: MindCacheConfig): McpServer {\n const server = new McpServer(\n {\n name: 'mindcache',\n version: SERVER_VERSION,\n },\n {\n instructions: [\n 'MindCache connects your Obsidian vault to AI.',\n 'Use the search and ask tools to find information in the user\\'s personal knowledge base.',\n 'Use the remember tools to capture decisions, meetings, ideas, learnings, and references.',\n 'Use the log tool to add entries to the daily note.',\n 'Use the connect tools to build links between related notes.',\n 'Always check the vault before asking the user to repeat information they may have already documented.',\n 'When creating notes, use appropriate templates and add relevant tags.',\n ].join(' '),\n }\n );\n\n const client = new ObsidianClient(config);\n\n // Register all tool categories\n log('Registering tools...');\n registerFindTools(server, client, config);\n registerReadTools(server, client, config);\n registerRememberTools(server, client, config);\n registerJournalTools(server, client, config);\n registerWriteTools(server, client, config);\n registerConnectTools(server, client, config);\n registerOrganizeTools(server, client, config);\n registerUnderstandTools(server, client, config);\n registerTaskTools(server, client, config);\n\n // Register resources\n log('Registering resources...');\n registerResources(server, client, config);\n\n log('Server configured with 40 tools and 4 resources');\n return server;\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { resolve, join } from 'path';\nimport { homedir } from 'os';\nimport { log, logWarn } from '@/utils/logger.js';\n\nexport interface MindCacheConfig {\n vault: string;\n dailyNotes: {\n folder: string;\n format: string;\n };\n templates: {\n folder: string;\n };\n inbox: {\n folder: string;\n requireReview: boolean;\n };\n}\n\nconst DEFAULT_CONFIG: MindCacheConfig = {\n vault: '',\n dailyNotes: {\n folder: 'Daily',\n format: 'YYYY-MM-DD',\n },\n templates: {\n folder: 'Templates/MindCache',\n },\n inbox: {\n folder: 'MindCache/Inbox',\n requireReview: false,\n },\n};\n\n/**\n * Simple YAML-like parser for config files.\n * Handles flat and one-level nested key: value pairs.\n */\nfunction parseSimpleYaml(content: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n let currentSection = '';\n\n for (const rawLine of content.split('\\n')) {\n const line = rawLine.replace(/#.*$/, '').trimEnd();\n if (!line.trim()) continue;\n\n const indent = line.length - line.trimStart().length;\n const trimmed = line.trim();\n\n const colonIdx = trimmed.indexOf(':');\n if (colonIdx < 0) continue;\n\n const key = trimmed.slice(0, colonIdx).trim();\n const value = trimmed.slice(colonIdx + 1).trim();\n\n if (indent === 0 && !value) {\n currentSection = key;\n if (!result[currentSection]) result[currentSection] = {};\n } else if (indent > 0 && currentSection) {\n (result[currentSection] as Record<string, string>)[key] = value;\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nfunction findConfigFile(): string | null {\n const candidates = [\n resolve(process.cwd(), '.mindcache.yml'),\n resolve(process.cwd(), '.mindcache.yaml'),\n join(homedir(), '.config', 'mindcache', 'config.yml'),\n join(homedir(), '.config', 'mindcache', 'config.yaml'),\n join(homedir(), '.mindcache.yml'),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return null;\n}\n\nexport function loadConfig(): MindCacheConfig {\n const config: MindCacheConfig = {\n vault: DEFAULT_CONFIG.vault,\n dailyNotes: { ...DEFAULT_CONFIG.dailyNotes },\n templates: { ...DEFAULT_CONFIG.templates },\n inbox: { ...DEFAULT_CONFIG.inbox },\n };\n\n // Check environment variables first\n if (process.env.MINDCACHE_VAULT) config.vault = process.env.MINDCACHE_VAULT;\n\n // Load config file\n const configPath = process.env.MINDCACHE_CONFIG || findConfigFile();\n if (configPath && existsSync(configPath)) {\n log(`Loading config from ${configPath}`);\n try {\n const raw = readFileSync(configPath, 'utf-8');\n const parsed = parseSimpleYaml(raw);\n\n if (typeof parsed.vault === 'string') config.vault = parsed.vault;\n\n const daily = (parsed.daily_notes ?? parsed.dailyNotes) as Record<string, string> | undefined;\n if (daily) {\n if (daily.folder) config.dailyNotes.folder = daily.folder;\n if (daily.format) config.dailyNotes.format = daily.format;\n }\n\n const templates = parsed.templates as Record<string, string> | undefined;\n if (templates) {\n if (templates.folder) config.templates.folder = templates.folder;\n }\n\n const inbox = parsed.inbox as Record<string, string> | undefined;\n if (inbox) {\n if (inbox.folder) config.inbox.folder = inbox.folder;\n if (inbox.require_review) config.inbox.requireReview = inbox.require_review === 'true';\n }\n } catch (err) {\n logWarn(`Failed to parse config: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Resolve ~ in vault path\n if (config.vault.startsWith('~')) {\n config.vault = config.vault.replace('~', homedir());\n }\n\n return config;\n}\n","import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createServer, SERVER_VERSION } from '@/server.js';\nimport { loadConfig } from '@/config.js';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { log, logError } from '@/utils/logger.js';\nimport { writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { createInterface } from 'readline';\n\nconst HELP = `\nMindCache v${SERVER_VERSION} — Your Obsidian vault, connected to AI.\n\nUsage:\n mindcache Start the MCP server (default)\n mindcache init Interactive setup\n mindcache doctor Diagnose connection issues\n mindcache config Show current configuration\n mindcache --help Show this help message\n mindcache --version Show version\n\nEnvironment variables:\n MINDCACHE_VAULT Path to Obsidian vault\n MINDCACHE_CONFIG Path to config file\n\nConfig file locations (checked in order):\n .mindcache.yml (current directory)\n ~/.config/mindcache/config.yml\n ~/.mindcache.yml\n\nLearn more: https://usemindcache.com\n`;\n\nasync function prompt(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n return new Promise(resolve => {\n rl.question(question, answer => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nasync function runInit(): Promise<void> {\n process.stderr.write('\\nMindCache Setup\\n');\n process.stderr.write('===============\\n\\n');\n process.stderr.write('MindCache reads your Obsidian vault directly from the filesystem.\\n');\n process.stderr.write('No plugins required — just point it at your vault folder.\\n\\n');\n\n const defaultVault = join(homedir(), 'Documents', 'Obsidian Vault');\n const vault = await prompt(`Obsidian vault path [${defaultVault}]: `) || defaultVault;\n const dailyFolder = await prompt('Daily notes folder [Daily]: ') || 'Daily';\n\n const configContent = `# MindCache Configuration\nvault: ${vault}\n\ndaily_notes:\n folder: ${dailyFolder}\n format: YYYY-MM-DD\n\ntemplates:\n folder: Templates/MindCache\n\ninbox:\n folder: MindCache/Inbox\n require_review: false\n`;\n\n const configDir = join(homedir(), '.config', 'mindcache');\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n const configPath = join(configDir, 'config.yml');\n writeFileSync(configPath, configContent);\n\n process.stderr.write(`\\nConfig saved to: ${configPath}\\n\\n`);\n\n // Test vault access\n process.stderr.write('Checking vault...\\n');\n const config = loadConfig();\n const client = new ObsidianClient(config);\n const health = await client.health();\n\n if (health.ok) {\n process.stderr.write(` Found ${health.noteCount} notes in vault\\n\\n`);\n } else {\n process.stderr.write(` ${health.error}\\n`);\n process.stderr.write(' Check that the vault path is correct.\\n\\n');\n }\n\n process.stderr.write('Add MindCache to Claude Code:\\n');\n process.stderr.write(' claude mcp add --scope user mindcache -- npx @augmnt-sh/mindcache\\n\\n');\n\n process.exit(0);\n}\n\nasync function runDoctor(): Promise<void> {\n process.stderr.write(`\\nMindCache Doctor v${SERVER_VERSION}\\n`);\n process.stderr.write('==========================\\n\\n');\n\n const config = loadConfig();\n\n // Check config\n process.stderr.write('Checking configuration...\\n');\n if (!config.vault) {\n process.stderr.write(' [WARN] No vault path configured. Run: mindcache init\\n');\n } else {\n process.stderr.write(` [OK] Vault: ${config.vault}\\n`);\n }\n\n process.stderr.write(` [OK] Daily notes: ${config.dailyNotes.folder}/\\n`);\n process.stderr.write(` [OK] Templates: ${config.templates.folder}/\\n`);\n process.stderr.write(` [OK] Inbox: ${config.inbox.folder}/\\n`);\n\n // Check vault access\n process.stderr.write('\\nChecking vault access...\\n');\n const client = new ObsidianClient(config);\n const health = await client.health();\n\n if (health.ok) {\n process.stderr.write(` [OK] Vault readable\\n`);\n process.stderr.write(` [OK] Found ${health.noteCount} markdown notes\\n`);\n } else {\n process.stderr.write(` [FAIL] ${health.error}\\n`);\n process.stderr.write('\\n Troubleshooting:\\n');\n process.stderr.write(' 1. Check that the vault path is correct\\n');\n process.stderr.write(' 2. Check file permissions\\n');\n process.stderr.write(' 3. Run: mindcache init\\n');\n }\n\n process.stderr.write('\\n');\n process.exit(health.ok ? 0 : 1);\n}\n\nfunction showConfig(): void {\n const config = loadConfig();\n process.stderr.write(`\\nMindCache Configuration\\n`);\n process.stderr.write('=======================\\n\\n');\n process.stderr.write(`Vault: ${config.vault || '(not set)'}\\n`);\n process.stderr.write(`Daily folder: ${config.dailyNotes.folder}\\n`);\n process.stderr.write(`Daily format: ${config.dailyNotes.format}\\n`);\n process.stderr.write(`Templates: ${config.templates.folder}\\n`);\n process.stderr.write(`Inbox: ${config.inbox.folder}\\n`);\n process.stderr.write(`Review mode: ${config.inbox.requireReview ? 'on' : 'off'}\\n`);\n process.stderr.write('\\n');\n process.exit(0);\n}\n\nasync function startServer(): Promise<void> {\n const nodeVersion = process.version;\n const nodeMajor = parseInt(nodeVersion.slice(1));\n if (nodeMajor < 18) {\n logError(`Node.js >= 18 required, found ${nodeVersion}`);\n process.exit(1);\n }\n\n log(`mindcache v${SERVER_VERSION} | Node ${nodeVersion} | ${process.platform}`);\n\n const config = loadConfig();\n\n if (!config.vault) {\n log('WARN: No vault path configured. Run \"mindcache init\" for setup.');\n }\n\n const server = createServer(config);\n const transport = new StdioServerTransport();\n\n const shutdown = async () => {\n log('Shutting down...');\n await server.close();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n await server.connect(transport);\n}\n\n// Parse CLI arguments\nconst command = process.argv[2];\n\nswitch (command) {\n case 'init':\n runInit().catch(err => {\n logError(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n case 'doctor':\n runDoctor().catch(err => {\n logError(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n case 'config':\n showConfig();\n break;\n case '--version':\n case '-v':\n process.stderr.write(`mindcache v${SERVER_VERSION}\\n`);\n process.exit(0);\n break;\n case '--help':\n case '-h':\n process.stderr.write(HELP);\n process.exit(0);\n break;\n default:\n startServer().catch(err => {\n logError(`Fatal: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/markdown.ts","../src/utils/query.ts","../src/obsidian.ts","../src/utils/dates.ts","../src/tools/find.ts","../src/tools/read.ts","../src/templates.ts","../src/tools/remember.ts","../src/utils/shuffle.ts","../src/tools/journal.ts","../src/tools/write.ts","../src/tools/connect.ts","../src/tools/organize.ts","../src/tools/understand.ts","../src/tools/tasks.ts","../src/tools/vault.ts","../src/resources/index.ts","../src/utils/logger.ts","../src/server.ts","../src/config.ts","../src/cli.ts"],"names":["extractSection","content","heading","lines","capturing","headingLevel","result","line","headingMatch","level","text","replaceSection","newContent","skipping","parseFrontmatter","match","frontmatter","parsed","YAML","serializeFrontmatter","body","extractWikilinks","m","extractTags","matches","extractTasks","tasks","i","wordCount","w","parseQuery","query","phrases","tagFilters","pathFilter","fileFilter","remaining","_match","phrase","value","ObsidianClient","config","existsSync","filePath","fn","key","existing","release","lock","resolve","watch","_event","filename","notePath","normalized","resolved","join","dir","dirname","mkdir","results","entries","readdir","entry","fullPath","st","stat","t","token","totalDocs","docsWithToken","mdFiles","f","file","readFile","contentLower","tokens","tags","links","path","fileName","mtime","contextLength","queryLower","matchPositions","score","pos","exactCount","start","end","tokensFound","tf","weight","coverage","idx","fileNameLower","ageDays","options","limit","ctxLen","pf","ff","tagFiltersLower","noteTags","scoringQuery","queryTokens","phraseScore","totalScore","a","b","writeFile","appendFile","updated","headingLower","insertIdx","j","nextMatch","unlink","oldName","newName","pattern","alias","now","allFiles","relPath","relative","name","basename","extname","extension","queries","resultMap","q","err","formatDate","date","y","d","today","startOfWeek","day","diff","weekDates","dates","parseDateRange","range","lower","thisWeekStart","lastWeekStart","lastWeekEnd","rangeMatch","daysMatch","registerFindTools","server","client","_config","z","formatted","contexts","question","topResults","notes","truncated","l","outlinks","related","queryMeta","link","tag","noteName","batchResults","meta","r","scoreAdd","reason","sorted","info","from","to","fromMs","toMs","fromStr","toStr","age","mins","hours","days","timeAgo","term","context","registerReadTools","section","words","k","v","dailyPath","wikilinks","urlPattern","urls","response","u","__dirname","fileURLToPath","TEMPLATES_DIR","TEMPLATE_CACHE","loadTemplate","readFileSync","applyTemplate","template","variables","allVars","renderTemplate","uniquePath","basePath","ext","registerRememberTools","title","folder","noteTitle","tagLine","noteContent","attendees","agenda","action_items","follow_up","targetFolder","decision","consequences","alternatives","idea","why","next_steps","concept","key_points","examples","application","source","role","organization","contact","interaction","url","summary","takeaways","thoughts","shuffle","arr","registerJournalTools","formattedEntry","task","formattedTask","todayContent","contextPrompts","openTasks","doneTasks","genericPrompts","genericCount","selected","p","registerWriteTools","overwrite","finalContent","confirm","registerConnectTools","target","linkLine","existingLinks","suggestions","stopWords","allWords","step","word","reasons","existingNotes","gaps","sampled","sampleSize","sources","linked","nameToPath","targetPath","orphans","registerOrganizeTools","existingTags","allTags","properties","merged","old_path","new_path","backlinkCount","backlinkMsg","destination","newPath","registerUnderstandTools","files","otherFiles","folderCounts","parts","topFolders","tagCounts","topTags","count","tagSampled","folders","tree","depth","indent","registerTaskTools","status","allTasks","displayed","targetLine","registerVaultTools","add","remove","modified","before","removeSet","_","actions","dailyFolder","dailyFiles","stats","format","exported","registerResources","uri","projectName","PREFIX","log","message","logError","logWarn","SERVER_VERSION","createServer","McpServer","DEFAULT_CONFIG","parseSimpleYaml","currentSection","rawLine","trimmed","colonIdx","findConfigFile","candidates","homedir","candidate","loadConfig","configPath","raw","daily","templates","inbox","HELP","prompt","rl","createInterface","answer","runInit","defaultVault","vault","configContent","configDir","mkdirSync","writeFileSync","health","runDoctor","showConfig","startServer","nodeVersion","transport","StdioServerTransport","shutdown","command"],"mappings":"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","file":"cli.js","sourcesContent":["import YAML from 'yaml';\n\n/**\n * Extract a section from markdown content by heading.\n * Returns content under the heading until the next heading of same or higher level.\n */\nexport function extractSection(content: string, heading: string): string | null {\n const lines = content.split('\\n');\n let capturing = false;\n let headingLevel = 0;\n const result: string[] = [];\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n\n if (headingMatch) {\n const level = headingMatch[1].length;\n const text = headingMatch[2].trim();\n\n if (capturing) {\n if (level <= headingLevel) break;\n result.push(line);\n } else if (text.toLowerCase() === heading.toLowerCase()) {\n capturing = true;\n headingLevel = level;\n result.push(line);\n }\n } else if (capturing) {\n result.push(line);\n }\n }\n\n return result.length > 0 ? result.join('\\n').trim() : null;\n}\n\n/**\n * Replace a section in markdown content by heading.\n */\nexport function replaceSection(content: string, heading: string, newContent: string): string {\n const lines = content.split('\\n');\n const result: string[] = [];\n let skipping = false;\n let headingLevel = 0;\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n\n if (headingMatch) {\n const level = headingMatch[1].length;\n const text = headingMatch[2].trim();\n\n if (skipping && level <= headingLevel) {\n skipping = false;\n result.push(line);\n } else if (text.toLowerCase() === heading.toLowerCase()) {\n skipping = true;\n headingLevel = level;\n result.push(line);\n result.push('');\n result.push(newContent);\n result.push('');\n } else {\n result.push(line);\n }\n } else if (!skipping) {\n result.push(line);\n }\n }\n\n return result.join('\\n');\n}\n\n/**\n * Parse YAML frontmatter from markdown content.\n */\nexport function parseFrontmatter(content: string): { frontmatter: Record<string, unknown>; body: string } {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) return { frontmatter: {}, body: content };\n\n let frontmatter: Record<string, unknown> = {};\n try {\n const parsed = YAML.parse(match[1]);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n frontmatter = parsed as Record<string, unknown>;\n }\n } catch {\n // Fall back to empty frontmatter if YAML is malformed\n }\n\n return { frontmatter, body: match[2] };\n}\n\n/**\n * Serialize frontmatter object back to a YAML frontmatter block + body.\n */\nexport function serializeFrontmatter(frontmatter: Record<string, unknown>, body: string): string {\n const yamlStr = YAML.stringify(frontmatter, { lineWidth: 0 }).trim();\n return `---\\n${yamlStr}\\n---\\n\\n${body}`;\n}\n\n/**\n * Extract all [[wikilinks]] from markdown content.\n */\nexport function extractWikilinks(content: string): string[] {\n const matches = content.matchAll(/\\[\\[([^\\]|]+)(?:\\|[^\\]]+)?\\]\\]/g);\n return [...matches].map(m => m[1]);\n}\n\n/**\n * Extract all #tags from markdown content.\n */\nexport function extractTags(content: string): string[] {\n const matches = content.matchAll(/(?:^|\\s)#([a-zA-Z0-9_/-]+)/g);\n return [...new Set([...matches].map(m => m[1]))];\n}\n\n/**\n * Extract all tasks (checkbox items) from markdown content.\n */\nexport function extractTasks(content: string): Array<{ text: string; done: boolean; line: number }> {\n const tasks: Array<{ text: string; done: boolean; line: number }> = [];\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/^[\\s]*-\\s+\\[([ xX])\\]\\s+(.+)$/);\n if (match) {\n tasks.push({\n text: match[2],\n done: match[1] !== ' ',\n line: i + 1,\n });\n }\n }\n\n return tasks;\n}\n\n/**\n * Count words in text (excluding frontmatter).\n */\nexport function wordCount(content: string): number {\n const { body } = parseFrontmatter(content);\n return body.split(/\\s+/).filter(w => w.length > 0).length;\n}\n","export interface ParsedQuery {\n /** Free text terms to search in content */\n text: string;\n /** Exact phrases (from quoted strings) */\n phrases: string[];\n /** path: filter — match against file path */\n pathFilter: string | null;\n /** file: filter — match against filename */\n fileFilter: string | null;\n /** tag: filters — notes must contain these tags */\n tagFilters: string[];\n}\n\n/**\n * Parse a search query string into structured components.\n *\n * Supported operators:\n * - \"exact phrase\" — quoted exact match\n * - path:folder — filter by file path prefix\n * - file:name — filter by filename\n * - tag:#tagname or tag:tagname — filter by tag\n *\n * Everything else becomes free-text search terms.\n */\nexport function parseQuery(query: string): ParsedQuery {\n const phrases: string[] = [];\n const tagFilters: string[] = [];\n let pathFilter: string | null = null;\n let fileFilter: string | null = null;\n\n // Extract quoted phrases\n let remaining = query.replace(/\"([^\"]+)\"/g, (_match, phrase: string) => {\n phrases.push(phrase);\n return '';\n });\n\n // Extract operators\n remaining = remaining.replace(/\\bpath:(\\S+)/gi, (_match, value: string) => {\n pathFilter = value;\n return '';\n });\n\n remaining = remaining.replace(/\\bfile:(\\S+)/gi, (_match, value: string) => {\n fileFilter = value;\n return '';\n });\n\n remaining = remaining.replace(/\\btag:#?(\\S+)/gi, (_match, value: string) => {\n tagFilters.push(value);\n return '';\n });\n\n // Clean up remaining text\n const text = remaining.replace(/\\s+/g, ' ').trim();\n\n return { text, phrases, pathFilter, fileFilter, tagFilters };\n}\n","import { readFile, writeFile, appendFile, unlink, mkdir, readdir, stat } from 'fs/promises';\nimport { existsSync, watch } from 'fs';\nimport { join, relative, dirname, extname, basename } from 'path';\nimport { type MindCacheConfig } from '@/config.js';\nimport { extractSection, replaceSection, extractTags, extractWikilinks } from '@/utils/markdown.js';\nimport { parseQuery, type ParsedQuery } from '@/utils/query.js';\n\nexport interface SearchResult {\n filename: string;\n score: number;\n matches: Array<{\n match: { start: number; end: number };\n context: string;\n }>;\n}\n\nexport interface VaultFile {\n path: string;\n name: string;\n extension: string;\n mtime: number;\n}\n\n/** Cached metadata for a single note — used by the search index. */\nexport interface NoteIndex {\n tokens: Set<string>;\n tags: string[];\n links: string[];\n mtime: number;\n}\n\n/**\n * Direct filesystem client for Obsidian vaults.\n * Reads and writes markdown files directly — no plugin required.\n * All I/O is async (fs/promises) to avoid blocking the event loop.\n * Per-file locking prevents concurrent writes from corrupting notes.\n * TF-IDF scoring from the search index boosts rare, meaningful terms.\n */\nexport class ObsidianClient {\n private vaultPath: string;\n private fileCache: VaultFile[] | null = null;\n private fileCacheTime = 0;\n private readonly CACHE_TTL = 5000;\n private watcher: ReturnType<typeof watch> | null = null;\n\n /** In-memory search index: file path → indexed metadata. */\n private index = new Map<string, NoteIndex>();\n private indexReady = false;\n\n /** Per-file write locks — serializes concurrent writes to the same path. */\n private locks = new Map<string, Promise<void>>();\n\n constructor(config: MindCacheConfig) {\n this.vaultPath = config.vault;\n if (this.vaultPath && existsSync(this.vaultPath)) {\n this.startWatcher();\n }\n }\n\n // ─── FILE LOCKING ─────────────────────────────────────────────────\n\n /**\n * Acquire a per-file lock. Concurrent operations on the same file\n * are serialized — the second caller waits for the first to finish.\n */\n private async withLock<T>(filePath: string, fn: () => Promise<T>): Promise<T> {\n const key = filePath;\n // Wait for any existing lock on this file\n const existing = this.locks.get(key);\n let release: () => void;\n const lock = new Promise<void>(resolve => { release = resolve; });\n this.locks.set(key, (existing ?? Promise.resolve()).then(() => lock));\n\n try {\n if (existing) await existing;\n return await fn();\n } finally {\n release!();\n // Clean up lock entry if it's still ours\n if (this.locks.get(key) === lock) {\n this.locks.delete(key);\n }\n }\n }\n\n // ─── WATCHER ──────────────────────────────────────────────────────\n\n private startWatcher(): void {\n try {\n this.watcher = watch(this.vaultPath, { recursive: true }, (_event, filename) => {\n if (filename && !filename.startsWith('.')) {\n this.fileCache = null;\n if (filename.endsWith('.md')) {\n this.index.delete(filename);\n }\n }\n });\n this.watcher.on('error', () => {});\n } catch {\n // Watching not supported — fall back to TTL cache\n }\n }\n\n // ─── PATH HELPERS ─────────────────────────────────────────────────\n\n normalizePath(notePath: string): string {\n if (!notePath.endsWith('.md')) return `${notePath}.md`;\n return notePath;\n }\n\n private resolve(notePath: string): string {\n const normalized = this.normalizePath(notePath);\n const resolved = join(this.vaultPath, normalized);\n if (!resolved.startsWith(this.vaultPath)) {\n throw new Error('Path traversal not allowed');\n }\n return resolved;\n }\n\n private async ensureDir(filePath: string): Promise<void> {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n }\n\n // ─── FILE WALKING ─────────────────────────────────────────────────\n\n private async walkDir(dir: string): Promise<Array<{ fullPath: string; mtime: number }>> {\n const results: Array<{ fullPath: string; mtime: number }> = [];\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n for (const entry of entries) {\n if (entry.name.startsWith('.')) continue;\n if (entry.name === 'node_modules') continue;\n\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n results.push(...await this.walkDir(fullPath));\n } else {\n try {\n const st = await stat(fullPath);\n results.push({ fullPath, mtime: st.mtimeMs });\n } catch {\n results.push({ fullPath, mtime: 0 });\n }\n }\n }\n return results;\n }\n\n // ─── TOKENIZATION & TF-IDF ───────────────────────────────────────\n\n private tokenize(text: string): string[] {\n return text.toLowerCase().split(/\\s+/).filter(t => t.length > 1);\n }\n\n /**\n * Compute IDF (Inverse Document Frequency) for a token.\n * IDF = log(totalDocs / docsContainingToken)\n * Rare tokens get high IDF; common tokens get low IDF.\n */\n private idf(token: string): number {\n if (!this.indexReady || this.index.size === 0) return 1;\n const totalDocs = this.index.size;\n let docsWithToken = 0;\n for (const entry of this.index.values()) {\n if (entry.tokens.has(token)) docsWithToken++;\n }\n if (docsWithToken === 0) return 1;\n return Math.log(totalDocs / docsWithToken) + 1;\n }\n\n // ─── SEARCH INDEX ─────────────────────────────────────────────────\n\n async buildIndex(): Promise<void> {\n const files = await this.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n for (const file of mdFiles) {\n if (this.index.has(file.path)) continue;\n\n try {\n const content = await readFile(this.resolve(file.path), 'utf-8');\n const contentLower = content.toLowerCase().replace(/[^\\w\\s]/g, ' ');\n const tokens = new Set(contentLower.split(/\\s+/).filter(t => t.length > 1));\n const tags = extractTags(content);\n const links = extractWikilinks(content);\n this.index.set(file.path, { tokens, tags, links, mtime: file.mtime });\n } catch {\n // Skip unreadable files\n }\n }\n\n // Remove index entries for deleted files\n for (const path of this.index.keys()) {\n if (!mdFiles.some(f => f.path === path)) {\n this.index.delete(path);\n }\n }\n\n this.indexReady = true;\n }\n\n // ─── SCORING ──────────────────────────────────────────────────────\n\n /**\n * Score how well content matches a query.\n * Uses TF-IDF weighting when the index is available — rare terms\n * score higher than common ones.\n */\n private scoreMatch(query: string, content: string, fileName: string, mtime: number, contextLength: number = 80): {\n score: number;\n matchPositions: Array<{ start: number; end: number; context: string }>;\n } {\n const contentLower = content.toLowerCase();\n const queryLower = query.toLowerCase();\n const tokens = this.tokenize(query);\n const matchPositions: Array<{ start: number; end: number; context: string }> = [];\n\n let score = 0;\n\n // Exact phrase match — highest value\n const exactIdx = contentLower.indexOf(queryLower);\n if (exactIdx >= 0) {\n score += 100;\n let pos = 0;\n let exactCount = 0;\n while ((pos = contentLower.indexOf(queryLower, pos)) !== -1 && exactCount < 5) {\n const start = Math.max(0, pos - contextLength);\n const end = Math.min(content.length, pos + query.length + contextLength);\n matchPositions.push({\n start: pos,\n end: pos + query.length,\n context: content.slice(start, end).replace(/\\n/g, ' ').trim(),\n });\n pos += queryLower.length;\n exactCount++;\n }\n score += exactCount * 10;\n }\n\n // Individual word matches with TF-IDF weighting\n if (tokens.length > 1) {\n let tokensFound = 0;\n for (const token of tokens) {\n if (contentLower.includes(token)) {\n tokensFound++;\n // TF: count occurrences in this document\n let pos = 0;\n let tf = 0;\n while ((pos = contentLower.indexOf(token, pos)) !== -1) {\n tf++;\n pos += token.length;\n }\n // Weight by IDF — rare tokens contribute more\n const weight = this.idf(token);\n score += tf * weight * 3;\n }\n }\n const coverage = tokensFound / tokens.length;\n score += coverage * 50;\n\n if (matchPositions.length === 0 && tokensFound > 0) {\n for (const token of tokens) {\n const idx = contentLower.indexOf(token);\n if (idx >= 0) {\n const start = Math.max(0, idx - contextLength);\n const end = Math.min(content.length, idx + token.length + contextLength);\n matchPositions.push({\n start: idx,\n end: idx + token.length,\n context: content.slice(start, end).replace(/\\n/g, ' ').trim(),\n });\n break;\n }\n }\n }\n }\n\n // Title/filename match boost\n const fileNameLower = fileName.toLowerCase();\n if (fileNameLower.includes(queryLower)) {\n score += 80;\n } else {\n for (const token of tokens) {\n if (fileNameLower.includes(token)) score += 25;\n }\n }\n\n // Recency boost\n const ageMs = Date.now() - mtime;\n const ageDays = ageMs / (1000 * 60 * 60 * 24);\n if (ageDays < 1) score += 20;\n else if (ageDays < 7) score += 10;\n else if (ageDays < 30) score += 5;\n\n return { score, matchPositions };\n }\n\n // ─── SEARCH ───────────────────────────────────────────────────────\n\n async ping(): Promise<boolean> {\n return existsSync(this.vaultPath);\n }\n\n async search(query: string, options?: { limit?: number; contextLength?: number }): Promise<SearchResult[]> {\n const parsed = parseQuery(query);\n return this.searchParsed(parsed, options);\n }\n\n async searchParsed(parsed: ParsedQuery, options?: { limit?: number; contextLength?: number }): Promise<SearchResult[]> {\n const limit = options?.limit ?? 50;\n const ctxLen = options?.contextLength ?? 80;\n const files = await this.listFiles();\n let mdFiles = files.filter(f => f.extension === 'md');\n\n if (parsed.pathFilter) {\n const pf = parsed.pathFilter.toLowerCase();\n mdFiles = mdFiles.filter(f => f.path.toLowerCase().includes(pf));\n }\n\n if (parsed.fileFilter) {\n const ff = parsed.fileFilter.toLowerCase();\n mdFiles = mdFiles.filter(f => f.name.toLowerCase().includes(ff));\n }\n\n if (parsed.tagFilters.length > 0 && this.indexReady) {\n const tagFiltersLower = parsed.tagFilters.map(t => t.toLowerCase());\n mdFiles = mdFiles.filter(f => {\n const entry = this.index.get(f.path);\n if (!entry) return true;\n const noteTags = entry.tags.map(t => t.toLowerCase());\n return tagFiltersLower.every(tf => noteTags.includes(tf));\n });\n }\n\n const scoringQuery = [parsed.text, ...parsed.phrases].filter(Boolean).join(' ');\n const queryTokens = scoringQuery ? this.tokenize(scoringQuery) : [];\n\n if (queryTokens.length > 0 && this.indexReady) {\n mdFiles = mdFiles.filter(f => {\n const entry = this.index.get(f.path);\n if (!entry) return true;\n return queryTokens.some(t => entry.tokens.has(t));\n });\n }\n\n const results: SearchResult[] = [];\n\n for (const file of mdFiles) {\n try {\n const content = await readFile(this.resolve(file.path), 'utf-8');\n\n if (parsed.tagFilters.length > 0 && !this.index.has(file.path)) {\n const noteTags = extractTags(content).map(t => t.toLowerCase());\n const allTagsMatch = parsed.tagFilters.every(tf => noteTags.includes(tf.toLowerCase()));\n if (!allTagsMatch) continue;\n }\n\n if (!scoringQuery) {\n results.push({ filename: file.path, score: 1, matches: [] });\n continue;\n }\n\n const { score, matchPositions } = this.scoreMatch(scoringQuery, content, file.name, file.mtime, ctxLen);\n\n let phraseScore = 0;\n const contentLower = content.toLowerCase();\n for (const phrase of parsed.phrases) {\n if (contentLower.includes(phrase.toLowerCase())) {\n phraseScore += 100;\n }\n }\n\n const totalScore = score + phraseScore;\n if (totalScore > 0 && (matchPositions.length > 0 || phraseScore > 0)) {\n results.push({\n filename: file.path,\n score: totalScore,\n matches: matchPositions.map(m => ({\n match: { start: m.start, end: m.end },\n context: m.context,\n })),\n });\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n return results.sort((a, b) => b.score - a.score).slice(0, limit);\n }\n\n // ─── NOTE CRUD (with file-level locking) ──────────────────────────\n\n async readNote(path: string): Promise<string> {\n const fullPath = this.resolve(path);\n try {\n return await readFile(fullPath, 'utf-8');\n } catch {\n throw new Error(`Note not found: ${path}`);\n }\n }\n\n async writeNote(path: string, content: string): Promise<void> {\n const fullPath = this.resolve(path);\n await this.withLock(fullPath, async () => {\n await this.ensureDir(fullPath);\n await writeFile(fullPath, content, 'utf-8');\n });\n this.fileCache = null;\n const normalized = this.normalizePath(path);\n this.index.delete(normalized);\n }\n\n async appendToNote(path: string, content: string): Promise<void> {\n const fullPath = this.resolve(path);\n await this.withLock(fullPath, async () => {\n try {\n await readFile(fullPath, 'utf-8');\n } catch {\n throw new Error(`Note not found: ${path}`);\n }\n await appendFile(fullPath, content, 'utf-8');\n });\n const normalized = this.normalizePath(path);\n this.index.delete(normalized);\n }\n\n async patchNote(path: string, content: string, options?: {\n operation?: 'append' | 'prepend' | 'replace';\n targetHeading?: string;\n }): Promise<void> {\n const fullPath = this.resolve(path);\n await this.withLock(fullPath, async () => {\n const existing = await readFile(fullPath, 'utf-8');\n\n if (options?.targetHeading) {\n const section = extractSection(existing, options.targetHeading);\n if (!section) {\n throw new Error(`Heading \"${options.targetHeading}\" not found`);\n }\n\n if (options.operation === 'replace') {\n const updated = replaceSection(existing, options.targetHeading, content);\n await writeFile(fullPath, updated, 'utf-8');\n } else {\n const lines = existing.split('\\n');\n const headingLower = options.targetHeading.toLowerCase();\n let insertIdx = -1;\n\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(/^(#{1,6})\\s+(.+)$/);\n if (match && match[2].trim().toLowerCase() === headingLower) {\n const headingLevel = match[1].length;\n insertIdx = i + 1;\n for (let j = i + 1; j < lines.length; j++) {\n const nextMatch = lines[j].match(/^(#{1,6})\\s/);\n if (nextMatch && nextMatch[1].length <= headingLevel) break;\n insertIdx = j + 1;\n }\n break;\n }\n }\n\n if (insertIdx >= 0) {\n lines.splice(insertIdx, 0, content);\n await writeFile(fullPath, lines.join('\\n'), 'utf-8');\n } else {\n throw new Error(`Heading \"${options.targetHeading}\" not found`);\n }\n }\n } else {\n await appendFile(fullPath, content, 'utf-8');\n }\n });\n\n const normalized = this.normalizePath(path);\n this.index.delete(normalized);\n }\n\n async deleteNote(path: string): Promise<void> {\n const fullPath = this.resolve(path);\n await this.withLock(fullPath, async () => {\n try {\n await stat(fullPath);\n } catch {\n throw new Error(`Note not found: ${path}`);\n }\n await unlink(fullPath);\n });\n this.fileCache = null;\n const normalized = this.normalizePath(path);\n this.index.delete(normalized);\n }\n\n // ─── BACKLINK UPDATES ─────────────────────────────────────────────\n\n async updateBacklinks(oldName: string, newName: string): Promise<number> {\n const files = await this.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n let updated = 0;\n\n const pattern = new RegExp(\n `\\\\[\\\\[${oldName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}(\\\\|[^\\\\]]*)?\\\\]\\\\]`,\n 'g'\n );\n\n for (const file of mdFiles) {\n try {\n const fullPath = this.resolve(file.path);\n const content = await readFile(fullPath, 'utf-8');\n if (!pattern.test(content)) continue;\n\n pattern.lastIndex = 0;\n const newContent = content.replace(pattern, (_match, alias) => {\n return `[[${newName}${alias ?? ''}]]`;\n });\n\n if (newContent !== content) {\n await this.withLock(fullPath, async () => {\n await writeFile(fullPath, newContent, 'utf-8');\n });\n updated++;\n }\n } catch {\n // Skip unreadable/unwritable files\n }\n }\n\n return updated;\n }\n\n // ─── FILE LISTING ─────────────────────────────────────────────────\n\n async listFiles(): Promise<VaultFile[]> {\n const now = Date.now();\n if (this.fileCache && now - this.fileCacheTime < this.CACHE_TTL) {\n return this.fileCache;\n }\n\n const allFiles = await this.walkDir(this.vaultPath);\n this.fileCache = allFiles\n .map(({ fullPath, mtime }) => {\n const relPath = relative(this.vaultPath, fullPath);\n const name = basename(relPath, extname(relPath));\n const extension = extname(relPath).slice(1);\n return { path: relPath, name, extension, mtime };\n })\n .sort((a, b) => b.mtime - a.mtime);\n\n this.fileCacheTime = now;\n return this.fileCache;\n }\n\n // ─── CONVENIENCE METHODS ──────────────────────────────────────────\n\n async searchWithContext(query: string, contextLength: number = 100): Promise<SearchResult[]> {\n return this.search(query, { contextLength });\n }\n\n async searchBatch(queries: string[], options?: { limit?: number }): Promise<Map<string, SearchResult[]>> {\n const limit = options?.limit ?? 20;\n const files = await this.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n const resultMap = new Map<string, SearchResult[]>();\n for (const q of queries) {\n resultMap.set(q, []);\n }\n\n for (const file of mdFiles) {\n try {\n const content = await readFile(this.resolve(file.path), 'utf-8');\n\n for (const query of queries) {\n const { score, matchPositions } = this.scoreMatch(query, content, file.name, file.mtime);\n if (score > 0 && matchPositions.length > 0) {\n resultMap.get(query)!.push({\n filename: file.path,\n score,\n matches: matchPositions.map(m => ({\n match: { start: m.start, end: m.end },\n context: m.context,\n })),\n });\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n for (const [key, results] of resultMap) {\n resultMap.set(key, results.sort((a, b) => b.score - a.score).slice(0, limit));\n }\n\n return resultMap;\n }\n\n async health(): Promise<{ ok: boolean; error?: string; noteCount?: number }> {\n if (!this.vaultPath) {\n return { ok: false, error: 'No vault path configured. Run: mindcache init' };\n }\n if (!existsSync(this.vaultPath)) {\n return { ok: false, error: `Vault not found at: ${this.vaultPath}` };\n }\n\n try {\n const files = await this.listFiles();\n const mdCount = files.filter(f => f.extension === 'md').length;\n return { ok: true, noteCount: mdCount };\n } catch (err) {\n return { ok: false, error: `Cannot read vault: ${err instanceof Error ? err.message : String(err)}` };\n }\n }\n\n close(): void {\n if (this.watcher) {\n this.watcher.close();\n this.watcher = null;\n }\n }\n}\n","/**\n * Format a date as YYYY-MM-DD.\n */\nexport function formatDate(date: Date): string {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, '0');\n const d = String(date.getDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n}\n\n/**\n * Get today's date formatted.\n */\nexport function today(): string {\n return formatDate(new Date());\n}\n\n/**\n * Get the start of the current week (Monday).\n */\nexport function startOfWeek(date: Date = new Date()): Date {\n const d = new Date(date);\n const day = d.getDay();\n const diff = d.getDate() - day + (day === 0 ? -6 : 1);\n d.setDate(diff);\n d.setHours(0, 0, 0, 0);\n return d;\n}\n\n/**\n * Get dates for the current week (Mon-Sun).\n */\nexport function weekDates(date: Date = new Date()): string[] {\n const start = startOfWeek(date);\n const dates: string[] = [];\n for (let i = 0; i < 7; i++) {\n const d = new Date(start);\n d.setDate(start.getDate() + i);\n dates.push(formatDate(d));\n }\n return dates;\n}\n\n/**\n * Parse a date range string like \"last week\", \"this month\", \"2026-01-01 to 2026-01-31\".\n */\nexport function parseDateRange(range: string): { from: Date; to: Date } {\n const now = new Date();\n const lower = range.toLowerCase().trim();\n\n if (lower === 'today') {\n const start = new Date(now);\n start.setHours(0, 0, 0, 0);\n const end = new Date(now);\n end.setHours(23, 59, 59, 999);\n return { from: start, to: end };\n }\n\n if (lower === 'yesterday') {\n const start = new Date(now);\n start.setDate(start.getDate() - 1);\n start.setHours(0, 0, 0, 0);\n const end = new Date(start);\n end.setHours(23, 59, 59, 999);\n return { from: start, to: end };\n }\n\n if (lower === 'this week') {\n const start = startOfWeek(now);\n return { from: start, to: now };\n }\n\n if (lower === 'last week') {\n const thisWeekStart = startOfWeek(now);\n const lastWeekStart = new Date(thisWeekStart);\n lastWeekStart.setDate(lastWeekStart.getDate() - 7);\n const lastWeekEnd = new Date(thisWeekStart);\n lastWeekEnd.setDate(lastWeekEnd.getDate() - 1);\n lastWeekEnd.setHours(23, 59, 59, 999);\n return { from: lastWeekStart, to: lastWeekEnd };\n }\n\n if (lower === 'this month') {\n const start = new Date(now.getFullYear(), now.getMonth(), 1);\n return { from: start, to: now };\n }\n\n if (lower === 'last month') {\n const start = new Date(now.getFullYear(), now.getMonth() - 1, 1);\n const end = new Date(now.getFullYear(), now.getMonth(), 0, 23, 59, 59, 999);\n return { from: start, to: end };\n }\n\n // Try \"YYYY-MM-DD to YYYY-MM-DD\" format\n const rangeMatch = lower.match(/(\\d{4}-\\d{2}-\\d{2})\\s+to\\s+(\\d{4}-\\d{2}-\\d{2})/);\n if (rangeMatch) {\n return { from: new Date(rangeMatch[1]), to: new Date(rangeMatch[2]) };\n }\n\n // Try \"last N days\"\n const daysMatch = lower.match(/last\\s+(\\d+)\\s+days?/);\n if (daysMatch) {\n const start = new Date(now);\n start.setDate(start.getDate() - parseInt(daysMatch[1]));\n start.setHours(0, 0, 0, 0);\n return { from: start, to: now };\n }\n\n // Default: last 7 days\n const start = new Date(now);\n start.setDate(start.getDate() - 7);\n start.setHours(0, 0, 0, 0);\n return { from: start, to: now };\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { extractTags, extractWikilinks, parseFrontmatter } from '@/utils/markdown.js';\nimport { parseDateRange } from '@/utils/dates.js';\n\nexport function registerFindTools(server: McpServer, client: ObsidianClient, _config: MindCacheConfig): void {\n // ─── search ────────────────────────────────────────────────────────\n server.tool(\n 'search',\n 'Full-text search across your Obsidian vault. Supports operators: \"exact phrase\" for exact matching, path:folder to filter by path, tag:#tag to filter by tag, file:name to filter by filename. Returns matching notes with context snippets.',\n { query: z.string().max(500).describe('Search query — supports operators: \"phrase\", path:, tag:#, file:') },\n async ({ query }) => {\n try {\n const results = await client.search(query, { contextLength: 200 });\n if (results.length === 0) {\n return { content: [{ type: 'text', text: `No results found for \"${query}\"` }] };\n }\n\n const formatted = results.slice(0, 20).map((r, i) => {\n const contexts = r.matches.slice(0, 3).map(m => ` > ${m.context.trim()}`).join('\\n');\n return `${i + 1}. **${r.filename}** (score: ${r.score.toFixed(1)})\\n${contexts}`;\n }).join('\\n\\n');\n\n return {\n content: [{ type: 'text', text: `Found ${results.length} results for \"${query}\":\\n\\n${formatted}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Search error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── ask ───────────────────────────────────────────────────────────\n server.tool(\n 'ask',\n 'Ask a natural language question about your vault. Searches for relevant notes and returns their content so you can synthesize an answer. Use this when you need to understand what the user knows about a topic.',\n { question: z.string().max(500).describe('Natural language question to answer from vault knowledge') },\n async ({ question }) => {\n try {\n // Extract key terms and search\n const results = await client.searchWithContext(question, 300);\n if (results.length === 0) {\n return { content: [{ type: 'text', text: `No relevant notes found for: \"${question}\"` }] };\n }\n\n // Get content from top results\n const topResults = results.slice(0, 5);\n const notes: string[] = [];\n\n for (const result of topResults) {\n try {\n const content = await client.readNote(result.filename);\n const { frontmatter } = parseFrontmatter(content);\n const tags = extractTags(content);\n const links = extractWikilinks(content);\n\n // Truncate long notes\n const truncated = content.length > 2000 ? content.slice(0, 2000) + '\\n...(truncated)' : content;\n\n notes.push(\n `---\\n**${result.filename}**` +\n (tags.length > 0 ? ` | Tags: ${tags.map(t => `#${t}`).join(', ')}` : '') +\n (links.length > 0 ? ` | Links: ${links.map(l => `[[${l}]]`).join(', ')}` : '') +\n (frontmatter.type ? ` | Type: ${String(frontmatter.type)}` : '') +\n `\\n\\n${truncated}`\n );\n } catch {\n // Skip notes that can't be read\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: `Found ${results.length} relevant notes for \"${question}\". Here are the top ${notes.length}:\\n\\n${notes.join('\\n\\n')}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Ask error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_related ──────────────────────────────────────────────────\n server.tool(\n 'find_related',\n 'Find notes related to a given note via backlinks, shared tags, or shared wikilinks. Returns notes that are connected in the knowledge graph.',\n { path: z.string().describe('Path to the note (e.g., \"Projects/My Project.md\")') },\n async ({ path }) => {\n try {\n const content = await client.readNote(path);\n const outlinks = extractWikilinks(content);\n const tags = extractTags(content);\n\n const related = new Map<string, { reason: string; score: number }>();\n\n // Collect all queries and run in a single batch scan\n const queries: string[] = [];\n const queryMeta: Array<{ type: 'link' | 'tag' | 'backlink'; label: string }> = [];\n\n for (const link of outlinks) {\n queries.push(`file:${link}`);\n queryMeta.push({ type: 'link', label: link });\n }\n for (const tag of tags.slice(0, 5)) {\n queries.push(`tag:#${tag}`);\n queryMeta.push({ type: 'tag', label: tag });\n }\n const noteName = path.replace(/\\.md$/, '').split('/').pop() ?? path;\n queries.push(`\"[[${noteName}]]\"`);\n queryMeta.push({ type: 'backlink', label: noteName });\n\n const batchResults = await client.searchBatch(queries, { limit: 5 });\n\n for (let i = 0; i < queries.length; i++) {\n const results = batchResults.get(queries[i]) ?? [];\n const meta = queryMeta[i];\n\n for (const r of results) {\n if (r.filename === path) continue;\n const existing = related.get(r.filename);\n const scoreAdd = meta.type === 'backlink' ? 3 : meta.type === 'link' ? 2 : 1;\n const reason = meta.type === 'backlink'\n ? 'Links to this note'\n : meta.type === 'link'\n ? `Linked from this note: [[${meta.label}]]`\n : `Shared tag: #${meta.label}`;\n\n related.set(r.filename, {\n reason: existing ? `${existing.reason}; ${reason}` : reason,\n score: (existing?.score ?? 0) + scoreAdd,\n });\n }\n }\n\n const sorted = [...related.entries()]\n .sort((a, b) => b[1].score - a[1].score)\n .slice(0, 15);\n\n if (sorted.length === 0) {\n return { content: [{ type: 'text', text: `No related notes found for \"${path}\"` }] };\n }\n\n const formatted = sorted.map(([file, info], i) =>\n `${i + 1}. **${file}** — ${info.reason}`\n ).join('\\n');\n\n return {\n content: [{ type: 'text', text: `Related notes for \"${path}\":\\n\\n${formatted}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Find related error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_by_tag ───────────────────────────────────────────────────\n server.tool(\n 'find_by_tag',\n 'Find all notes with specific tags. Supports multiple tags (all must match). Use without # prefix.',\n {\n tags: z.array(z.string()).max(20).describe('Tags to search for (without # prefix, e.g., [\"project\", \"active\"])'),\n limit: z.number().optional().default(20).describe('Maximum number of results'),\n },\n async ({ tags, limit }) => {\n try {\n const query = tags.map(t => `tag:#${t}`).join(' ');\n const results = await client.search(query);\n\n if (results.length === 0) {\n return { content: [{ type: 'text', text: `No notes found with tags: ${tags.map(t => `#${t}`).join(', ')}` }] };\n }\n\n const formatted = results.slice(0, limit).map((r, i) =>\n `${i + 1}. ${r.filename}`\n ).join('\\n');\n\n return {\n content: [{ type: 'text', text: `Notes tagged ${tags.map(t => `#${t}`).join(', ')} (${results.length} total):\\n\\n${formatted}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Tag search error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_by_date ──────────────────────────────────────────────────\n server.tool(\n 'find_by_date',\n 'Find notes created or modified within a date range. Supports natural language like \"today\", \"this week\", \"last month\", \"last 7 days\", or explicit \"YYYY-MM-DD to YYYY-MM-DD\".',\n {\n range: z.string().describe('Date range — \"today\", \"this week\", \"last month\", \"last 30 days\", or \"YYYY-MM-DD to YYYY-MM-DD\"'),\n limit: z.number().optional().default(20).describe('Maximum results'),\n },\n async ({ range, limit }) => {\n try {\n const { from, to } = parseDateRange(range);\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n const fromMs = from.getTime();\n const toMs = to.getTime() + 86400000; // Include the full end day\n const fromStr = from.toISOString().split('T')[0];\n const toStr = to.toISOString().split('T')[0];\n\n // Filter by actual file modification time\n const matched = mdFiles\n .filter(f => f.mtime >= fromMs && f.mtime <= toMs)\n .slice(0, limit);\n\n const formatted = matched.map((f, i) => {\n const date = new Date(f.mtime).toISOString().split('T')[0];\n return `${i + 1}. ${f.path} — modified ${date}`;\n }).join('\\n');\n\n return {\n content: [{\n type: 'text',\n text: `Notes modified from ${fromStr} to ${toStr}:\\n\\n` +\n (formatted || 'No notes found in this range.') +\n `\\n\\nTotal markdown files in vault: ${mdFiles.length}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Date search error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_recent ───────────────────────────────────────────────────\n server.tool(\n 'find_recent',\n 'Get recently modified notes in the vault, sorted by modification time (newest first).',\n {\n limit: z.number().optional().default(10).describe('Number of recent notes to return'),\n },\n async ({ limit }) => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n const recent = mdFiles.slice(0, limit);\n\n const formatted = recent.map((f, i) => {\n const age = Date.now() - f.mtime;\n const mins = Math.floor(age / 60000);\n const hours = Math.floor(mins / 60);\n const days = Math.floor(hours / 24);\n const timeAgo = days > 0 ? `${days}d ago` : hours > 0 ? `${hours}h ago` : `${mins}m ago`;\n return `${i + 1}. ${f.path} — ${timeAgo}`;\n }).join('\\n');\n\n return {\n content: [{\n type: 'text',\n text: `Recently modified notes (${mdFiles.length} total):\\n\\n${formatted}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Recent notes error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_mentions ─────────────────────────────────────────────────\n server.tool(\n 'find_mentions',\n 'Find all notes that mention a specific term, concept, or person. Searches for exact text matches across the vault.',\n {\n term: z.string().max(200).describe('Term or concept to search for'),\n limit: z.number().optional().default(20).describe('Maximum results'),\n },\n async ({ term, limit }) => {\n try {\n const results = await client.searchWithContext(term, 150);\n\n if (results.length === 0) {\n return { content: [{ type: 'text', text: `\"${term}\" is not mentioned in any notes.` }] };\n }\n\n const formatted = results.slice(0, limit).map((r, i) => {\n const context = r.matches[0]?.context?.trim() ?? '';\n return `${i + 1}. **${r.filename}**\\n > ${context}`;\n }).join('\\n\\n');\n\n return {\n content: [{ type: 'text', text: `\"${term}\" mentioned in ${results.length} notes:\\n\\n${formatted}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Mentions search error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { extractSection, parseFrontmatter, extractTags, extractWikilinks, wordCount } from '@/utils/markdown.js';\nimport { today, weekDates } from '@/utils/dates.js';\n\nexport function registerReadTools(server: McpServer, client: ObsidianClient, config: MindCacheConfig): void {\n // ─── read_note ─────────────────────────────────────────────────────\n server.tool(\n 'read_note',\n 'Read the full content of a note by its path. Returns the complete markdown including frontmatter.',\n { path: z.string().describe('Path to the note (e.g., \"Projects/My Project.md\")') },\n async ({ path }) => {\n try {\n const content = await client.readNote(path);\n return { content: [{ type: 'text', text: content }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not read \"${path}\": ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── read_section ──────────────────────────────────────────────────\n server.tool(\n 'read_section',\n 'Read a specific section from a note, identified by its heading. Returns content from the heading to the next heading of the same or higher level.',\n {\n path: z.string().describe('Path to the note'),\n heading: z.string().describe('Heading text to extract (e.g., \"Key Points\", \"Action Items\")'),\n },\n async ({ path, heading }) => {\n try {\n const content = await client.readNote(path);\n const section = extractSection(content, heading);\n\n if (!section) {\n return {\n content: [{ type: 'text', text: `No section \"${heading}\" found in \"${path}\"` }],\n };\n }\n\n return { content: [{ type: 'text', text: section }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not read section: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── read_summary ─────────────────────────────────────────────────\n server.tool(\n 'read_summary',\n 'Get a note with its metadata: frontmatter properties, tags, wikilinks, and word count. Useful for understanding a note without reading it fully.',\n { path: z.string().describe('Path to the note') },\n async ({ path }) => {\n try {\n const content = await client.readNote(path);\n const { frontmatter } = parseFrontmatter(content);\n const tags = extractTags(content);\n const links = extractWikilinks(content);\n const words = wordCount(content);\n\n const summary = [\n `**${path}**`,\n '',\n `**Words:** ${words}`,\n tags.length > 0 ? `**Tags:** ${tags.map(t => `#${t}`).join(', ')}` : null,\n links.length > 0 ? `**Links:** ${links.map(l => `[[${l}]]`).join(', ')}` : null,\n Object.keys(frontmatter).length > 0\n ? `**Properties:**\\n${Object.entries(frontmatter).map(([k, v]) => ` - ${k}: ${typeof v === 'object' ? JSON.stringify(v) : String(v)}`).join('\\n')}`\n : null,\n '',\n '---',\n '',\n content,\n ].filter(Boolean).join('\\n');\n\n return { content: [{ type: 'text', text: summary }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not read summary: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── read_properties ──────────────────────────────────────────────\n server.tool(\n 'read_properties',\n 'Read only the YAML frontmatter properties of a note. Fast way to check metadata without reading the full content.',\n { path: z.string().describe('Path to the note') },\n async ({ path }) => {\n try {\n const content = await client.readNote(path);\n const { frontmatter } = parseFrontmatter(content);\n\n if (Object.keys(frontmatter).length === 0) {\n return { content: [{ type: 'text', text: `No frontmatter found in \"${path}\"` }] };\n }\n\n const formatted = Object.entries(frontmatter)\n .map(([k, v]) => `${k}: ${typeof v === 'object' ? JSON.stringify(v) : String(v)}`)\n .join('\\n');\n\n return { content: [{ type: 'text', text: `Properties of \"${path}\":\\n\\n${formatted}` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not read properties: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── read_today ────────────────────────────────────────────────────\n server.tool(\n 'read_today',\n \"Read today's daily note. Returns the content of today's daily note based on your configured daily notes folder and format.\",\n {},\n async () => {\n try {\n const dailyPath = `${config.dailyNotes.folder}/${today()}.md`;\n const content = await client.readNote(dailyPath);\n return { content: [{ type: 'text', text: `**Today's Daily Note (${today()}):**\\n\\n${content}` }] };\n } catch {\n return {\n content: [{ type: 'text', text: `No daily note found for today (${today()}). Expected at: ${config.dailyNotes.folder}/${today()}.md` }],\n };\n }\n }\n );\n\n // ─── read_this_week ────────────────────────────────────────────────\n server.tool(\n 'read_this_week',\n \"Read all daily notes from the current week (Monday to Sunday). Useful for getting a weekly overview of activity.\",\n {},\n async () => {\n try {\n const dates = weekDates();\n const notes: string[] = [];\n\n for (const date of dates) {\n const path = `${config.dailyNotes.folder}/${date}.md`;\n try {\n const content = await client.readNote(path);\n notes.push(`## ${date}\\n\\n${content}`);\n } catch {\n // Skip missing daily notes\n }\n }\n\n if (notes.length === 0) {\n return { content: [{ type: 'text', text: `No daily notes found for this week (${dates[0]} to ${dates[6]}).` }] };\n }\n\n return {\n content: [{ type: 'text', text: `**This Week's Daily Notes:**\\n\\n${notes.join('\\n\\n---\\n\\n')}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not read weekly notes: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── extract_links ─────────────────────────────────────────────────\n server.tool(\n 'extract_links',\n 'Extract all links from a note — both [[wikilinks]] to other vault notes and external URLs. Useful for seeing what a note references.',\n { path: z.string().describe('Path to the note') },\n async ({ path }) => {\n try {\n const content = await client.readNote(path);\n const wikilinks = extractWikilinks(content);\n const urlPattern = /https?:\\/\\/[^\\s)>\\]]+/g;\n const urls = [...content.matchAll(urlPattern)].map(m => m[0]);\n\n if (wikilinks.length === 0 && urls.length === 0) {\n return { content: [{ type: 'text', text: `No links found in \"${path}\".` }] };\n }\n\n let response = `**Links in \"${path}\":**\\n`;\n\n if (wikilinks.length > 0) {\n response += `\\n**Wikilinks (${wikilinks.length}):**\\n`;\n response += wikilinks.map(l => `- [[${l}]]`).join('\\n');\n }\n\n if (urls.length > 0) {\n response += `\\n\\n**URLs (${urls.length}):**\\n`;\n response += urls.map(u => `- ${u}`).join('\\n');\n }\n\n return { content: [{ type: 'text', text: response }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not extract links: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { today } from '@/utils/dates.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst TEMPLATES_DIR = join(__dirname, '..', 'templates');\n\nexport type TemplateName =\n | 'decision'\n | 'meeting'\n | 'learning'\n | 'idea'\n | 'person'\n | 'project'\n | 'book'\n | 'article'\n | 'weekly-review'\n | 'session';\n\nconst TEMPLATE_CACHE = new Map<string, string>();\n\n/**\n * Load a built-in template by name.\n */\nexport function loadTemplate(name: TemplateName): string {\n if (TEMPLATE_CACHE.has(name)) return TEMPLATE_CACHE.get(name)!;\n\n const path = join(TEMPLATES_DIR, `${name}.md`);\n if (!existsSync(path)) {\n throw new Error(`Template \"${name}\" not found at ${path}`);\n }\n\n const content = readFileSync(path, 'utf-8');\n TEMPLATE_CACHE.set(name, content);\n return content;\n}\n\n/**\n * Apply variables to a template string.\n * Variables are in {{variable}} format.\n */\nexport function applyTemplate(template: string, variables: Record<string, string>): string {\n let result = template;\n\n // Built-in variables\n const builtins: Record<string, string> = {\n date: today(),\n timestamp: new Date().toISOString(),\n year: String(new Date().getFullYear()),\n month: String(new Date().getMonth() + 1).padStart(2, '0'),\n day: String(new Date().getDate()).padStart(2, '0'),\n };\n\n const allVars = { ...builtins, ...variables };\n\n for (const [key, value] of Object.entries(allVars)) {\n result = result.replaceAll(`{{${key}}}`, value ?? '');\n }\n\n // Remove any remaining unresolved variables\n result = result.replace(/\\{\\{[^}]+\\}\\}/g, '');\n\n return result;\n}\n\n/**\n * Get a template and apply variables.\n */\nexport function renderTemplate(name: TemplateName, variables: Record<string, string> = {}): string {\n const template = loadTemplate(name);\n return applyTemplate(template, variables);\n}\n\n/**\n * List all available template names.\n */\nexport function listTemplates(): TemplateName[] {\n return [\n 'decision', 'meeting', 'learning', 'idea', 'person',\n 'project', 'book', 'article', 'weekly-review', 'session',\n ];\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { renderTemplate } from '@/templates.js';\nimport { today } from '@/utils/dates.js';\n\n/**\n * Ensure a note path is unique. If the path already exists, append a numeric suffix.\n */\nasync function uniquePath(client: ObsidianClient, basePath: string): Promise<string> {\n let path = basePath;\n let i = 1;\n while (true) {\n try {\n await client.readNote(path);\n // File exists, try next suffix\n const ext = basePath.endsWith('.md') ? '.md' : '';\n const base = basePath.replace(/\\.md$/, '');\n path = `${base} ${i}${ext}`;\n i++;\n } catch {\n // File doesn't exist, this path is safe\n return path;\n }\n }\n}\n\nexport function registerRememberTools(server: McpServer, client: ObsidianClient, config: MindCacheConfig): void {\n // ─── remember ──────────────────────────────────────────────────────\n server.tool(\n 'remember',\n 'Quick capture — save a thought, note, or piece of information to the vault. Auto-saves to the inbox folder. Use this for quick, unstructured captures.',\n {\n content: z.string().max(100_000).describe('The content to save'),\n title: z.string().max(200).optional().describe('Optional title for the note. If omitted, generates from content.'),\n tags: z.array(z.string()).max(50).optional().describe('Optional tags to add (without # prefix)'),\n folder: z.string().optional().describe('Optional folder to save to (defaults to inbox)'),\n },\n async ({ content, title, tags, folder }) => {\n try {\n const noteTitle = title ?? `Quick Note - ${today()} ${new Date().toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit' })}`;\n const targetFolder = folder ?? config.inbox.folder;\n const path = `${targetFolder}/${noteTitle}.md`;\n\n const tagLine = tags && tags.length > 0\n ? `tags:\\n${tags.map(t => ` - ${t}`).join('\\n')}`\n : 'tags:\\n - inbox';\n\n const noteContent = `---\\ndate: ${today()}\\n${tagLine}\\n---\\n\\n${content}\\n`;\n\n await client.writeNote(path, noteContent);\n\n return {\n content: [{ type: 'text', text: `Saved to \"${path}\"` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not save note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── remember_meeting ──────────────────────────────────────────────\n server.tool(\n 'remember_meeting',\n 'Create a structured meeting note with attendees, agenda, notes, and action items. Uses the meeting template.',\n {\n title: z.string().describe('Meeting title'),\n attendees: z.string().describe('Comma-separated list of attendees'),\n agenda: z.string().optional().default('').describe('Meeting agenda'),\n notes: z.string().optional().default('').describe('Meeting notes'),\n action_items: z.string().optional().default('').describe('Action items from the meeting'),\n follow_up: z.string().optional().default('').describe('Follow-up items'),\n folder: z.string().optional().describe('Folder to save to (defaults to inbox)'),\n },\n async ({ title, attendees, agenda, notes, action_items, follow_up, folder }) => {\n try {\n const content = renderTemplate('meeting', {\n title, attendees, agenda, notes, action_items, follow_up,\n });\n const targetFolder = folder ?? config.inbox.folder;\n const path = await uniquePath(client, `${targetFolder}/${title}.md`);\n await client.writeNote(path, content);\n\n return { content: [{ type: 'text', text: `Meeting note created at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not create meeting note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── remember_decision ─────────────────────────────────────────────\n server.tool(\n 'remember_decision',\n 'Log a decision using the ADR (Architecture Decision Record) format. Captures the context, decision, consequences, and alternatives considered.',\n {\n title: z.string().describe('Decision title'),\n context: z.string().describe('Why this decision needed to be made'),\n decision: z.string().describe('What was decided'),\n consequences: z.string().optional().default('').describe('What happens as a result'),\n alternatives: z.string().optional().default('').describe('Other options that were considered'),\n related: z.string().optional().default('').describe('Related notes or concepts'),\n folder: z.string().optional().describe('Folder to save to'),\n },\n async ({ title, context, decision, consequences, alternatives, related, folder }) => {\n try {\n const content = renderTemplate('decision', {\n title, context, decision, consequences, alternatives, related,\n });\n const targetFolder = folder ?? config.inbox.folder;\n const path = await uniquePath(client, `${targetFolder}/${title}.md`);\n await client.writeNote(path, content);\n\n return { content: [{ type: 'text', text: `Decision logged at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not log decision: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── remember_idea ─────────────────────────────────────────────────\n server.tool(\n 'remember_idea',\n 'Capture an idea with context on why it matters and potential next steps.',\n {\n title: z.string().describe('Idea title'),\n idea: z.string().describe('Description of the idea'),\n why: z.string().optional().default('').describe('Why this idea matters'),\n next_steps: z.string().optional().default('').describe('Potential next steps'),\n related: z.string().optional().default('').describe('Related notes or concepts'),\n tags: z.array(z.string()).optional().describe('Additional tags'),\n folder: z.string().optional().describe('Folder to save to'),\n },\n async ({ title, idea, why, next_steps, related, tags, folder }) => {\n try {\n const content = renderTemplate('idea', {\n title, idea, why, next_steps, related,\n tags: tags ? tags.map(t => ` - ${t}`).join('\\n') : '',\n });\n const targetFolder = folder ?? config.inbox.folder;\n const path = await uniquePath(client, `${targetFolder}/${title}.md`);\n await client.writeNote(path, content);\n\n return { content: [{ type: 'text', text: `Idea captured at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not capture idea: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── remember_learning ─────────────────────────────────────────────\n server.tool(\n 'remember_learning',\n 'Save something new you learned — a concept, technique, insight, or skill with examples and application notes.',\n {\n title: z.string().describe('What was learned'),\n concept: z.string().describe('The concept or insight'),\n key_points: z.string().optional().default('').describe('Key points to remember'),\n examples: z.string().optional().default('').describe('Examples or illustrations'),\n application: z.string().optional().default('').describe('How to apply this learning'),\n source: z.string().optional().default('').describe('Where you learned this'),\n related: z.string().optional().default('').describe('Related notes'),\n folder: z.string().optional().describe('Folder to save to'),\n },\n async ({ title, concept, key_points, examples, application, source, related, folder }) => {\n try {\n const content = renderTemplate('learning', {\n title, concept, key_points, examples, application, source, related,\n });\n const targetFolder = folder ?? config.inbox.folder;\n const path = await uniquePath(client, `${targetFolder}/${title}.md`);\n await client.writeNote(path, content);\n\n return { content: [{ type: 'text', text: `Learning saved at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not save learning: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── remember_person ───────────────────────────────────────────────\n server.tool(\n 'remember_person',\n 'Create or update a note about a person — their role, organization, context, and interactions.',\n {\n name: z.string().describe('Person\\'s name'),\n role: z.string().optional().default('').describe('Their role or title'),\n organization: z.string().optional().default('').describe('Their organization'),\n contact: z.string().optional().default('').describe('Contact information'),\n context: z.string().optional().default('').describe('How you know them or relevant context'),\n interaction: z.string().optional().default('').describe('Notes from recent interaction'),\n notes: z.string().optional().default('').describe('Additional notes'),\n folder: z.string().optional().describe('Folder to save to'),\n },\n async ({ name, role, organization, contact, context, interaction, notes, folder }) => {\n try {\n const content = renderTemplate('person', {\n name, role, organization, contact, context, interaction, notes,\n });\n const targetFolder = folder ?? config.inbox.folder;\n const path = await uniquePath(client, `${targetFolder}/${name}.md`);\n await client.writeNote(path, content);\n\n return { content: [{ type: 'text', text: `Person note created at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not create person note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── remember_reference ────────────────────────────────────────────\n server.tool(\n 'remember_reference',\n 'Bookmark a URL or resource with a summary, tags, and personal notes. Great for saving articles, videos, tools, or documentation.',\n {\n title: z.string().describe('Title of the resource'),\n url: z.string().url().describe('URL of the resource'),\n source: z.string().optional().default('').describe('Source (e.g., \"Hacker News\", \"Twitter\")'),\n summary: z.string().optional().default('').describe('Brief summary'),\n takeaways: z.string().optional().default('').describe('Key takeaways'),\n thoughts: z.string().optional().default('').describe('Your personal thoughts'),\n related: z.string().optional().default('').describe('Related notes'),\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\n folder: z.string().optional().describe('Folder to save to'),\n },\n async ({ title, url, source, summary, takeaways, thoughts, related, tags, folder }) => {\n try {\n const content = renderTemplate('article', {\n title, url, source, summary, takeaways, thoughts, related,\n tags: tags ? tags.map(t => ` - ${t}`).join('\\n') : '',\n });\n const targetFolder = folder ?? config.inbox.folder;\n const path = await uniquePath(client, `${targetFolder}/${title}.md`);\n await client.writeNote(path, content);\n\n return { content: [{ type: 'text', text: `Reference saved at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not save reference: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","/**\n * Fisher-Yates shuffle — unbiased in-place array shuffle.\n * Returns the same array reference (mutated).\n */\nexport function shuffle<T>(arr: T[]): T[] {\n for (let i = arr.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [arr[i], arr[j]] = [arr[j], arr[i]];\n }\n return arr;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { today } from '@/utils/dates.js';\nimport { extractSection, extractTags, extractTasks } from '@/utils/markdown.js';\nimport { shuffle } from '@/utils/shuffle.js';\n\nexport function registerJournalTools(server: McpServer, client: ObsidianClient, config: MindCacheConfig): void {\n // ─── log ───────────────────────────────────────────────────────────\n server.tool(\n 'log',\n \"Append an entry to today's daily note. Creates the daily note if it doesn't exist. Adds entries under a configurable heading with timestamps.\",\n {\n entry: z.string().describe('The entry to add to the daily note'),\n heading: z.string().optional().default('Log').describe('Heading to add the entry under (default: \"Log\")'),\n },\n async ({ entry, heading }) => {\n try {\n const dailyPath = `${config.dailyNotes.folder}/${today()}.md`;\n const time = new Date().toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n });\n const formattedEntry = `\\n- ${time} — ${entry}`;\n\n // Try to append to existing note\n let noteContent: string | null = null;\n try {\n noteContent = await client.readNote(dailyPath);\n } catch {\n // Note doesn't exist\n }\n\n if (noteContent !== null) {\n // Note exists — check if heading exists before patching\n const section = extractSection(noteContent, heading);\n if (section) {\n await client.patchNote(dailyPath, formattedEntry, {\n operation: 'append',\n targetHeading: heading,\n });\n } else {\n await client.appendToNote(dailyPath, `\\n## ${heading}\\n${formattedEntry}\\n`);\n }\n } else {\n // Note doesn't exist, create it\n const content = `---\\ndate: ${today()}\\ntags:\\n - daily\\n---\\n\\n# ${today()}\\n\\n## ${heading}\\n${formattedEntry}\\n`;\n await client.writeNote(dailyPath, content);\n }\n\n return {\n content: [{ type: 'text', text: `Logged to daily note (${today()}): ${entry}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not log entry: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── log_task ──────────────────────────────────────────────────────\n server.tool(\n 'log_task',\n \"Add a task (checkbox item) to today's daily note. Creates the daily note if it doesn't exist.\",\n {\n task: z.string().describe('The task description'),\n heading: z.string().optional().default('Tasks').describe('Heading to add the task under (default: \"Tasks\")'),\n },\n async ({ task, heading }) => {\n try {\n const dailyPath = `${config.dailyNotes.folder}/${today()}.md`;\n const formattedTask = `\\n- [ ] ${task}`;\n\n let noteContent: string | null = null;\n try {\n noteContent = await client.readNote(dailyPath);\n } catch {\n // Note doesn't exist\n }\n\n if (noteContent !== null) {\n const section = extractSection(noteContent, heading);\n if (section) {\n await client.patchNote(dailyPath, formattedTask, {\n operation: 'append',\n targetHeading: heading,\n });\n } else {\n await client.appendToNote(dailyPath, `\\n## ${heading}\\n${formattedTask}\\n`);\n }\n } else {\n const content = `---\\ndate: ${today()}\\ntags:\\n - daily\\n---\\n\\n# ${today()}\\n\\n## ${heading}\\n${formattedTask}\\n`;\n await client.writeNote(dailyPath, content);\n }\n\n return {\n content: [{ type: 'text', text: `Task added to daily note: ${task}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not add task: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── reflect ───────────────────────────────────────────────────────\n server.tool(\n 'reflect',\n \"Generate reflection prompts based on recent vault activity. Reads today's and recent daily notes to suggest areas for reflection.\",\n {},\n async () => {\n try {\n // Try to read today's daily note for context\n let todayContent = '';\n try {\n const dailyPath = `${config.dailyNotes.folder}/${today()}.md`;\n todayContent = await client.readNote(dailyPath);\n } catch {\n // No daily note today\n }\n\n // Analyze today's content for context-aware prompts\n const contextPrompts: string[] = [];\n if (todayContent) {\n const tasks = extractTasks(todayContent);\n const openTasks = tasks.filter(t => !t.done);\n const doneTasks = tasks.filter(t => t.done);\n const tags = extractTags(todayContent);\n\n if (openTasks.length > 0) {\n contextPrompts.push(`You have ${openTasks.length} open task(s). Which one deserves your focus next, and why?`);\n }\n if (doneTasks.length > 0) {\n contextPrompts.push(`You completed ${doneTasks.length} task(s) today. What did you learn from that work?`);\n }\n if (tags.length > 0) {\n contextPrompts.push(`Today's note touches on ${tags.map(t => `#${t}`).join(', ')}. How are these topics connected?`);\n }\n }\n\n // Generic prompts as fallback/supplement\n const genericPrompts = [\n \"What was the most important thing you learned today?\",\n \"What decision did you make that you want to remember?\",\n \"What are you most proud of from today's work?\",\n \"What would you do differently next time?\",\n \"What's one thing you want to explore further?\",\n \"Who helped you today, and how?\",\n \"What's blocking you right now?\",\n \"What's one thing you're grateful for today?\",\n ];\n\n // Combine context-aware and generic prompts\n const genericCount = Math.max(1, 4 - contextPrompts.length);\n const selected = [\n ...contextPrompts.slice(0, 3),\n ...shuffle([...genericPrompts]).slice(0, genericCount),\n ];\n\n let response = `**Reflection Prompts for ${today()}:**\\n\\n`;\n response += selected.map((p, i) => `${i + 1}. ${p}`).join('\\n');\n\n if (todayContent) {\n response += `\\n\\n---\\n\\n**Today's note preview:**\\n${todayContent.slice(0, 500)}`;\n } else {\n response += `\\n\\n---\\n\\nNo daily note yet for today. Use \\`log\\` to start one.`;\n }\n\n response += '\\n\\nTip: Use `log` to add your reflections to today\\'s daily note.';\n\n return { content: [{ type: 'text', text: response }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Reflection error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { renderTemplate } from '@/templates.js';\nimport { replaceSection } from '@/utils/markdown.js';\n\nexport function registerWriteTools(server: McpServer, client: ObsidianClient, _config: MindCacheConfig): void {\n // ─── create_note ───────────────────────────────────────────────────\n server.tool(\n 'create_note',\n 'Create a new note in the vault. Supports optional templates, folder routing, and frontmatter. Will not overwrite existing notes unless explicitly requested.',\n {\n path: z.string().max(500).describe('Path for the new note (e.g., \"Projects/My Project.md\")'),\n content: z.string().max(100_000).describe('Markdown content for the note'),\n template: z.enum(['decision', 'meeting', 'learning', 'idea', 'person', 'project', 'book', 'article', 'weekly-review', 'session']).optional().describe('Optional template to use'),\n variables: z.record(z.string()).optional().describe('Template variables as key-value pairs'),\n overwrite: z.boolean().optional().default(false).describe('Whether to overwrite if note already exists'),\n },\n async ({ path, content, template, variables, overwrite }) => {\n try {\n // Check if note exists\n if (!overwrite) {\n try {\n await client.readNote(path);\n return {\n content: [{ type: 'text', text: `Note already exists at \"${path}\". Set overwrite=true to replace it.` }],\n };\n } catch {\n // Note doesn't exist, proceed\n }\n }\n\n let finalContent = content;\n if (template) {\n finalContent = renderTemplate(template, { ...variables, content });\n }\n\n await client.writeNote(path, finalContent);\n\n return { content: [{ type: 'text', text: `Note created at \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not create note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── append_to_note ────────────────────────────────────────────────\n server.tool(\n 'append_to_note',\n 'Append content to the end of an existing note. The note must already exist.',\n {\n path: z.string().max(500).describe('Path to the note to append to'),\n content: z.string().max(100_000).describe('Content to append'),\n },\n async ({ path, content }) => {\n try {\n await client.appendToNote(path, `\\n${content}\\n`);\n return { content: [{ type: 'text', text: `Content appended to \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not append to note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── update_section ────────────────────────────────────────────────\n server.tool(\n 'update_section',\n 'Replace the content under a specific heading in a note. Useful for updating a section without modifying the rest of the note.',\n {\n path: z.string().describe('Path to the note'),\n heading: z.string().describe('Heading text of the section to replace'),\n content: z.string().describe('New content for the section'),\n },\n async ({ path, heading, content }) => {\n try {\n const noteContent = await client.readNote(path);\n const updated = replaceSection(noteContent, heading, content);\n await client.writeNote(path, updated);\n\n return { content: [{ type: 'text', text: `Section \"${heading}\" updated in \"${path}\"` }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not update section: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── delete_note ──────────────────────────────────────────────────\n server.tool(\n 'delete_note',\n 'Permanently delete a note from the vault. This cannot be undone.',\n {\n path: z.string().max(500).describe('Path to the note to delete'),\n confirm: z.boolean().describe('Must be true to confirm deletion'),\n },\n async ({ path, confirm }) => {\n if (!confirm) {\n return {\n content: [{ type: 'text', text: `Deletion not confirmed. Set confirm=true to delete \"${path}\".` }],\n };\n }\n try {\n await client.deleteNote(path);\n return {\n content: [{ type: 'text', text: `Deleted \"${path}\"` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not delete note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { extractWikilinks, extractTags, extractSection } from '@/utils/markdown.js';\nimport { shuffle } from '@/utils/shuffle.js';\n\nexport function registerConnectTools(server: McpServer, client: ObsidianClient, _config: MindCacheConfig): void {\n // ─── add_link ──────────────────────────────────────────────────────\n server.tool(\n 'add_link',\n 'Add a [[wikilink]] to a note, connecting it to another note in the vault. Appends the link under a \"Related\" heading or at the end of the note.',\n {\n path: z.string().describe('Path of the note to add the link to'),\n target: z.string().describe('Name of the note to link to (without .md extension)'),\n context: z.string().optional().describe('Optional context for why these notes are related'),\n },\n async ({ path, target, context }) => {\n try {\n const content = await client.readNote(path);\n const existingLinks = extractWikilinks(content);\n\n if (existingLinks.includes(target)) {\n return {\n content: [{ type: 'text', text: `\"${path}\" already links to [[${target}]]` }],\n };\n }\n\n const linkLine = context\n ? `\\n- [[${target}]] — ${context}`\n : `\\n- [[${target}]]`;\n\n // Append under \"Related\" heading if it exists, otherwise create it\n const relatedSection = extractSection(content, 'Related');\n if (relatedSection) {\n await client.patchNote(path, linkLine, {\n operation: 'append',\n targetHeading: 'Related',\n });\n } else {\n await client.appendToNote(path, `\\n## Related\\n${linkLine}\\n`);\n }\n\n return {\n content: [{ type: 'text', text: `Added link to [[${target}]] in \"${path}\"` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not add link: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── suggest_connections ───────────────────────────────────────────\n server.tool(\n 'suggest_connections',\n 'Analyze a note and suggest other notes that could be linked to it. Uses shared tags, mentions, and content similarity to find connections.',\n {\n path: z.string().describe('Path to the note to analyze'),\n limit: z.number().optional().default(10).describe('Maximum suggestions to return'),\n },\n async ({ path, limit }) => {\n try {\n const content = await client.readNote(path);\n const existingLinks = extractWikilinks(content);\n const tags = extractTags(content);\n\n const suggestions = new Map<string, string[]>();\n\n // Collect all queries and run in a single batch scan\n const queries: string[] = [];\n const queryMeta: Array<{ type: 'tag' | 'word'; label: string }> = [];\n\n for (const tag of tags.slice(0, 5)) {\n queries.push(`tag:#${tag}`);\n queryMeta.push({ type: 'tag', label: tag });\n }\n\n // Extract meaningful keywords — strip punctuation, filter stop words, deduplicate\n const stopWords = new Set(['about', 'above', 'after', 'again', 'against', 'being', 'below', 'between', 'could', 'during', 'every', 'further', 'having', 'itself', 'might', 'other', 'ought', 'shall', 'should', 'their', 'there', 'these', 'those', 'through', 'under', 'until', 'where', 'which', 'while', 'would', 'your']);\n const allWords = [...new Set(\n content\n .replace(/[^\\w\\s]/g, ' ')\n .split(/\\s+/)\n .map(w => w.toLowerCase())\n .filter(w => w.length > 5 && !stopWords.has(w))\n )];\n // Sample evenly from across the content\n const step = Math.max(1, Math.floor(allWords.length / 5));\n const words: string[] = [];\n for (let i = 0; i < allWords.length && words.length < 5; i += step) {\n words.push(allWords[i]);\n }\n for (const word of words.slice(0, 3)) {\n queries.push(word);\n queryMeta.push({ type: 'word', label: word });\n }\n\n const batchResults = await client.searchBatch(queries, { limit: 5 });\n\n for (let i = 0; i < queries.length; i++) {\n const results = batchResults.get(queries[i]) ?? [];\n const meta = queryMeta[i];\n\n for (const r of results) {\n if (r.filename === path || existingLinks.includes(r.filename.replace(/\\.md$/, ''))) continue;\n const reasons = suggestions.get(r.filename) ?? [];\n const reason = meta.type === 'tag'\n ? `Shared tag: #${meta.label}`\n : `Mentions: \"${meta.label}\"`;\n if (!reasons.includes(reason)) {\n reasons.push(reason);\n suggestions.set(r.filename, reasons);\n }\n }\n }\n\n const sorted = [...suggestions.entries()]\n .sort((a, b) => b[1].length - a[1].length)\n .slice(0, limit);\n\n if (sorted.length === 0) {\n return {\n content: [{ type: 'text', text: `No connection suggestions found for \"${path}\". The note may be well-connected already!` }],\n };\n }\n\n const formatted = sorted.map(([file, reasons], i) =>\n `${i + 1}. **${file}**\\n ${reasons.join(', ')}`\n ).join('\\n\\n');\n\n return {\n content: [{\n type: 'text',\n text: `Suggested connections for \"${path}\":\\n\\n${formatted}\\n\\nUse \\`add_link\\` to connect any of these notes.`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not suggest connections: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_gaps ─────────────────────────────────────────────────────\n server.tool(\n 'find_gaps',\n 'Find broken links in the vault — [[wikilinks]] that point to notes that don\\'t exist. These represent knowledge gaps or notes waiting to be written.',\n {\n limit: z.number().optional().default(20).describe('Maximum gaps to return'),\n },\n async ({ limit }) => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n // Build lookup set with both basename and full path (without extension)\n const existingNotes = new Set<string>();\n for (const f of mdFiles) {\n existingNotes.add(f.name.toLowerCase());\n existingNotes.add(f.path.replace(/\\.md$/, '').toLowerCase());\n }\n\n const gaps = new Map<string, string[]>();\n\n // Scan all notes for broken links (sample for large vaults)\n const sampled = mdFiles.length <= 500\n ? mdFiles\n : shuffle([...mdFiles]).slice(0, 200);\n const sampleSize = sampled.length;\n\n for (const file of sampled) {\n try {\n const content = await client.readNote(file.path);\n const links = extractWikilinks(content);\n\n for (const link of links) {\n if (!existingNotes.has(link.toLowerCase())) {\n const sources = gaps.get(link) ?? [];\n sources.push(file.path);\n gaps.set(link, sources);\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n const sorted = [...gaps.entries()]\n .sort((a, b) => b[1].length - a[1].length)\n .slice(0, limit);\n\n if (sorted.length === 0) {\n return {\n content: [{ type: 'text', text: `No broken links found (sampled ${sampleSize} of ${mdFiles.length} notes).` }],\n };\n }\n\n const formatted = sorted.map(([link, sources], i) =>\n `${i + 1}. **[[${link}]]** — referenced by ${sources.length} note(s): ${sources.slice(0, 3).join(', ')}${sources.length > 3 ? '...' : ''}`\n ).join('\\n');\n\n return {\n content: [{\n type: 'text',\n text: `Knowledge gaps (broken links) found in vault:\\n\\n${formatted}\\n\\nThese are concepts referenced but not yet written about. Use \\`create_note\\` to fill them in.`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not find gaps: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── find_orphans ──────────────────────────────────────────────────\n server.tool(\n 'find_orphans',\n 'Find orphan notes — notes with no incoming or outgoing links. These are disconnected from the knowledge graph and might need connecting.',\n {\n limit: z.number().optional().default(20).describe('Maximum orphans to return'),\n },\n async ({ limit }) => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n // Build a set of all notes that are linked to or link out\n const linked = new Set<string>();\n const sampled = mdFiles.length <= 500\n ? mdFiles\n : shuffle([...mdFiles]).slice(0, 200);\n const sampleSize = sampled.length;\n\n // Build a lookup for resolving wikilinks to file paths\n const nameToPath = new Map<string, string>();\n for (const f of mdFiles) {\n nameToPath.set(f.name.toLowerCase(), f.path);\n nameToPath.set(f.path.replace(/\\.md$/, '').toLowerCase(), f.path);\n }\n\n for (const file of sampled) {\n try {\n const content = await client.readNote(file.path);\n const outlinks = extractWikilinks(content);\n\n if (outlinks.length > 0) {\n linked.add(file.path);\n for (const link of outlinks) {\n const targetPath = nameToPath.get(link.toLowerCase());\n if (targetPath) linked.add(targetPath);\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n const orphans = sampled\n .filter(f => !linked.has(f.path))\n .slice(0, limit);\n\n if (orphans.length === 0) {\n return {\n content: [{ type: 'text', text: `No orphan notes found (sampled ${sampleSize} notes). Your vault is well-connected!` }],\n };\n }\n\n const formatted = orphans.map((f, i) =>\n `${i + 1}. ${f.path}`\n ).join('\\n');\n\n return {\n content: [{\n type: 'text',\n text: `Orphan notes (no links in or out):\\n\\n${formatted}\\n\\nConsider linking these to related notes using \\`add_link\\` or \\`suggest_connections\\`.`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not find orphans: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { parseFrontmatter, serializeFrontmatter } from '@/utils/markdown.js';\n\nexport function registerOrganizeTools(server: McpServer, client: ObsidianClient, _config: MindCacheConfig): void {\n // ─── add_tag ───────────────────────────────────────────────────────\n server.tool(\n 'add_tag',\n 'Add one or more tags to a note. Tags are added to the YAML frontmatter. If the note has no frontmatter, it will be created.',\n {\n path: z.string().describe('Path to the note'),\n tags: z.array(z.string()).max(50).describe('Tags to add (without # prefix)'),\n },\n async ({ path, tags }) => {\n try {\n const content = await client.readNote(path);\n const { frontmatter, body } = parseFrontmatter(content);\n\n // Parse existing tags — handle string, array, or missing\n const existing = frontmatter.tags;\n const existingTags: string[] = Array.isArray(existing)\n ? existing.map(String)\n : typeof existing === 'string' && existing.length > 0\n ? [existing]\n : [];\n\n const allTags = [...new Set([...existingTags, ...tags])];\n frontmatter.tags = allTags;\n\n const newContent = serializeFrontmatter(frontmatter, body);\n await client.writeNote(path, newContent);\n\n return {\n content: [{ type: 'text', text: `Added tags ${tags.map(t => `#${t}`).join(', ')} to \"${path}\"` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not add tags: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── update_properties ─────────────────────────────────────────────\n server.tool(\n 'update_properties',\n 'Update YAML frontmatter properties of a note. Can add new properties or modify existing ones.',\n {\n path: z.string().describe('Path to the note'),\n properties: z.record(z.string()).describe('Properties to set as key-value pairs (e.g., {\"status\": \"done\", \"priority\": \"high\"})'),\n },\n async ({ path, properties }) => {\n try {\n const content = await client.readNote(path);\n const { frontmatter, body } = parseFrontmatter(content);\n\n const merged = { ...frontmatter, ...properties };\n\n const newContent = serializeFrontmatter(merged, body);\n await client.writeNote(path, newContent);\n\n const updated = Object.entries(properties)\n .map(([k, v]) => `${k}: ${v}`)\n .join(', ');\n\n return {\n content: [{ type: 'text', text: `Updated properties in \"${path}\": ${updated}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not update properties: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── rename_note ───────────────────────────────────────────────────\n server.tool(\n 'rename_note',\n 'Rename a note by creating a copy at the new path and deleting the original. Note: Obsidian will update backlinks if the app is running.',\n {\n old_path: z.string().describe('Current path of the note'),\n new_path: z.string().describe('New path for the note'),\n },\n async ({ old_path, new_path }) => {\n try {\n const content = await client.readNote(old_path);\n\n // Check if target exists\n try {\n await client.readNote(new_path);\n return {\n content: [{ type: 'text', text: `A note already exists at \"${new_path}\". Choose a different name.` }],\n };\n } catch {\n // Target doesn't exist, proceed\n }\n\n await client.writeNote(new_path, content);\n\n // Update backlinks in other notes\n const oldName = old_path.replace(/\\.md$/, '').split('/').pop() ?? old_path;\n const newName = new_path.replace(/\\.md$/, '').split('/').pop() ?? new_path;\n let backlinkCount = 0;\n if (oldName !== newName) {\n backlinkCount = await client.updateBacklinks(oldName, newName);\n }\n\n await client.deleteNote(old_path);\n\n const backlinkMsg = backlinkCount > 0 ? ` Updated ${backlinkCount} backlink(s).` : '';\n return {\n content: [{ type: 'text', text: `Renamed \"${old_path}\" to \"${new_path}\".${backlinkMsg}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not rename note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── move_note ─────────────────────────────────────────────────────\n server.tool(\n 'move_note',\n 'Move a note to a different folder in the vault. Preserves the filename.',\n {\n path: z.string().describe('Current path of the note'),\n destination: z.string().describe('Destination folder (e.g., \"Projects\", \"Archive\")'),\n },\n async ({ path, destination }) => {\n try {\n const content = await client.readNote(path);\n const filename = path.split('/').pop() ?? path;\n const newPath = `${destination}/${filename}`;\n\n // Check if target exists\n try {\n await client.readNote(newPath);\n return {\n content: [{ type: 'text', text: `A note already exists at \"${newPath}\". Rename the note first.` }],\n };\n } catch {\n // Target doesn't exist, proceed\n }\n\n await client.writeNote(newPath, content);\n\n // Update backlinks if the filename changed\n const oldName = path.replace(/\\.md$/, '').split('/').pop() ?? path;\n const newName = newPath.replace(/\\.md$/, '').split('/').pop() ?? newPath;\n let backlinkCount = 0;\n if (oldName !== newName) {\n backlinkCount = await client.updateBacklinks(oldName, newName);\n }\n\n await client.deleteNote(path);\n\n const backlinkMsg = backlinkCount > 0 ? ` Updated ${backlinkCount} backlink(s).` : '';\n return {\n content: [{ type: 'text', text: `Moved \"${path}\" to \"${newPath}\".${backlinkMsg}` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not move note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { extractTags } from '@/utils/markdown.js';\nimport { shuffle } from '@/utils/shuffle.js';\n\nexport function registerUnderstandTools(server: McpServer, client: ObsidianClient, _config: MindCacheConfig): void {\n // ─── vault_overview ────────────────────────────────────────────────\n server.tool(\n 'vault_overview',\n 'Get an overview of your Obsidian vault: total notes, folder structure, tag distribution, and general statistics.',\n {},\n async () => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n const otherFiles = files.filter(f => f.extension !== 'md');\n\n // Count files per folder\n const folderCounts = new Map<string, number>();\n for (const file of mdFiles) {\n const parts = file.path.split('/');\n const folder = parts.length > 1 ? parts.slice(0, -1).join('/') : '(root)';\n folderCounts.set(folder, (folderCounts.get(folder) ?? 0) + 1);\n }\n\n const topFolders = [...folderCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 15);\n\n // Scan all notes for tags (sample for large vaults)\n const tagCounts = new Map<string, number>();\n const sampled = mdFiles.length <= 500\n ? mdFiles\n : shuffle([...mdFiles]).slice(0, 200);\n const sampleSize = sampled.length;\n\n for (const file of sampled) {\n try {\n const content = await client.readNote(file.path);\n const tags = extractTags(content);\n for (const tag of tags) {\n tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n const topTags = [...tagCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 15);\n\n let response = `**Vault Overview**\\n\\n`;\n response += `- **Total notes:** ${mdFiles.length}\\n`;\n response += `- **Other files:** ${otherFiles.length} (images, PDFs, etc.)\\n`;\n response += `- **Folders:** ${folderCounts.size}\\n\\n`;\n\n response += `**Top Folders:**\\n`;\n response += topFolders.map(([folder, count]) =>\n ` - ${folder}: ${count} notes`\n ).join('\\n');\n\n if (topTags.length > 0) {\n response += `\\n\\n**Top Tags** (from ${sampleSize} notes):\\n`;\n response += topTags.map(([tag, count]) =>\n ` - #${tag}: ${count}`\n ).join('\\n');\n }\n\n return { content: [{ type: 'text', text: response }] };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not get vault overview: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── list_tags ─────────────────────────────────────────────────────\n server.tool(\n 'list_tags',\n 'List all tags used in the vault with their occurrence counts. Samples notes to build the tag list.',\n {\n limit: z.number().optional().default(50).describe('Maximum tags to return'),\n },\n async ({ limit }) => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n const tagCounts = new Map<string, number>();\n const tagSampled = mdFiles.length <= 500\n ? mdFiles\n : shuffle([...mdFiles]).slice(0, 300);\n const sampleSize = tagSampled.length;\n\n for (const file of tagSampled) {\n try {\n const content = await client.readNote(file.path);\n const tags = extractTags(content);\n for (const tag of tags) {\n tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n const sorted = [...tagCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, limit);\n\n if (sorted.length === 0) {\n return { content: [{ type: 'text', text: 'No tags found in vault.' }] };\n }\n\n const formatted = sorted.map(([tag, count]) =>\n `#${tag} (${count})`\n ).join('\\n');\n\n return {\n content: [{\n type: 'text',\n text: `**Tags in vault** (sampled ${sampleSize} of ${mdFiles.length} notes):\\n\\n${formatted}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not list tags: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── get_vault_structure ───────────────────────────────────────────\n server.tool(\n 'get_vault_structure',\n 'Get the folder structure of the vault as a tree with note counts per folder. Useful for understanding vault organization.',\n {},\n async () => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n // Build folder tree\n const folders = new Map<string, number>();\n for (const file of mdFiles) {\n const parts = file.path.split('/');\n if (parts.length > 1) {\n // Add all parent folders\n for (let i = 1; i < parts.length; i++) {\n const folder = parts.slice(0, i).join('/');\n if (i === parts.length - 1) {\n // This is the direct parent\n folders.set(folder, (folders.get(folder) ?? 0) + 1);\n } else if (!folders.has(folder)) {\n folders.set(folder, 0);\n }\n }\n } else {\n folders.set('(root)', (folders.get('(root)') ?? 0) + 1);\n }\n }\n\n const sorted = [...folders.entries()].sort((a, b) => a[0].localeCompare(b[0]));\n\n const tree = sorted.map(([folder, count]) => {\n const depth = folder.split('/').length - 1;\n const indent = ' '.repeat(depth);\n const name = folder.split('/').pop() ?? folder;\n return `${indent}${name}/ (${count} notes)`;\n }).join('\\n');\n\n return {\n content: [{\n type: 'text',\n text: `**Vault Structure** (${mdFiles.length} total notes):\\n\\n${tree}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not get vault structure: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { extractTasks } from '@/utils/markdown.js';\nimport { shuffle } from '@/utils/shuffle.js';\n\nexport function registerTaskTools(server: McpServer, client: ObsidianClient, _config: MindCacheConfig): void {\n // ─── find_tasks ────────────────────────────────────────────────────\n server.tool(\n 'find_tasks',\n 'Find all checkbox tasks across the vault. Filter by status (open, done, or all). Returns tasks with their source note and line number.',\n {\n status: z.enum(['open', 'done', 'all']).optional().default('open').describe('Filter by task status'),\n query: z.string().optional().describe('Optional search query to filter tasks by text'),\n limit: z.number().optional().default(30).describe('Maximum tasks to return'),\n },\n async ({ status, query, limit }) => {\n try {\n // Search for tasks via checkbox pattern\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n const allTasks: Array<{\n text: string;\n done: boolean;\n file: string;\n line: number;\n }> = [];\n\n // Scan all files for tasks (sample for large vaults)\n const sampled = mdFiles.length <= 500\n ? mdFiles\n : shuffle([...mdFiles]).slice(0, 200);\n\n for (const file of sampled) {\n try {\n const content = await client.readNote(file.path);\n const tasks = extractTasks(content);\n\n for (const task of tasks) {\n if (query && !task.text.toLowerCase().includes(query.toLowerCase())) continue;\n if (status === 'open' && task.done) continue;\n if (status === 'done' && !task.done) continue;\n\n allTasks.push({\n text: task.text,\n done: task.done,\n file: file.path,\n line: task.line,\n });\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n if (allTasks.length === 0) {\n return {\n content: [{ type: 'text', text: `No ${status === 'all' ? '' : status + ' '}tasks found${query ? ` matching \"${query}\"` : ''}.` }],\n };\n }\n\n const displayed = allTasks.slice(0, limit);\n const formatted = displayed.map((t, i) =>\n `${i + 1}. [${t.done ? 'x' : ' '}] ${t.text}\\n *${t.file}:${t.line}*`\n ).join('\\n\\n');\n\n return {\n content: [{\n type: 'text',\n text: `**${status === 'all' ? 'All' : status === 'open' ? 'Open' : 'Completed'} Tasks** (${allTasks.length} found, showing ${displayed.length}):\\n\\n${formatted}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not find tasks: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── complete_task ─────────────────────────────────────────────────\n server.tool(\n 'complete_task',\n 'Mark a specific task as done by replacing [ ] with [x] at the given line in a note.',\n {\n path: z.string().describe('Path to the note containing the task'),\n line: z.number().describe('Line number of the task (1-based)'),\n },\n async ({ path, line }) => {\n try {\n const content = await client.readNote(path);\n const lines = content.split('\\n');\n\n if (line < 1 || line > lines.length) {\n return {\n content: [{ type: 'text', text: `Line ${line} is out of range (note has ${lines.length} lines)` }],\n isError: true,\n };\n }\n\n const targetLine = lines[line - 1];\n const match = targetLine.match(/^(\\s*-\\s+)\\[[ ]\\](\\s+.+)$/);\n\n if (!match) {\n return {\n content: [{ type: 'text', text: `Line ${line} is not an open task: \"${targetLine.trim()}\"` }],\n isError: true,\n };\n }\n\n lines[line - 1] = `${match[1]}[x]${match[2]}`;\n await client.writeNote(path, lines.join('\\n'));\n\n const taskText = match[2].trim();\n return {\n content: [{ type: 'text', text: `Completed task: \"${taskText}\" in \"${path}\"` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not complete task: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { parseFrontmatter, serializeFrontmatter, extractTags, extractTasks, extractWikilinks } from '@/utils/markdown.js';\n\nexport function registerVaultTools(server: McpServer, client: ObsidianClient, config: MindCacheConfig): void {\n // ─── bulk_tag ─────────────────────────────────────────────────────\n server.tool(\n 'bulk_tag',\n 'Add or remove tags across multiple notes matching a search query. Useful for vault-wide tag management and organization.',\n {\n query: z.string().max(500).describe('Search query to find notes to tag (same operators as search tool)'),\n add: z.array(z.string()).optional().describe('Tags to add (without # prefix)'),\n remove: z.array(z.string()).optional().describe('Tags to remove (without # prefix)'),\n limit: z.number().optional().default(50).describe('Maximum notes to modify'),\n },\n async ({ query, add, remove, limit }) => {\n if (!add?.length && !remove?.length) {\n return {\n content: [{ type: 'text', text: 'Specify at least one tag to add or remove.' }],\n isError: true,\n };\n }\n\n try {\n const results = await client.search(query, { limit });\n if (results.length === 0) {\n return { content: [{ type: 'text', text: `No notes matched \"${query}\".` }] };\n }\n\n let modified = 0;\n for (const result of results) {\n try {\n const content = await client.readNote(result.filename);\n const { frontmatter, body } = parseFrontmatter(content);\n\n // Get existing tags\n const existing = frontmatter.tags;\n let tags: string[] = Array.isArray(existing)\n ? existing.map(String)\n : typeof existing === 'string' && existing.length > 0\n ? [existing]\n : [];\n\n const before = tags.length;\n\n // Add tags\n if (add?.length) {\n tags = [...new Set([...tags, ...add])];\n }\n\n // Remove tags\n if (remove?.length) {\n const removeSet = new Set(remove);\n tags = tags.filter(t => !removeSet.has(t));\n }\n\n // Only write if changed\n if (tags.length !== before || add?.some(t => !tags.includes(t)) === false) {\n frontmatter.tags = tags.length > 0 ? tags : undefined;\n const newContent = serializeFrontmatter(\n Object.fromEntries(Object.entries(frontmatter).filter(([_, v]) => v !== undefined)),\n body,\n );\n await client.writeNote(result.filename, newContent);\n modified++;\n }\n } catch {\n // Skip notes that can't be modified\n }\n }\n\n const actions: string[] = [];\n if (add?.length) actions.push(`added ${add.map(t => `#${t}`).join(', ')}`);\n if (remove?.length) actions.push(`removed ${remove.map(t => `#${t}`).join(', ')}`);\n\n return {\n content: [{ type: 'text', text: `${actions.join(' and ')} — modified ${modified} of ${results.length} matching notes.` }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Bulk tag error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── daily_notes ──────────────────────────────────────────────────\n server.tool(\n 'daily_notes',\n 'List all daily notes in the vault with stats (entry count, task counts). Useful for reviewing journaling history and activity.',\n {\n limit: z.number().optional().default(30).describe('Maximum daily notes to return'),\n },\n async ({ limit }) => {\n try {\n const files = await client.listFiles();\n const dailyFolder = config.dailyNotes.folder;\n const dailyFiles = files\n .filter(f => f.extension === 'md' && f.path.startsWith(dailyFolder + '/'))\n .slice(0, limit);\n\n if (dailyFiles.length === 0) {\n return {\n content: [{ type: 'text', text: `No daily notes found in \"${dailyFolder}/\".` }],\n };\n }\n\n const entries: string[] = [];\n for (const file of dailyFiles) {\n try {\n const content = await client.readNote(file.path);\n const tasks = extractTasks(content);\n const openTasks = tasks.filter(t => !t.done).length;\n const doneTasks = tasks.filter(t => t.done).length;\n const lines = content.split('\\n').filter(l => l.startsWith('- ')).length;\n\n let stats = `${lines} entries`;\n if (tasks.length > 0) {\n stats += `, ${doneTasks}/${tasks.length} tasks done`;\n if (openTasks > 0) stats += ` (${openTasks} open)`;\n }\n\n entries.push(`- **${file.name}** — ${stats}`);\n } catch {\n entries.push(`- **${file.name}** — (unreadable)`);\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: `**Daily Notes** (${dailyFiles.length} found):\\n\\n${entries.join('\\n')}`,\n }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not list daily notes: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n\n // ─── export_note ──────────────────────────────────────────────────\n server.tool(\n 'export_note',\n 'Export a note as clean markdown (frontmatter stripped) or as structured JSON with metadata. Useful for sharing or processing notes externally.',\n {\n path: z.string().max(500).describe('Path to the note'),\n format: z.enum(['markdown', 'json']).optional().default('markdown').describe('Export format'),\n },\n async ({ path, format }) => {\n try {\n const content = await client.readNote(path);\n const { frontmatter, body } = parseFrontmatter(content);\n const tags = extractTags(content);\n const links = extractWikilinks(content);\n const tasks = extractTasks(content);\n\n if (format === 'json') {\n const exported = {\n path,\n title: typeof frontmatter.title === 'string' ? frontmatter.title : path.replace(/\\.md$/, '').split('/').pop(),\n frontmatter,\n tags,\n links,\n tasks: tasks.map(t => ({ text: t.text, done: t.done })),\n body: body.trim(),\n wordCount: body.split(/\\s+/).filter(w => w.length > 0).length,\n exportedAt: new Date().toISOString(),\n };\n return {\n content: [{ type: 'text', text: JSON.stringify(exported, null, 2) }],\n };\n }\n\n // Clean markdown — strip frontmatter\n return {\n content: [{ type: 'text', text: body.trim() }],\n };\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not export note: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n }\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { today } from '@/utils/dates.js';\nimport { extractTags } from '@/utils/markdown.js';\nimport { shuffle } from '@/utils/shuffle.js';\n\nexport function registerResources(server: McpServer, client: ObsidianClient, config: MindCacheConfig): void {\n // ─── vault://today ─────────────────────────────────────────────────\n server.resource(\n 'today',\n 'vault://today',\n { description: \"Today's daily note content. Auto-updates with the current day's note.\", mimeType: 'text/markdown' },\n async (uri) => {\n try {\n const dailyPath = `${config.dailyNotes.folder}/${today()}.md`;\n const content = await client.readNote(dailyPath);\n return {\n contents: [{ uri: uri.href, text: `# Today's Daily Note (${today()})\\n\\n${content}`, mimeType: 'text/markdown' }],\n };\n } catch {\n return {\n contents: [{ uri: uri.href, text: `No daily note for today (${today()}).`, mimeType: 'text/plain' }],\n };\n }\n }\n );\n\n // ─── vault://recent ────────────────────────────────────────────────\n server.resource(\n 'recent',\n 'vault://recent',\n { description: 'Summary of recently modified notes in the vault.', mimeType: 'text/markdown' },\n async (uri) => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md').slice(0, 10);\n\n const lines = mdFiles.map((f, i) => {\n const age = Date.now() - f.mtime;\n const mins = Math.floor(age / 60000);\n const hours = Math.floor(mins / 60);\n const days = Math.floor(hours / 24);\n const timeAgo = days > 0 ? `${days}d ago` : hours > 0 ? `${hours}h ago` : mins > 0 ? `${mins}m ago` : 'just now';\n return `${i + 1}. ${f.path} — ${timeAgo}`;\n }).join('\\n');\n\n return {\n contents: [{\n uri: uri.href,\n text: `# Recent Notes\\n\\n${lines}`,\n mimeType: 'text/markdown',\n }],\n };\n } catch {\n return {\n contents: [{ uri: uri.href, text: 'Could not fetch recent notes.', mimeType: 'text/plain' }],\n };\n }\n }\n );\n\n // ─── vault://tags ──────────────────────────────────────────────────\n server.resource(\n 'tags',\n 'vault://tags',\n { description: 'Tag cloud with counts from the vault.', mimeType: 'text/markdown' },\n async (uri) => {\n try {\n const files = await client.listFiles();\n const mdFiles = files.filter(f => f.extension === 'md');\n\n const tagCounts = new Map<string, number>();\n const sampled = mdFiles.length <= 500\n ? mdFiles\n : shuffle([...mdFiles]).slice(0, 200);\n\n for (const file of sampled) {\n try {\n const content = await client.readNote(file.path);\n for (const tag of extractTags(content)) {\n tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);\n }\n } catch {\n // Skip\n }\n }\n\n const sorted = [...tagCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 30);\n\n const lines = sorted.map(([tag, count]) => `- #${tag} (${count})`).join('\\n');\n\n return {\n contents: [{\n uri: uri.href,\n text: `# Vault Tags\\n\\n${lines || 'No tags found.'}`,\n mimeType: 'text/markdown',\n }],\n };\n } catch {\n return {\n contents: [{ uri: uri.href, text: 'Could not fetch tags.', mimeType: 'text/plain' }],\n };\n }\n }\n );\n\n // ─── vault://context ───────────────────────────────────────────────\n server.resource(\n 'context',\n 'vault://context',\n {\n description: 'Contextual notes relevant to the current working directory or project. Auto-infers which notes may be useful.',\n mimeType: 'text/markdown',\n },\n async (uri) => {\n try {\n const cwd = process.cwd();\n const projectName = cwd.split('/').pop() ?? '';\n\n // Search for notes related to the current project\n let results: string[] = [];\n if (projectName) {\n try {\n const searchResults = await client.search(projectName);\n results = searchResults.slice(0, 5).map(r => r.filename);\n } catch {\n // Search failed, that's ok\n }\n }\n\n if (results.length === 0) {\n return {\n contents: [{\n uri: uri.href,\n text: `# Context\\n\\nNo vault notes found related to the current project \"${projectName}\".`,\n mimeType: 'text/markdown',\n }],\n };\n }\n\n const lines = results.map((f, i) => `${i + 1}. ${f}`).join('\\n');\n return {\n contents: [{\n uri: uri.href,\n text: `# Context for \"${projectName}\"\\n\\nRelevant vault notes:\\n\\n${lines}`,\n mimeType: 'text/markdown',\n }],\n };\n } catch {\n return {\n contents: [{ uri: uri.href, text: 'Could not determine context.', mimeType: 'text/plain' }],\n };\n }\n }\n );\n}\n","const PREFIX = 'mindcache';\n\nexport function log(message: string): void {\n process.stderr.write(`[${PREFIX}] ${message}\\n`);\n}\n\nexport function logError(message: string): void {\n process.stderr.write(`[${PREFIX}] ERROR: ${message}\\n`);\n}\n\nexport function logWarn(message: string): void {\n process.stderr.write(`[${PREFIX}] WARN: ${message}\\n`);\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type MindCacheConfig } from '@/config.js';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { registerFindTools } from '@/tools/find.js';\nimport { registerReadTools } from '@/tools/read.js';\nimport { registerRememberTools } from '@/tools/remember.js';\nimport { registerJournalTools } from '@/tools/journal.js';\nimport { registerWriteTools } from '@/tools/write.js';\nimport { registerConnectTools } from '@/tools/connect.js';\nimport { registerOrganizeTools } from '@/tools/organize.js';\nimport { registerUnderstandTools } from '@/tools/understand.js';\nimport { registerTaskTools } from '@/tools/tasks.js';\nimport { registerVaultTools } from '@/tools/vault.js';\nimport { registerResources } from '@/resources/index.js';\nimport { log } from '@/utils/logger.js';\n\nexport const SERVER_VERSION = '0.3.0';\n\nexport function createServer(config: MindCacheConfig): { server: McpServer; client: ObsidianClient } {\n const server = new McpServer(\n {\n name: 'mindcache',\n version: SERVER_VERSION,\n },\n {\n instructions: [\n 'MindCache connects your Obsidian vault to AI.',\n 'Use the search and ask tools to find information in the user\\'s personal knowledge base.',\n 'Use the remember tools to capture decisions, meetings, ideas, learnings, and references.',\n 'Use the log tool to add entries to the daily note.',\n 'Use the connect tools to build links between related notes.',\n 'Always check the vault before asking the user to repeat information they may have already documented.',\n 'When creating notes, use appropriate templates and add relevant tags.',\n ].join(' '),\n }\n );\n\n const client = new ObsidianClient(config);\n\n // Register all tool categories\n log('Registering tools...');\n registerFindTools(server, client, config);\n registerReadTools(server, client, config);\n registerRememberTools(server, client, config);\n registerJournalTools(server, client, config);\n registerWriteTools(server, client, config);\n registerConnectTools(server, client, config);\n registerOrganizeTools(server, client, config);\n registerUnderstandTools(server, client, config);\n registerTaskTools(server, client, config);\n registerVaultTools(server, client, config);\n\n // Register resources\n log('Registering resources...');\n registerResources(server, client, config);\n\n // Build the search index in the background (non-blocking)\n if (config.vault) {\n client.buildIndex().then(() => {\n log('Search index built');\n }).catch(() => {\n log('WARN: Could not build search index — falling back to full scan');\n });\n }\n\n log('Server configured with 44 tools and 4 resources');\n return { server, client };\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { resolve, join } from 'path';\nimport { homedir } from 'os';\nimport { log, logWarn } from '@/utils/logger.js';\n\nexport interface MindCacheConfig {\n vault: string;\n dailyNotes: {\n folder: string;\n format: string;\n };\n templates: {\n folder: string;\n };\n inbox: {\n folder: string;\n requireReview: boolean;\n };\n}\n\nconst DEFAULT_CONFIG: MindCacheConfig = {\n vault: '',\n dailyNotes: {\n folder: 'Daily',\n format: 'YYYY-MM-DD',\n },\n templates: {\n folder: 'Templates/MindCache',\n },\n inbox: {\n folder: 'MindCache/Inbox',\n requireReview: false,\n },\n};\n\n/**\n * Simple YAML-like parser for config files.\n * Handles flat and one-level nested key: value pairs.\n */\nfunction parseSimpleYaml(content: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n let currentSection = '';\n\n for (const rawLine of content.split('\\n')) {\n const line = rawLine.replace(/#.*$/, '').trimEnd();\n if (!line.trim()) continue;\n\n const indent = line.length - line.trimStart().length;\n const trimmed = line.trim();\n\n const colonIdx = trimmed.indexOf(':');\n if (colonIdx < 0) continue;\n\n const key = trimmed.slice(0, colonIdx).trim();\n const value = trimmed.slice(colonIdx + 1).trim();\n\n if (indent === 0 && !value) {\n currentSection = key;\n if (!result[currentSection]) result[currentSection] = {};\n } else if (indent > 0 && currentSection) {\n (result[currentSection] as Record<string, string>)[key] = value;\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nfunction findConfigFile(): string | null {\n const candidates = [\n resolve(process.cwd(), '.mindcache.yml'),\n resolve(process.cwd(), '.mindcache.yaml'),\n join(homedir(), '.config', 'mindcache', 'config.yml'),\n join(homedir(), '.config', 'mindcache', 'config.yaml'),\n join(homedir(), '.mindcache.yml'),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return null;\n}\n\nexport function loadConfig(): MindCacheConfig {\n const config: MindCacheConfig = {\n vault: DEFAULT_CONFIG.vault,\n dailyNotes: { ...DEFAULT_CONFIG.dailyNotes },\n templates: { ...DEFAULT_CONFIG.templates },\n inbox: { ...DEFAULT_CONFIG.inbox },\n };\n\n // Check environment variables first\n if (process.env.MINDCACHE_VAULT) config.vault = process.env.MINDCACHE_VAULT;\n\n // Load config file\n const configPath = process.env.MINDCACHE_CONFIG || findConfigFile();\n if (configPath && existsSync(configPath)) {\n log(`Loading config from ${configPath}`);\n try {\n const raw = readFileSync(configPath, 'utf-8');\n const parsed = parseSimpleYaml(raw);\n\n if (typeof parsed.vault === 'string') config.vault = parsed.vault;\n\n const daily = (parsed.daily_notes ?? parsed.dailyNotes) as Record<string, string> | undefined;\n if (daily) {\n if (daily.folder) config.dailyNotes.folder = daily.folder;\n if (daily.format) config.dailyNotes.format = daily.format;\n }\n\n const templates = parsed.templates as Record<string, string> | undefined;\n if (templates) {\n if (templates.folder) config.templates.folder = templates.folder;\n }\n\n const inbox = parsed.inbox as Record<string, string> | undefined;\n if (inbox) {\n if (inbox.folder) config.inbox.folder = inbox.folder;\n if (inbox.require_review !== undefined) {\n config.inbox.requireReview = String(inbox.require_review) === 'true';\n }\n }\n } catch (err) {\n logWarn(`Failed to parse config: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Resolve ~ in vault path\n if (config.vault.startsWith('~')) {\n config.vault = config.vault.replace('~', homedir());\n }\n\n return config;\n}\n","import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createServer, SERVER_VERSION } from '@/server.js';\nimport { loadConfig } from '@/config.js';\nimport { ObsidianClient } from '@/obsidian.js';\nimport { log, logError } from '@/utils/logger.js';\nimport { writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { createInterface } from 'readline';\n\nconst HELP = `\nMindCache v${SERVER_VERSION} — Your Obsidian vault, connected to AI.\n\nUsage:\n mindcache Start the MCP server (default)\n mindcache init Interactive setup\n mindcache doctor Diagnose connection issues\n mindcache config Show current configuration\n mindcache --help Show this help message\n mindcache --version Show version\n\nEnvironment variables:\n MINDCACHE_VAULT Path to Obsidian vault\n MINDCACHE_CONFIG Path to config file\n\nConfig file locations (checked in order):\n .mindcache.yml (current directory)\n ~/.config/mindcache/config.yml\n ~/.mindcache.yml\n\nLearn more: https://usemindcache.com\n`;\n\nasync function prompt(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n return new Promise(resolve => {\n rl.question(question, answer => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nasync function runInit(): Promise<void> {\n process.stderr.write('\\nMindCache Setup\\n');\n process.stderr.write('===============\\n\\n');\n process.stderr.write('MindCache reads your Obsidian vault directly from the filesystem.\\n');\n process.stderr.write('No plugins required — just point it at your vault folder.\\n\\n');\n\n const defaultVault = join(homedir(), 'Documents', 'Obsidian Vault');\n const vault = await prompt(`Obsidian vault path [${defaultVault}]: `) || defaultVault;\n const dailyFolder = await prompt('Daily notes folder [Daily]: ') || 'Daily';\n\n const configContent = `# MindCache Configuration\nvault: ${vault}\n\ndaily_notes:\n folder: ${dailyFolder}\n format: YYYY-MM-DD\n\ntemplates:\n folder: Templates/MindCache\n\ninbox:\n folder: MindCache/Inbox\n require_review: false\n`;\n\n const configDir = join(homedir(), '.config', 'mindcache');\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n const configPath = join(configDir, 'config.yml');\n writeFileSync(configPath, configContent);\n\n process.stderr.write(`\\nConfig saved to: ${configPath}\\n\\n`);\n\n // Test vault access\n process.stderr.write('Checking vault...\\n');\n const config = loadConfig();\n const client = new ObsidianClient(config);\n const health = await client.health();\n client.close();\n\n if (health.ok) {\n process.stderr.write(` Found ${health.noteCount} notes in vault\\n\\n`);\n } else {\n process.stderr.write(` ${health.error}\\n`);\n process.stderr.write(' Check that the vault path is correct.\\n\\n');\n }\n\n process.stderr.write('Add MindCache to Claude Code:\\n');\n process.stderr.write(' claude mcp add --scope user mindcache -- npx @augmnt-sh/mindcache\\n\\n');\n\n process.exit(0);\n}\n\nasync function runDoctor(): Promise<void> {\n process.stderr.write(`\\nMindCache Doctor v${SERVER_VERSION}\\n`);\n process.stderr.write('==========================\\n\\n');\n\n const config = loadConfig();\n\n // Check config\n process.stderr.write('Checking configuration...\\n');\n if (!config.vault) {\n process.stderr.write(' [WARN] No vault path configured. Run: mindcache init\\n');\n } else {\n process.stderr.write(` [OK] Vault: ${config.vault}\\n`);\n }\n\n process.stderr.write(` [OK] Daily notes: ${config.dailyNotes.folder}/\\n`);\n process.stderr.write(` [OK] Templates: ${config.templates.folder}/\\n`);\n process.stderr.write(` [OK] Inbox: ${config.inbox.folder}/\\n`);\n\n // Check vault access\n process.stderr.write('\\nChecking vault access...\\n');\n const client = new ObsidianClient(config);\n const health = await client.health();\n client.close();\n\n if (health.ok) {\n process.stderr.write(` [OK] Vault readable\\n`);\n process.stderr.write(` [OK] Found ${health.noteCount} markdown notes\\n`);\n } else {\n process.stderr.write(` [FAIL] ${health.error}\\n`);\n process.stderr.write('\\n Troubleshooting:\\n');\n process.stderr.write(' 1. Check that the vault path is correct\\n');\n process.stderr.write(' 2. Check file permissions\\n');\n process.stderr.write(' 3. Run: mindcache init\\n');\n }\n\n process.stderr.write('\\n');\n process.exit(health.ok ? 0 : 1);\n}\n\nfunction showConfig(): void {\n const config = loadConfig();\n process.stderr.write(`\\nMindCache Configuration\\n`);\n process.stderr.write('=======================\\n\\n');\n process.stderr.write(`Vault: ${config.vault || '(not set)'}\\n`);\n process.stderr.write(`Daily folder: ${config.dailyNotes.folder}\\n`);\n process.stderr.write(`Daily format: ${config.dailyNotes.format}\\n`);\n process.stderr.write(`Templates: ${config.templates.folder}\\n`);\n process.stderr.write(`Inbox: ${config.inbox.folder}\\n`);\n process.stderr.write(`Review mode: ${config.inbox.requireReview ? 'on' : 'off'}\\n`);\n process.stderr.write('\\n');\n process.exit(0);\n}\n\nasync function startServer(): Promise<void> {\n const nodeVersion = process.version;\n const nodeMajor = parseInt(nodeVersion.slice(1));\n if (nodeMajor < 18) {\n logError(`Node.js >= 18 required, found ${nodeVersion}`);\n process.exit(1);\n }\n\n log(`mindcache v${SERVER_VERSION} | Node ${nodeVersion} | ${process.platform}`);\n\n const config = loadConfig();\n\n if (!config.vault) {\n log('WARN: No vault path configured. Run \"mindcache init\" for setup.');\n }\n\n const { server, client } = createServer(config);\n const transport = new StdioServerTransport();\n\n const shutdown = async () => {\n log('Shutting down...');\n try {\n client.close();\n await server.close();\n } catch (err) {\n logError(`Shutdown error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n await server.connect(transport);\n}\n\n// Parse CLI arguments\nconst command = process.argv[2];\n\nswitch (command) {\n case 'init':\n runInit().catch(err => {\n logError(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n case 'doctor':\n runDoctor().catch(err => {\n logError(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n case 'config':\n showConfig();\n break;\n case '--version':\n case '-v':\n process.stderr.write(`mindcache v${SERVER_VERSION}\\n`);\n process.exit(0);\n break;\n case '--help':\n case '-h':\n process.stderr.write(HELP);\n process.exit(0);\n break;\n default:\n startServer().catch(err => {\n logError(`Fatal: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n });\n}\n"]}