Screen context
Use when the user asks "what's on my screen?", "what am I looking at?", "describe this app/window/file", or wants you to act on the *visual* state of macOS. Picks the right capture tool (display vs window vs iPhone), keeps PNG sizes manageable, and translates results for vision-capable models.From its SKILL.md
npx -y skills add MichaelAdamGroberman/mac-mcp --skill screen-contextAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
2.2 KB, as published. Nobody here has run it
Reading the user's macOS screen state
Three capture surfaces, each with its own tool. Pick deliberately — don't always grab the whole display:
| Source | Tool | When to use |
|---|---|---|
| Whole display | screenshot_screen (optional display_index) | "What's on my screen?", multi-app overview, when no specific app named |
| Specific window | screenshot_window (needs window_id) | User names an app or asks about one app; smaller payload, more focused |
| iPhone | iphone_mirror action=screenshot | User mentions iPhone, iOS app, phone notification, etc. |
The right sequence for "describe what app X is showing"
list_windows→ find the entry whereownermatches app name X (case-insensitivelocalizedCaseInsensitiveContainsis fine)screenshot_window window_id=<id from step 1>- Pass the returned
image_png_b64to vision (your runtime handles this — don't stringify it back at the user)
This is dramatically smaller and faster than screenshot_screen + cropping, and avoids capturing other apps' contents (privacy + token cost).
Display selection for multi-monitor setups
If screenshot_screen is called without display_index it captures display 0 (main). Users with multi-monitor setups often mean "the screen I'm looking at" which is not always the main. Heuristic:
- If the user just mentioned a window/app, get its bounds via
list_windowsand pick the display whoseCGDisplayBoundscontains those bounds. - Otherwise default to 0 and surface the assumption: "Captured your main display (Display 0)…"
Don't
- Don't OCR the screenshot yourself by hand. Pass it to vision.
- Don't capture if Screen Recording isn't granted —
screenshot_screenreturnscapture_failed. Invokemac-mcp-tcc-grantfirst. - Don't include the base64 string in your visible response to the user (it's huge). Only refer to its contents.