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.md
source 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.

StoredSearchWorks?
+1XXXXXXXXXX
+1XXXXXXXXXX
+1XXXXXXXXXX
XXXXXXXXXX

Try with

+1
prefix first. If fails, search by name instead.

Name Search

  • Case-insensitive
  • Partial match with
    contains
  • Exact match: use
    is
    instead of
    contains

Output

Returns comma-separated:

name, phone1, [phone2...], email1, [email2...]

No match = empty output (not an error).