A command-line interface for Apple Notes that enables quick note capture and retrieval from the terminal. Uses AppleScript to safely interact with Notes.app, with a Claude Code skill wrapper for natural language interaction.
Built for Claude Code - This integration works seamlessly with Claude Code for natural language note management.
This integration provides:
- AppleScript backend - Safe interaction with Notes.app API
- Node.js CLI - Clean command-line interface
- Forked skill - Natural language wrapper for conversational use
- Plain text support - v1 focuses on plain text notes
-
Clone the repository:
git clone https://github.com/keithlang/apple-notes-cli.git ~/.claude/skills/apple-notes -
Make the CLI executable:
chmod +x ~/.claude/skills/apple-notes/cli.js -
You're done! The skill will be automatically available in Claude Code.
If you just want the command-line tool without Claude Code integration:
git clone https://github.com/keithlang/apple-notes-cli.git
cd apple-notes-cli
chmod +x cli.jsOptionally add to your PATH or create an alias.
~/.claude/skills/apple-notes/
├── cli.js # Node.js CLI
├── scripts/
│ ├── create-note.applescript # Create notes
│ ├── read-note.applescript # Read notes
│ └── list-notes.applescript # List notes
├── SKILL.md # Forked skill wrapper
├── package.json
└── README.md # This file
On first use, macOS will prompt you to grant permissions:
-
Terminal/Claude Access to Notes:
- When you first run a command, you'll see a system dialog
- Click "OK" to allow access
- If denied, go to: System Settings > Privacy & Security > Automation
- Enable "Notes" for Terminal or Claude
-
Troubleshooting Permissions:
- If commands fail with "Not authorized", check System Settings
- You may need to remove and re-add permissions
- Restart Terminal/Claude after changing permissions
~/.claude/skills/apple-notes/cli.js create "Note Title" "Note body content"Example:
~/.claude/skills/apple-notes/cli.js create "Meeting Notes" "Discussed Q1 goals
Action items:
- Alice: Draft proposal
- Bob: Schedule follow-up"~/.claude/skills/apple-notes/cli.js read "Note Title"Example:
~/.claude/skills/apple-notes/cli.js read "Meeting Notes"~/.claude/skills/apple-notes/cli.js list~/.claude/skills/apple-notes/cli.js --helpThe skill wrapper (apple-notes) allows natural language interaction through Claude Code:
Create:
- "Create a note called Shopping List with bread, milk, eggs"
- "Make a note titled Meeting Notes with discussion points"
- "New note: Project Ideas - build an app for task management"
Read:
- "Show me my Shopping List note"
- "Read the note called Meeting Notes"
- "What's in my Project Ideas note?"
List:
- "List all my notes"
- "Show me all notes"
- "What notes do I have?"
~/.claude/skills/apple-notes/cli.js create "Team Meeting 2024-02-09" "Attendees: Alice, Bob
Topics:
- Q1 goals
- New project kickoff
Action items:
- Alice: Draft proposal by Friday
- Bob: Schedule follow-up"~/.claude/skills/apple-notes/cli.js read "Team Meeting 2024-02-09"Output:
Team Meeting 2024-02-09
Attendees: Alice, Bob
Topics:
- Q1 goals
- New project kickoff
Action items:
- Alice: Draft proposal by Friday
- Bob: Schedule follow-up
~/.claude/skills/apple-notes/cli.js list- AppleScript Backend: Uses
osascriptto interact with Notes.app API - Node.js CLI: Wraps AppleScript for easy command-line access
- Forked Skill: Natural language wrapper for conversational use
- Plain Text Only: v1 supports plain text (no HTML/formatting)
- Exact Title Match: Read command requires exact title match
- Duplicate Handling: Creating notes with existing titles creates duplicates (Notes.app behavior)
- iCloud Sync: Notes sync automatically if you have iCloud Notes enabled
osascriptis built into macOS- Ensure you're running on macOS
- Grant permissions in System Settings > Privacy & Security > Automation
- Enable "Notes" for Terminal/Claude
- Restart your terminal
- Check exact title (case-sensitive)
- Use
cli.js listto see available notes - Remember: exact match required
- Use quotes around arguments
- Quotes inside strings are handled automatically
- Newlines are preserved in note bodies
- Ensure
scripts/directory exists with .applescript files - Run from
~/.claude/skills/apple-notes/directory or use full path
- ✗ No folder organization support
- ✗ No HTML/rich text formatting
- ✗ No note editing (only create/read)
- ✗ No note deletion
- ✗ No fuzzy search (exact title match only)
- ✗ No date filtering
- ✗ No attachments
Future versions may add these features.
~/.claude/skills/apple-notes/
├── cli.js # Node.js CLI
├── scripts/
│ ├── create-note.applescript # AppleScript for creating
│ ├── read-note.applescript # AppleScript for reading
│ └── list-notes.applescript # AppleScript for listing
├── SKILL.md # Forked skill definition
├── package.json # Node.js package config
└── README.md # This file
Manual testing is required for each component:
-
Test AppleScripts directly:
osascript scripts/create-note.applescript "Test" "Body" osascript scripts/read-note.applescript "Test" osascript scripts/list-notes.applescript
-
Test CLI commands:
./cli.js create "Test" "Body" ./cli.js read "Test" ./cli.js list
-
Test skill wrapper:
- Use natural language with Claude
- Try various phrasings
- Test error cases (note not found, etc.)
To add new features (e.g., delete, edit, search):
- Create new AppleScript in
scripts/ - Add command handler in
cli.js - Update
SKILL.mdwith new capabilities - Update this README with examples
Contributions welcome! Please open an issue or PR on GitHub.
- Folder/organization support
- HTML/rich text formatting
- Note editing and updating
- Note deletion
- Fuzzy search
- Date filtering
- Attachment support
MIT