Screenshot MCP (macOS)
# Screenshot MCP (macOS)
Minimal MCP server for macOS screenshots with a Swift CLI backend. Supports:
- display screenshots
- window screenshots
- window recording (duration or start/stop)
- listing displays/windows
## Requirements
- macOS 12+ (CoreGraphics APIs)
- Swift (Xcode CLI tools)
- Node.js 18+
- Screen Recording permission granted to the terminal or host app
## Quickstart
```bash
npm install
swift build
node server.js
```
## SwiftUI UI (no Xcode)
```bash
swift build
swift run screenshot_mcp_app
```
### Debug logs
The SwiftUI app writes logs to `~/Documents/screenshot_mcp/debug.log` by default.
## MCP Tools
- `list_displays`
- `list_windows`
- `screenshot_display` `{ display_id, output_path? }`
- `screenshot_window` `{ window_id, output_path? }`
- `record_window_duration` `{ window_id, duration_seconds, fps?, system_audio?, output_path? }`
- `record_window_start` `{ window_id, fps?, system_audio?, output_path? }`
- `record_window_stop` `{ recording_id }`
## CLI Usage
```bash
swift run screenshot_mcp list-displays
swift run screenshot_mcp list-windows
swift run screenshot_mcp screenshot-display <display_id> ./captures/display.png
swift run screenshot_mcp screenshot-window <window_id> ./captures/window.png
swift run screenshot_mcp record-window-duration <window_id> ./captures/window.mp4 5 10 true
swift run screenshot_mcp record-window-start <window_id> ./captures/window.mp4 10 true
# stop with Ctrl+C or SIGINT
```
## Configuration
- `SCREENSHOT_MCP_BIN`: path to the compiled Swift binary
- `SCREENSHOT_MCP_OUTPUT_DIR`: default output directory for screenshots
## Notes
- The Swift CLI uses `CGDisplayCreateImage` and `CGWindowListCreateImage`.
- Window recording samples window frames (default 10 fps) and writes MP4 via `AVAssetWriter`.
- System audio capture requires macOS 13+ and records all system audio, not just the window.
- If screenshots are blank, ensure Screen Recording permission is granted.
## License
MIT
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose: listing displays vs. windows, recording windows with duration vs. start/stop control, and screenshotting displays vs. windows. The descriptions make it easy to differentiate between similar tools like record_window_duration and record_window_start, as one specifies a fixed duration while the other allows manual control.
All tool names follow a consistent snake_case pattern with clear verb_noun structure (e.g., list_displays, record_window_duration, screenshot_display). The naming is predictable and readable throughout the set, making it easy for agents to understand the action and target.
With 7 tools, the server is well-scoped for screenshot and recording functionality on macOS. Each tool earns its place by covering essential operations: listing resources, recording windows with different control methods, and capturing screenshots of displays and windows, without unnecessary bloat.
The tool surface provides complete coverage for the domain of macOS screen capture and recording. It includes listing (displays and windows), recording (with both fixed-duration and start/stop control), and screenshotting (displays and windows), ensuring agents can handle all core workflows without dead ends.