search-notes
Search and retrieve Apple Notes using natural language queries. Integrates with iCloud for efficient note management and quick access to stored information.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Implementation Reference
- src/index.ts:67-93 (registration)Registers the 'search-notes' MCP tool with input schema and handler that delegates to AppleNotesManager.searchNotes and formats the response.server.tool( "search-notes", searchSchema, async ({ query }: SearchParams) => { try { const notes = notesManager.searchNotes(query); const message = notes.length ? `Found ${notes.length} notes:\n${notes.map(note => `• ${note.title}`).join('\n')}` : "No notes found matching your query"; return { content: [{ type: "text", text: message }] }; } catch (error) { return { content: [{ type: "text", text: `Error searching notes: ${error instanceof Error ? error.message : 'Unknown error'}` }], isError: true }; } } );
- src/services/appleNotesManager.ts:66-93 (handler)Executes the core search logic by running AppleScript to find Apple Notes whose titles contain the query string, parsing results into Note objects.searchNotes(query: string): Note[] { const sanitizedQuery = query.replace(/"/g, '\\"'); const script = ` tell application "Notes" tell account "${this.ICLOUD_ACCOUNT}" get name of notes where name contains "${sanitizedQuery}" end tell end tell `; const result = runAppleScript(script); if (!result.success) { console.error('Failed to search notes:', result.error); return []; } return result.output .split(',') .filter(Boolean) .map(title => ({ id: Date.now().toString(), title: title.trim(), content: '', tags: [], created: new Date(), modified: new Date() })); }
- src/types.ts:23-25 (schema)TypeScript interface defining the input parameters for the search-notes tool.export interface SearchParams { query: string; }
- src/index.ts:24-26 (schema)Zod runtime validation schema for search-notes tool input.const searchSchema = { query: z.string().min(1, "Search query is required") };
- src/utils/applescript.ts:9-35 (helper)Utility function to execute AppleScript commands via Node.js child_process.execSync, used by the searchNotes handler.export function runAppleScript(script: string): AppleScriptResult { try { // Trim and sanitize the script const sanitizedScript = script.trim().replace(/[\r\n]+/g, ' '); // Execute the AppleScript command const output = execSync(`osascript -e '${sanitizedScript}'`, { encoding: 'utf8', timeout: 10000 // 10 second timeout }); return { success: true, output: output.trim() }; } catch (error) { console.error('AppleScript execution failed:', error); return { success: false, output: '', error: error instanceof Error ? error.message : 'Unknown error occurred while executing AppleScript' }; } }