From sundial-org-awesome-openclaw-skills-4
Queries macOS Contacts.app via AppleScript to lookup contacts by phone number or name, retrieving names, phones, and emails. Use for resolving phone numbers to names or searching the address book.
npx claudepluginhub joshuarweaver/cascade-ai-ml-agents-misc-2 --plugin sundial-org-awesome-openclaw-skills-4This skill uses the workspace's default tool permissions.
Query Contacts.app via AppleScript.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
Query Contacts.app via AppleScript.
# 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'
⚠️ 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'
⚠️ Exact string match required — must match stored format exactly.
| Stored | Search | Works? |
|---|---|---|
+1XXXXXXXXXX | +1XXXXXXXXXX | ✅ |
+1XXXXXXXXXX | XXXXXXXXXX | ❌ |
Try with +1 prefix first. If fails, search by name instead.
containsis instead of containsReturns comma-separated: name, phone1, [phone2...], email1, [email2...]
No match = empty output (not an error).