macOS Notify MCP
Allows detection of Alacritty terminal emulator and focus targeting for notifications, supporting tmux session navigation when clicked
Provides detection and focus targeting for iTerm2, allowing notifications to navigate to specific tmux sessions, windows, and panes
Sends native macOS notifications using the UserNotifications API with customizable sounds and click actions
Uses Node.js as the runtime environment for the MCP server functionality
Employs Swift for the native macOS application component that handles notifications and terminal focusing
Offers deep integration with tmux, allowing navigation to specific sessions, windows, and panes through clickable notifications
Implements the MCP server using TypeScript for the command-line interface and tmux session management
Click on "Install 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., "@macOS Notify MCPnotify me when the build finishes with title 'Build Status'"
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.
macOS Notify MCP
A Model Context Protocol (MCP) server for macOS notifications with tmux integration. This tool allows AI assistants like Claude to send native macOS notifications that can focus specific tmux sessions when clicked.
Features
π Native macOS notifications using UserNotifications API
π±οΈ Clickable notifications that focus tmux sessions
π― Direct navigation to specific tmux session, window, and pane
π Customizable notification sounds
π Support for multiple concurrent notifications
π€ MCP server for AI assistant integration
π₯οΈ Terminal emulator detection (VSCode, Cursor, iTerm2, Terminal.app)
Related MCP server: mcp-macos-utils
Installation
Prerequisites
macOS (required for notifications)
Node.js >= 18.0.0
tmux (optional, for tmux integration)
Install from npm
npm install -g macos-notify-mcpBuild from source
git clone https://github.com/yuki-yano/macos-notify-mcp.git
cd macos-notify-mcp
npm install
npm run build
npm run build-app # Build the macOS app bundle (only needed for development)Usage
As MCP Server
First, install the package globally:
npm install -g macos-notify-mcpQuick Setup with Claude Code
Use the claude mcp add command:
claude mcp add macos-notify -s user -- macos-notify-mcpThen restart Claude Code.
Manual Setup for Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"macos-notify": {
"command": "macos-notify-mcp"
}
}
}Available MCP Tools
send_notification- Send a macOS notificationmessage(required): Notification messagetitle: Notification title (default: "Claude Code")sound: Notification sound (default: "Glass")session: tmux session namewindow: tmux window numberpane: tmux pane numberuseCurrent: Use current tmux location
list_tmux_sessions- List available tmux sessionsget_current_tmux_info- Get current tmux session information
As CLI Tool
# Basic notification
macos-notify-cli -m "Build completed"
# With title
macos-notify-cli -t "Development" -m "Tests passed"
# With tmux integration
macos-notify-cli -m "Task finished" -s my-session -w 1 -p 0
# Use current tmux location
macos-notify-cli -m "Check this pane" --current-tmux
# Detect current terminal emulator
macos-notify-cli --detect-terminal
# List tmux sessions
macos-notify-cli --list-sessionsTerminal Detection
The tool automatically detects which terminal emulator you're using and uses this information when you click on notifications to focus the correct application. You can test terminal detection with:
# Test terminal detection
macos-notify-cli --detect-terminalSupported Terminal Detection
The tool detects terminals using various methods:
Cursor: Via
CURSOR_TRACE_IDenvironment variableVSCode: Via
VSCODE_IPC_HOOK_CLIorVSCODE_REMOTEenvironment variablesalacritty: Via
ALACRITTY_WINDOW_IDorALACRITTY_SOCKETenvironment variablesiTerm2: Via
TERM_PROGRAM=iTerm.appTerminal.app: Via
TERM_PROGRAM=Apple_Terminal
Terminal Detection in tmux
When running inside tmux, the tool attempts to detect which terminal emulator the active tmux client is using:
Active Client Detection: Identifies the most recently active tmux client
TTY Process Analysis: Traces processes using the client's TTY
Environment Preservation: Checks preserved environment variables
Process Tree Fallback: Analyzes the process tree as a last resort
For advanced tmux client tracking, see examples/tmux-client-tracking.sh.
How it Works
Notification Delivery: Uses a native macOS app bundle (MacOSNotifyMCP.app) to send UserNotifications API notifications
Click Handling: When a notification is clicked, the app activates the detected terminal emulator (VSCode, Cursor, iTerm2, alacritty, or Terminal.app) and switches to the specified tmux session
Terminal Support: Automatically detects and activates the correct terminal application
Multiple Instances: Each notification runs as a separate process, allowing multiple concurrent notifications
Architecture
The project consists of two main components:
MCP Server/CLI (TypeScript/Node.js)
Implements the Model Context Protocol
Provides a command-line interface
Manages tmux session detection and validation
MacOSNotifyMCP.app (Swift/macOS)
Native macOS application for notifications
Handles notification clicks to focus tmux sessions
Runs as a background process for each notification
MacOSNotifyMCP.app
The MacOSNotifyMCP.app is bundled with the npm package and is automatically available after installation. No additional setup is required.
Troubleshooting
Notifications not appearing
Check System Settings β Notifications β MacOSNotifyMCP
Ensure notifications are allowed
Run
macos-notify-mcp -m "test"to verify
tmux integration not working
Ensure tmux is installed and running
Check session names with
macos-notify-mcp --list-sessionsVerify terminal app is supported (Alacritty, iTerm2, WezTerm, or Terminal)
Development
# Install dependencies
npm install
# Build TypeScript
npm run build
# Run in development
npm run dev
# Lint and format code
npm run lint
npm run format
# Build macOS app (only if modifying Swift code)
npm run build-appLicense
MIT
Author
Yuki Yano
Available Tools
3 toolsget_current_tmux_infoC
Get current tmux session information
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states what the tool does but doesn't describe any behavioral traits - no information about what 'current' means operationally, whether this requires specific tmux environment, what format the information returns, or any error conditions. The description is minimal and lacks behavioral context.
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?
The description is extremely concise at just 5 words - 'Get current tmux session information'. It's front-loaded with the core purpose and contains no unnecessary words or sentences. Every word earns its place in conveying the basic function.
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?
Given the tool has no annotations, no output schema, and a sibling tool with similar purpose ('list_tmux_sessions'), the description is insufficiently complete. It doesn't explain what 'current' means versus 'list', what information is returned, or how this tool differs from its sibling. For a tool that presumably returns data, the lack of output description is a significant gap.
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 has 0 parameters with 100% schema description coverage, so the schema already fully documents the parameter situation. The description appropriately doesn't mention parameters since none exist. This meets the baseline expectation for parameterless tools.
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 'Get current tmux session information' clearly states the verb ('Get') and resource ('current tmux session information'), making the purpose understandable. However, it doesn't distinguish this from the sibling tool 'list_tmux_sessions' - both appear to retrieve tmux session data, so the distinction between 'current' and 'list' isn't clarified.
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?
No guidance is provided about when to use this tool versus the sibling 'list_tmux_sessions'. The description implies it retrieves 'current' information, but doesn't specify what 'current' means in this context or when you would choose this over listing all sessions. No alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tmux_sessionsB
List available tmux sessions
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states what the tool does but doesn't describe how it behavesβno information on output format, error conditions, permissions needed, or whether it's read-only/destructive. This is inadequate for a tool with zero annotation coverage.
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?
The description is a single, efficient sentence with zero wasted words. It's front-loaded with the core purpose and appropriately sized for a simple tool, making it easy for an agent to parse quickly.
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?
Given the lack of annotations and output schema, the description is incomplete. It doesn't explain what the tool returns (e.g., session names, IDs, status) or any behavioral context, which is essential for an agent to use it effectively. The simplicity of 0 parameters doesn't compensate for these 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?
The tool has 0 parameters with 100% schema description coverage, so the schema already fully documents the lack of inputs. The description doesn't need to add parameter information, and it correctly doesn't mention any, earning a baseline score of 4 for appropriate compensation.
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 clearly states the verb ('List') and resource ('available tmux sessions'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'get_current_tmux_info' which might overlap in functionality, preventing a perfect score.
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 description provides no guidance on when to use this tool versus alternatives like 'get_current_tmux_info' or 'send_notification'. There's no mention of context, prerequisites, or exclusions, leaving the agent to infer usage from tool names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_notificationC
Send a macOS notification with optional tmux integration
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | The notification message | |
| title | No | The notification title (default: "Claude Code") | |
| sound | No | The notification sound (default: "Glass") | |
| session | No | tmux session name | |
| window | No | tmux window number | |
| pane | No | tmux pane number | |
| useCurrent | No | Use current tmux location |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions the tool sends notifications and has tmux integration, but doesn't describe what happens when notifications are sent (do they appear immediately? require permissions?), what errors might occur, or any rate limits. The description is minimal and leaves important behavioral aspects unspecified.
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?
The description is extremely concise - a single sentence that efficiently communicates the core functionality and key feature. Every word earns its place with no wasted text, making it front-loaded and easy to parse.
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?
Given this is a notification tool with 7 parameters, no annotations, and no output schema, the description is insufficiently complete. It doesn't explain what the tool returns, what happens on success/failure, platform requirements (macOS only?), or how the tmux integration actually works. For a tool with this complexity, more context is needed.
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 documents all 7 parameters thoroughly with descriptions and defaults. The description adds no additional parameter information beyond what's in the schema, maintaining the baseline score of 3 for adequate but not enhanced parameter documentation.
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 clearly states the action ('send') and resource ('macOS notification'), and mentions the optional tmux integration feature. However, it doesn't specifically differentiate this tool from its siblings (get_current_tmux_info, list_tmux_sessions), which are query tools while this is a notification tool.
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 description mentions 'optional tmux integration' which implies some context for when tmux parameters might be relevant, but provides no explicit guidance about when to use this tool versus alternatives, when not to use it, or what prerequisites might be needed for macOS notifications or tmux integration to work.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose: get_current_tmux_info retrieves details about the current session, list_tmux_sessions enumerates all available sessions, and send_notification handles macOS notifications with optional tmux integration. There is no overlap or ambiguity between these functions.
The naming follows a consistent verb_noun pattern (get_current_tmux_info, list_tmux_sessions, send_notification) with clear actions and objects. The minor deviation is that send_notification uses a more generic object term compared to the tmux-specific others, but it remains readable and coherent.
With only 3 tools, the set feels thin for a server named 'macOS Notify MCP', which suggests broader macOS notification capabilities. While the tools cover tmux session management and notifications, the scope might be too narrow, potentially lacking other notification-related operations.
The tools provide basic tmux session info and notification sending, but there are notable gaps. For a macOS notification server, expected features like managing notification settings, handling different notification types, or integrating with other system events are missing, limiting the surface's completeness.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yoβ¦
Push notifications for AI agents - send instant iPhone notifications from any MCP client.
Nifty's MCP server β exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseAqualityCmaintenanceAn MCP server that enables AI assistants like Claude to help users manage their GitHub notifications through natural language commands.111416MIT
- FlicenseAqualityDmaintenanceAn MCP server that enables AI assistants to send native macOS notifications with automatic project detection and categorization. It includes logging capabilities for all notifications to provide an audit trail of system alerts.1
- AlicenseAqualityDmaintenanceMCP server that lets Claude Desktop or another MCP client trigger macOS sound and visual notifications through a task_status tool.116MIT
- AlicenseBqualityBmaintenanceA comprehensive MCP server for driving tmux sessions, windows, panes, sending keystrokes, and reading pane output locally or over SSH, enabling real-time collaborative pairing with AI.711MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/yuki-yano/macos-notify-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server