smithery badge Send native macOS notifications and interact with system dialogs through any MCP-compatible client like Claude Desktop or Cline.

apple-notifier-mcp MCP server

Prerequisites

  • macOS
  • Node.js >= 18
  • An MCP-compatible client (Claude Desktop, Cline)

Installation

Installing via Smithery

To install Apple Notifier for Claude Desktop automatically via Smithery:

npx -y @smithery/cli install apple-notifier-mcp --client claude

Manual Installation

  1. Install the package globally:

    npm install -g apple-notifier-mcp

  2. Add to your MCP configuration file:

For Cline (cline_mcp_settings.json):

{
  "mcpServers": {
    "apple-notifier": {
      "command": "apple-notifier-mcp"
    }
  }
}

For Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "apple-notifier": {
      "command": "apple-notifier-mcp"
    }
  }
}

Features

Send Notifications

Display native macOS notifications with customizable content.

Parameters: - title (required): string - The title of the notification - message (required): string - The main message content - subtitle (optional): string - A subtitle to display - sound (optional): boolean - Whether to play the default notification sound (default: true)

Display Prompts

Show interactive dialog prompts to get user input.

Parameters: - message (required): string - Text to display in the prompt dialog - defaultAnswer (optional): string - Default text to pre-fill - buttons (optional): string[] - Custom button labels (max 3) - icon (optional): 'note' | 'stop' | 'caution' - Icon to display

Text-to-Speech

Use macOS text-to-speech capabilities.

Parameters: - text (required): string - Text to speak - voice (optional): string - Voice to use (defaults to system voice) - rate (optional): number - Speech rate (-50 to 50, defaults to 0)

Take Screenshots

Capture screenshots using macOS screencapture.

Parameters: - path (required): string - Path where to save the screenshot - type (required): 'fullscreen' | 'window' | 'selection' - Type of screenshot - format (optional): 'png' | 'jpg' | 'pdf' | 'tiff' - Image format - hideCursor (optional): boolean - Whether to hide the cursor - shadow (optional): boolean - Whether to include window shadow (only for window type) - timestamp (optional): boolean - Add timestamp to filename

File Selection

Open native macOS file picker dialog.

Parameters: - prompt (optional): string - Prompt message - defaultLocation (optional): string - Default directory path - fileTypes (optional): object - File type filter (e.g., {"public.image": ["png", "jpg"]}) - multiple (optional): boolean - Allow multiple file selection

Example Usage

// Send a notification
await client.use_mcp_tool("apple-notifier", "send_notification", {
  title: "Hello",
  message: "World",
  sound: true
});

// Show a prompt
const result = await client.use_mcp_tool("apple-notifier", "prompt_user", {
  message: "What's your name?",
  defaultAnswer: "John Doe",
  buttons: ["OK", "Cancel"]
});

// Speak text
await client.use_mcp_tool("apple-notifier", "speak", {
  text: "Hello, world!",
  voice: "Samantha",
  rate: -20
});

// Take a screenshot
await client.use_mcp_tool("apple-notifier", "take_screenshot", {
  path: "screenshot.png",
  type: "window",
  format: "png"
});

// Select files
const files = await client.use_mcp_tool("apple-notifier", "select_file", {
  prompt: "Select images",
  fileTypes: {
    "public.image": ["png", "jpg", "jpeg"]
  },
  multiple: true
});

Contributing

See CONTRIBUTING.md for development setup and guidelines.

License

MIT License - see the LICENSE file for details.

[
  {
    "description": "Send a notification on macOS using osascript",
    "inputSchema": {
      "additionalProperties": false,
      "properties": {
        "message": {
          "description": "Main message content",
          "type": "string"
        },
        "sound": {
          "default": true,
          "description": "Whether to play the default notification sound",
          "type": "boolean"
        },
        "subtitle": {
          "description": "Optional subtitle",
          "type": "string"
        },
        "title": {
          "description": "Title of the notification",
          "type": "string"
        }
      },
      "required": [
        "title",
        "message"
      ],
      "type": "object"
    },
    "name": "send_notification"
  },
  {
    "description": "Display a dialog prompt to get user input",
    "inputSchema": {
      "additionalProperties": false,
      "properties": {
        "buttons": {
          "description": "Optional custom button labels (max 3)",
          "items": {
            "type": "string"
          },
          "maxItems": 3,
          "type": "array"
        },
        "defaultAnswer": {
          "description": "Optional default text to pre-fill",
          "type": "string"
        },
        "icon": {
          "description": "Optional icon to display",
          "enum": [
            "note",
            "stop",
            "caution"
          ],
          "type": "string"
        },
        "message": {
          "description": "Text to display in the prompt dialog",
          "type": "string"
        }
      },
      "required": [
        "message"
      ],
      "type": "object"
    },
    "name": "prompt_user"
  },
  {
    "description": "Speak text using macOS text-to-speech",
    "inputSchema": {
      "additionalProperties": false,
      "properties": {
        "rate": {
          "description": "Speech rate (-50 to 50, defaults to 0)",
          "maximum": 50,
          "minimum": -50,
          "type": "number"
        },
        "text": {
          "description": "Text to speak",
          "type": "string"
        },
        "voice": {
          "description": "Voice to use (defaults to system voice)",
          "type": "string"
        }
      },
      "required": [
        "text"
      ],
      "type": "object"
    },
    "name": "speak"
  },
  {
    "description": "Take a screenshot using macOS screencapture",
    "inputSchema": {
      "additionalProperties": false,
      "properties": {
        "format": {
          "description": "Image format",
          "enum": [
            "png",
            "jpg",
            "pdf",
            "tiff"
          ],
          "type": "string"
        },
        "hideCursor": {
          "description": "Whether to hide the cursor",
          "type": "boolean"
        },
        "path": {
          "description": "Path where to save the screenshot",
          "type": "string"
        },
        "shadow": {
          "description": "Whether to include the window shadow (only for window type)",
          "type": "boolean"
        },
        "timestamp": {
          "description": "Timestamp to add to filename",
          "type": "boolean"
        },
        "type": {
          "description": "Type of screenshot to take",
          "enum": [
            "fullscreen",
            "window",
            "selection"
          ],
          "type": "string"
        }
      },
      "required": [
        "path",
        "type"
      ],
      "type": "object"
    },
    "name": "take_screenshot"
  },
  {
    "description": "Open native file picker dialog",
    "inputSchema": {
      "additionalProperties": false,
      "properties": {
        "defaultLocation": {
          "description": "Optional default directory path",
          "type": "string"
        },
        "fileTypes": {
          "additionalProperties": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "description": "Optional file type filter (e.g., {"public.image": ["png", "jpg"]})",
          "type": "object"
        },
        "multiple": {
          "description": "Whether to allow multiple selection",
          "type": "boolean"
        },
        "prompt": {
          "description": "Optional prompt message",
          "type": "string"
        }
      },
      "type": "object"
    },
    "name": "select_file"
  }
]