Skip to main content
Glama
arslankhanali

Apple Notes MCP Server

list_notes

Retrieve and display Apple Notes from specific accounts or folders to organize and access your information.

Instructions

List all notes or notes from a specific account/folder.

Args:
    account: Optional account name (e.g., "iCloud", "On My Mac")
    folder: Optional folder name within the account

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
accountNo
folderNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Implementation Reference

  • The handler function decorated with @mcp.tool() that implements the list_notes tool. It generates AppleScript based on optional account and folder parameters, executes it using run_applescript, parses the output, and formats a list of notes with names, IDs, and modification dates.
    @mcp.tool()
    async def list_notes(account: Optional[str] = None, folder: Optional[str] = None) -> str:
        """List all notes or notes from a specific account/folder.
        
        Args:
            account: Optional account name (e.g., "iCloud", "On My Mac")
            folder: Optional folder name within the account
        """
        if account and folder:
            script = f'''
            tell application "Notes"
                set accountName to "{escape_applescript_string(account)}"
                set folderName to "{escape_applescript_string(folder)}"
                set noteList to {{}}
                try
                    set targetAccount to account accountName
                    set targetFolder to folder folderName of targetAccount
                    repeat with aNote in notes of targetFolder
                        set end of noteList to (name of aNote) & "|" & (id of aNote) & "|" & (modification date of aNote as string)
                    end repeat
                end try
                return noteList
            end tell
            '''
        elif account:
            script = f'''
            tell application "Notes"
                set accountName to "{escape_applescript_string(account)}"
                set noteList to {{}}
                try
                    set targetAccount to account accountName
                    repeat with aNote in notes of targetAccount
                        set end of noteList to (name of aNote) & "|" & (id of aNote) & "|" & (modification date of aNote as string)
                    end repeat
                end try
                return noteList
            end tell
            '''
        else:
            script = '''
            tell application "Notes"
                set noteList to {}
                repeat with anAccount in accounts
                    repeat with aNote in notes of anAccount
                        set end of noteList to (name of anAccount) & "::" & (name of aNote) & "|" & (id of aNote) & "|" & (modification date of aNote as string)
                    end repeat
                end repeat
                return noteList
            end tell
            '''
        
        output, success = run_applescript(script)
        if not success:
            return output
        
        # Parse the output
        if not output or output == "{}":
            return "No notes found."
        
        # AppleScript returns a list like: {"Note 1|id1|date1", "Note 2|id2|date2"}
        # Parse it
        notes = []
        for item in output.split(", "):
            item = item.strip().strip('"').strip("'")
            if "|" in item:
                parts = item.split("|")
                if len(parts) >= 3:
                    notes.append({
                        "name": parts[0],
                        "id": parts[1],
                        "modified": parts[2]
                    })
        
        if not notes:
            return "No notes found."
        
        result = "Found notes:\n"
        for i, note in enumerate(notes, 1):
            result += f"{i}. {note['name']} (ID: {note['id']}, Modified: {note['modified']})\n"
        
        return result
  • Helper function used by list_notes to execute AppleScript commands via subprocess and return output or error.
    def run_applescript(script: str) -> tuple[str, bool]:
        """Run an AppleScript command and return the output."""
        try:
            result = subprocess.run(
                ["osascript", "-e", script],
                capture_output=True,
                text=True,
                timeout=30
            )
            if result.returncode == 0:
                return result.stdout.strip(), True
            else:
                error_msg = result.stderr.strip() or result.stdout.strip()
                return f"Error: {error_msg}", False
        except subprocess.TimeoutExpired:
            return "Error: AppleScript execution timed out", False
        except Exception as e:
            return f"Error: {str(e)}", False
  • Helper function used by list_notes to properly escape strings for safe inclusion in AppleScript.
    def escape_applescript_string(text: str) -> str:
        """Escape special characters for AppleScript strings."""
        # Replace backslashes, quotes, and newlines
        text = text.replace("\\", "\\\\")
        text = text.replace('"', '\\"')
        text = text.replace("\n", "\\n")
        return text
  • apple_notes.py:46-46 (registration)
    The @mcp.tool() decorator registers the list_notes function as an MCP tool.
    @mcp.tool()
  • Docstring defining the input schema (parameters) for the list_notes tool.
    """List all notes or notes from a specific account/folder.
    
    Args:
        account: Optional account name (e.g., "iCloud", "On My Mac")
        folder: Optional folder name within the account
    """

Tool Definition Quality

Score is being calculated. Check back soon.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/arslankhanali/apple-notes-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server