mcp-macos-popup
Provides native macOS popup notifications with multi-screen support, including tools to show quick notifications and larger Markdown popups, dismiss all popups, list connected displays, and identify the focused display. Popups can optionally target a specific screen by display id, index, label, primary, or focused.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-macos-popupshow a popup on my focused screen saying the build finished"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 popupshow_docs— larger Markdown popupdismiss_all_popups— close all popupslist_screens— list connected displaysget_focused_screen— return the focused display
show_popup and show_docs accept an optional screen argument: display id, index, label, primary, or focused.
Related MCP server: Automation MCP
Install
npm install -g mcp-macos-popupOr run directly:
npx mcp-macos-popupElectron is installed automatically as a dependency.
MCP configuration
{
"mcpServers": {
"macos-popup": {
"command": "mcp-macos-popup"
}
}
}Usage
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:
mcp-cli call macos-popup show_popup '{"title":"Elia","message":"hello","screen":"focused"}'Development
npm install
npm run daemonAvailable Tools
5 toolsdismiss_all_popupsA
Immediately close every popup currently shown on screen.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. 'Immediately' usefully signals that dismissal is instantaneous and non-interactive (no per-popup confirmation), but it says nothing about what happens when no popups exist, whether the action is reversible, or whether it affects only the focused screen.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. Every word ('immediately', 'every', 'currently shown') contributes scope or timing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output tool this is nearly complete: the agent knows the effect, the scope, and the timing. The one gap is the no-popups edge case, which the description leaves unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly implies no targeting input is needed because all on-screen popups are handled.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('close') plus resource ('every popup currently shown on screen') with a clear scope qualifier. The 'every... currently shown' phrasing separates it from the sibling show_popup, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'currently shown on screen' implies the applicable situation (popups blocking the view), but there is no explicit when-to-use, no exclusion, and no reference to alternatives such as show_popup or get_focused_screen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_focused_screenA
Return the display that currently has focus, so a popup can be shown on the right screen.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that this is a read operation returning the currently focused display and gives the intended downstream use, but it does not explain return shape, behavior when no display has focus, or any error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted wording. The trailing purpose clause adds useful context without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description should say more about what 'the display' contains or how to use it with show_popup. As written, an agent knows the high-level intent but not the return shape or edge-case behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to clarify. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and resource ('the display that currently has focus'), which clearly distinguishes it from list_screens. It does not explicitly name siblings, but the focused-vs-all distinction is clear enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'so a popup can be shown on the right screen' implies it should be called before show_popup, but there is no explicit when-to-use, when-not-to-use, or named alternative. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_screensA
List every connected macOS display, including ids, labels, sizes and which one is focused.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations and no output schema, the description does useful work by naming the returned fields (ids, labels, sizes, focused flag), which signals this is a non-mutating enumeration. However, it doesn't state whether display state can change mid-call, what 'focused' means if no display is focused, or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the resource and the payload described up front and zero filler. Every clause ('every connected display', the field list) carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool, the description covers the return shape and scope well enough to call it correctly. The only remaining gap is the unaddressed relationship to get_focused_screen.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly frames this as a whole-system enumeration rather than a filtered query.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('every connected macOS display') and enumerates what each entry contains (ids, labels, sizes, focused flag). It is clear without opening the schema, though it doesn't explicitly distinguish itself from the sibling get_focused_screen, which returns a subset of the same information.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool for enumerating all displays. There is no explicit statement of when to prefer it over get_focused_screen (which returns just the focused display) and no prerequisites or exclusions noted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_docsA
Show a larger documentation-style popup on Wael's macOS screen that renders MARKDOWN (headings, lists, code blocks, links, quotes). Use it to surface rich information: a summary report, API results, a changelog, key findings. Stays longer on screen than show_popup.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Accent color: info/success/warning/error | |
| title | Yes | Title of the docs card | |
| screen | No | Display id, index, label, 'primary', or 'focused'. Omit for primary. | |
| source | No | Origin chip label | |
| duration | No | Seconds before auto-dismiss (default 30, max 300) | |
| markdown | Yes | Markdown content to render |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does add useful behavior: it auto-dismisses after a duration and persists longer than show_popup. However it never states that the popup is non-blocking, whether the user can dismiss it manually (dismiss_all_popups exists), or how it behaves when called repeatedly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, capability first, use cases second, sibling differentiation last. No filler, though the parenthetical construct list is slightly verbose relative to its value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description covers purpose, content format, use cases, and the key comparison to its closest sibling. Remaining gaps are behavioral details (dismissal, blocking) rather than anything that would prevent a correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (level, title, screen, source, duration, markdown) are already documented with enum and defaults. The description adds no parameter-level detail beyond restating that markdown is rendered, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: renders MARKDOWN in a documentation-style popup on the macOS screen, enumerating supported constructs (headings, lists, code blocks, links, quotes). It explicitly contrasts with the sibling show_popup ('stays longer on screen'), so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete use cases ('a summary report, API results, a changelog, key findings') and a relative rule versus show_popup. It stops short of an explicit 'use show_popup instead when...' exclusion or prerequisites, leaving the inverse inference implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_popupA
Show a quick notification popup on Wael's macOS screen via a native Electron window (dark glassy card, top-right, auto-dismiss). Use it to alert Wael of important information: task done, deploy finished, error found, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Visual severity: info (blue), success (green), warning (orange), error (red) | |
| title | Yes | Short bold title of the popup | |
| screen | No | Display id, index, label, 'primary', or 'focused'. Omit for primary. | |
| source | No | Origin chip label, e.g. 'Gilfoyle', 'Deploy' | |
| message | No | Notification body text (plain text) | |
| duration | No | Seconds before auto-dismiss (default 8, max 300) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral disclosure. It usefully describes the transient native window, top-right placement, glassy card, and auto-dismiss behavior, but omits details like whether multiple popups stack, whether focus is stolen, and any macOS permission or notification-center requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first front-loads the action and visual behavior, and the second gives usage guidance. There is no redundant restatement of schema fields or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter display-only tool with full schema coverage and no output schema, the description covers purpose and usage well enough to invoke correctly. It could be more complete by naming dismissal/stacking behavior or pointing to dismiss_all_popups, but those are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines title, level, screen, source, message, and duration. The description adds no parameter-level detail beyond the implicit auto-dismiss duration and screen targeting; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Show') and resource ('notification popup'), including platform and rendering context. It is clearly distinct from siblings like dismiss_all_popups and list_screens, though it does not explicitly differentiate itself from show_docs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives concrete use cases and a clear trigger: alerting Wael of important information such as task completion, deploy completion, or errors. It stops short of stating when not to use this tool or directing long-form content to show_docs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v1.0.0- First observed
dismiss_all_popups - First observed
get_focused_screen - First observed
list_screens - First observed
show_docs - First observed
show_popup
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.
Maintenance
Related MCP Connectors
Push notifications for AI agents - send instant iPhone notifications from any MCP client.
Connect AI assistants to authorized Windows and macOS devices for files, commands, and management.
Display delivery platform for AI agents. Push HTML, dashboards and live data to screens.
An MCP connector that lets your AI agents ask you questions, request permission approvals, and send alerts as push notifications to your phone and mac notch, so you can unblock and approve your agents from anywhere.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides native macOS computer control tools including mouse and keyboard simulation, screenshot capture, and application management for MCP-compatible agents. It enables AI assistants to directly interact with the macOS operating system and installed apps through standard tool calls.247 npm8MIT
- AlicenseNot gradedqualityFmaintenanceEnables AI assistants to automate macOS desktop tasks including mouse control, keyboard input, screenshots, window management, and UI interaction.4 npm415MIT
- AlicenseBqualityDmaintenanceEnables AI assistants to send desktop notifications on macOS with rich formatting, urgency levels, and sound options.17 npm1MIT
- AlicenseNot gradedqualityDmaintenanceProvides native macOS desktop automation for AI agents, enabling screen capture, mouse/keyboard control, window management, and iOS/Android simulator control in both foreground and background modes without focus stealing.3MIT