mcp-macos-popup
# mcp-macos-popup
MCP server for native macOS popup notifications, with multi-screen support.
It shows dark glassy popup cards on macOS and lets an AI agent target a specific display. On multi-monitor setups, it can list every screen and return the screen that currently has focus.
## Tools
- `show_popup` — quick notification popup
- `show_docs` — larger Markdown popup
- `dismiss_all_popups` — close all popups
- `list_screens` — list connected displays
- `get_focused_screen` — return the focused display
`show_popup` and `show_docs` accept an optional `screen` argument: display id, index, label, `primary`, or `focused`.
## Install
```bash
npm install -g mcp-macos-popup
```
Or run directly:
```bash
npx mcp-macos-popup
```
Electron is installed automatically as a dependency.
## MCP configuration
```json
{
"mcpServers": {
"macos-popup": {
"command": "mcp-macos-popup"
}
}
}
```
## Usage
```bash
mcp-cli call macos-popup show_popup '{"title":"Elia","message":"the answer","level":"info","duration":10}'
mcp-cli call macos-popup list_screens '{}'
mcp-cli call macos-popup get_focused_screen '{}'
```
## Multi-screen
If four displays are connected, call `list_screens` or `get_focused_screen` first, then pass the chosen display id as `screen`:
```bash
mcp-cli call macos-popup show_popup '{"title":"Elia","message":"hello","screen":"focused"}'
```
## Development
```bash
npm install
npm run daemon
```
TDQS
Scored across 5 tools
show_popup vs show_docs are the closest pair, but descriptions clearly separate them by content type (quick notification vs markdown) and duration. list_screens and get_focused_screen overlap since list_screens already reports focus, making the focused-only tool somewhat redundant, but each still has a distinct intent.
All five tools follow a clean snake_case verb_noun pattern (list_screens, get_focused_screen, dismiss_all_popups, show_popup, show_docs). No mixed conventions or camelCase deviations.
Five tools is well-scoped for a popup-display server: enumerate screens, get the active screen, show a quick popup, show a rich popup, and dismiss all. Each earns its place with no filler.
Core lifecycle is covered: discover screens, target the focused one, show two popup styles, and clear them. Minor gaps exist—no individual popup dismissal (only dismiss_all_popups) and no way to list currently active popups.