Awesome-openclaw-skills apple-contacts
Look up contacts from macOS Contacts.app. Use when resolving phone numbers to names, finding contact info, or searching the address book.
install
source · Clone the upstream repo
git clone https://github.com/sundial-org/awesome-openclaw-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/sundial-org/awesome-openclaw-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/apple-contacts" ~/.claude/skills/sundial-org-awesome-openclaw-skills-apple-contacts && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/sundial-org/awesome-openclaw-skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/apple-contacts" ~/.openclaw/skills/sundial-org-awesome-openclaw-skills-apple-contacts && rm -rf "$T"
manifest:
skills/apple-contacts/SKILL.mdsource content
Apple Contacts
Query Contacts.app via AppleScript.
Quick Lookups
# By phone (name only) osascript -e 'tell application "Contacts" to get name of every person whose value of phones contains "+1XXXXXXXXXX"' # By name osascript -e 'tell application "Contacts" to get name of every person whose name contains "John"' # List all osascript -e 'tell application "Contacts" to get name of every person'
Full Contact Info
⚠️ Don't use
first person whose — buggy. Use this pattern:
# By phone osascript -e 'tell application "Contacts" set matches to every person whose value of phones contains "+1XXXXXXXXXX" if length of matches > 0 then set p to item 1 of matches return {name of p, value of phones of p, value of emails of p} end if end tell' # By name osascript -e 'tell application "Contacts" set matches to every person whose name contains "John" if length of matches > 0 then set p to item 1 of matches return {name of p, value of phones of p, value of emails of p} end if end tell'
Phone Lookup
⚠️ Exact string match required — must match stored format exactly.
| Stored | Search | Works? |
|---|---|---|
| | ✅ |
| | ❌ |
Try with
+1 prefix first. If fails, search by name instead.
Name Search
- Case-insensitive
- Partial match with
contains - Exact match: use
instead ofiscontains
Output
Returns comma-separated:
name, phone1, [phone2...], email1, [email2...]
No match = empty output (not an error).