Skip to content
Automation
Skill

/macos-tools

macOS native integrations: screen capture, calendar, reminders, contacts, email (Mail.app), Spotlight search. Use when the user asks about their screen, schedule, to-do list, contacts, or wants to send email on macOS.

From plugin
sutando
41087 skills20 hooks

Claude Code

$ npx -y skills add sonichi/sutando --skill macos-tools --agent claude-code

SKILL.md

macos-tools.SKILL.md
name: macos-tools
description: "macOS native integrations: screen capture, calendar, reminders, contacts, email (Mail.app), Spotlight search. Use when the user asks about their screen, schedule, to-do list, contacts, or wants to send email on macOS."

macOS Tools

Native macOS integrations via AppleScript. No API keys needed — works on any Mac.

**Calendar, Reminders and Contacts need the owner's consent.** Driving those apps raises a macOS permission prompt on the owner's screen. The order: (1) the Superpower Station connector (`composio_find` → `composio_exec`); (2) if it is not connected, the owner's own tools when they are in the tool list (`mcp__claude_ai_Google_Calendar__*`); (3) otherwise ask the owner. Run the scripts below with `--owner-asked` only when the owner asked for the local app in this conversation — without it they refuse (exit 2). A macOS denial (exit 3) is final and stored in `<workspace>/state/<app>-automation-denied`: say so, never retry or re-prompt. The `native-pim-guard` hook denies raw `osascript`/`open -a` commands against these apps for the same reason.

The owner can allow the local apps for this host once, in their own terminal (never run it yourself — the hook denies it to you):

python3 "$SKILL_DIR/scripts/native_pim_consent.py" grant     # writes state/native-pim-consent, clears stored denials
python3 "$SKILL_DIR/scripts/native_pim_consent.py" status    # marker, env var, per-app denial
python3 "$SKILL_DIR/scripts/native_pim_consent.py" revoke

`--owner-asked` and `SUTANDO_ALLOW_NATIVE_PIM=1` are strings you write: they stop you acting on your own initiative, they do not prove who asked (see `hooks/README.md`, native-pim-guard). Where the session says whose task is running (`state/bindings/active-execution.json`), the scripts refuse every form of consent on a non-owner task (exit 2, "not the owner's"). The consent record itself — `state/native-pim-consent` and the `*-automation-denied` markers — is the owner's: never write, copy, delete or `touch` it, and never import `native_pim_consent` to call `grant()`; the hook denies all of those, and `status` is how you read the state.

When to Use

  • **Screen**: "What's on my screen?", "help me with this", "describe what I'm looking at"
  • **Calendar**: "What's on my schedule?", "do I have meetings today?"
  • **Reminders**: "Add a reminder", "what's on my todo list?", "mark X as done"
  • **Contacts**: "What's Bob's email?", "find contact for..."
  • **Email**: "Send an email to...", "draft a message to..."
  • **File search**: "Find my resume", "where's that PDF?"

Tools

Screen Capture

bash "$SKILL_DIR/scripts/screen-capture.sh"

Returns path to PNG screenshot. Use the Read tool on the path to view it.

Calendar

Prefer the Superpower Station connector (`composio_find` / `composio_exec`); when the owner's calendar app isn't connected, follow the `connect-apps` skill instead of falling back here. macOS Calendar is only for an owner who asked for the local app, and an empty result from it is not an answer (the owner's real calendar may live in Google): say you couldn't read their calendar.

python3 "$SKILL_DIR/scripts/calendar-reader.py" 7 --owner-asked          # next 7 days, JSON
python3 "$SKILL_DIR/scripts/calendar-reader.py" 1 text --owner-asked     # today, plain text

Reminders

python3 "$SKILL_DIR/scripts/reminders.py" list --owner-asked              # all incomplete
python3 "$SKILL_DIR/scripts/reminders.py" add "Call Bob" --owner-asked     # add reminder
python3 "$SKILL_DIR/scripts/reminders.py" add "Fix bug" "2026-03-17" --owner-asked  # with due date
python3 "$SKILL_DIR/scripts/reminders.py" complete "Call Bob" --owner-asked # mark done

Contacts

python3 "$SKILL_DIR/scripts/contacts.py" search "Bob" --owner-asked       # find by name

Returns name, emails, phones. Use before sending email to resolve names to addresses.

Email (Apple Mail)

python3 "$SKILL_DIR/scripts/email-sender.py" "to@example.com" "Subject" "Body"
python3 "$SKILL_DIR/scripts/email-sender.py" "to@example.com" "Subject" "Body" --draft

Sends via Mail.app. Use `--draft` to create without sending. **Always confirm with user before sending.**

Spotlight File Search

mdfind "quarterly report"                    # search by content or filename
mdfind -name "resume.pdf"                    # search by filename only

Requirements

  • macOS (uses AppleScript)
  • Calendar, Reminders, Contacts, Mail apps (built into macOS)
  • The owner grants the Automation permission when macOS asks them; once denied, do not ask again
Read more
@sonichi
Ships withsutando

My AI Stand — Realtime by Day, Rewriting Itself by Night. Summon my AI superpower. Voice, vision, screen, meetings, calls when I'm engaged. Learns my patterns, ships its own code when I'm not. Runs across my Macs, interacts with people & their Stands.

Stars on GitHub

Momentum

stars in total
410
Star history of sonichi/sutando on GitHub, a chart by star-history.com

Other skills on sutando.

ag2-space-mcp

ag2-space-mcp

Connect this Sutando install to AG2 Space's hosted MCP as its own agent, without the desktop app, and know which room and Commons…

@sonichi@sonichiInstall Skill
ag2space-voice

ag2space-voice

s.space voice surface — binds the room the s.space client announces to the voice session's origin, so work delegated by voice in…

@sonichi@sonichiInstall Skill
agent-activity

agent-activity

Streams what the agent is doing into the room, as rows the desktop client renders in an **events drawer** above the composer…

@sonichi@sonichiInstall Skill
agent-registry

agent-registry

Local Agent Registry — a standalone, dependency-free service that tracks running Claude Code (and other) agent instances. Agents…

@sonichi@sonichiInstall Skill
agent-room-ops

agent-room-ops

For an all-room analysis sweep, use the tested window collector and coverage contract in…

@sonichi@sonichiInstall Skill
answer-format

answer-format

Deterministic final-answer normalizer — a last-step pass for any task that ends in a *precise* answer (a number, a short string,…

@sonichi@sonichiInstall Skill

More skills from other plugins.

agent-builder

agent-builder

Load immediately after an Agent intent, before the first agent_builder_* call. Governs how you create, configure, test, and…

n8n2w209k
@n8n-io@n8n-ioInstall Skill
browser-use

browser-use

Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…

@browser-use@browser-useInstall Skill
add-anydoc

add-anydoc

Add local office-document-to-Markdown conversion to NanoClaw agent containers with the pinned Firecrawl AnyDoc CLI. Use when…

@nanocoai@nanocoaiInstall Skill

Questions about macos-tools.

Which coding agents can use macos-tools?
macos-tools installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.