A high-performance Model Context Protocol (MCP) server for sending push notifications via the Pushover API. Built in Rust for speed and reliability.
This server enables LLMs to send push notifications to your devices through the Pushover service. Perfect for getting notified when long-running tasks complete, receiving alerts, or any scenario where an AI assistant needs to get your attention.
- Simple notifications - Send messages with just a single parameter
- Rich formatting - HTML or monospace text formatting
- Priority levels - Named levels: silent, low, normal, high, emergency
- Emergency management - Check receipt status and cancel emergency notifications
- Device targeting - Send to specific devices when needed
- Supplementary URLs - Attach links to notifications
- Custom sounds - Choose from Pushover's sound library
- Auto-configuration - Config file created automatically on first run
- Fast startup - Sub-second initialization
cargo build --releaseOn first run, a config file is created automatically. Edit it to add your Pushover credentials:
- Linux:
~/.config/pushover-mcp-rs/config.json - macOS:
~/Library/Application Support/pushover-mcp-rs/config.json - Windows:
C:\Users\{user}\AppData\Roaming\pushover-mcp-rs\config.json
{
"token": "your-pushover-api-token",
"default_user_key": "your-user-key",
"default_device": null
}Get your API token and user key from pushover.net.
./target/release/pushover-mcp-rsThe server communicates via JSON-RPC 2.0 over stdin/stdout.
The server provides 4 tools:
| Tool | Description |
|---|---|
send_notification |
Send a push notification (only message is required) |
list_devices |
List available device names for targeting specific devices |
| Tool | Description |
|---|---|
check_emergency_receipt |
Check if an emergency notification was acknowledged |
cancel_emergency_notification |
Cancel an emergency notification that is still retrying |
The send_notification tool supports these parameters:
| Parameter | Required | Description |
|---|---|---|
message |
Yes | The notification message (max 1024 characters) |
title |
No | Message title (max 250 characters, defaults to app name) |
priority |
No | One of: silent, low, normal (default), high, emergency |
sound |
No | One of: pushover, bike, bugle, cashregister, classical, cosmic, falling, gamelan, incoming, intermission, magic, mechanical, pianobar, siren, spacealarm, tugboat, alien, climb, persistent, echo, updown, vibrate, none |
url |
No | Supplementary URL to include (max 512 bytes) |
url_title |
No | Title for the URL, requires url (max 100 characters) |
html |
No | Enable HTML formatting (b, i, u, a, font tags). Cannot use with monospace |
monospace |
No | Display message in monospace font. Cannot use with html |
device |
No | Target specific device (only use if explicitly requested) |
ttl |
No | Time until auto-deleted from device, in seconds. Unrelated to expire. |
timestamp |
No | Unix timestamp to show as sent time. Useful for delayed notifications. |
retry |
No | Emergency only: retry interval in seconds (min 30, default 60) |
expire |
No | Emergency only: how long to keep retrying in seconds (max 10800, default 3600). Unrelated to ttl. |
| Value | Behavior |
|---|---|
silent |
No alert generated. Message only visible when user opens the app. |
low |
Quiet notification. No sound but may show on screen. |
normal |
Default notification with sound and vibration (default if not specified). |
high |
Important: always plays sound and vibrates, even during quiet hours. |
emergency |
Critical: repeats every 60s for 1 hour until acknowledged. Returns receipt ID. |
Add to your Claude Code configuration using the CLI:
claude mcp add pushover -s user -- /path/to/pushover-mcp-rsOr add directly to ~/.claude.json:
{
"mcpServers": {
"pushover": {
"type": "stdio",
"command": "/path/to/pushover-mcp-rs"
}
}
}Verify with:
claude mcp listThen use /mcp inside Claude Code to check the connection status.
Add to ~/.config/goose/config.yaml:
extensions:
pushover:
bundled: false
display_name: "Pushover"
enabled: true
name: "pushover"
timeout: 300
type: "stdio"
cmd: "/path/to/pushover-mcp-rs"
args: []Or add interactively:
goose configureSelect "Add Extension" -> "Command-line Extension" and enter the path to the binary.
Verify with:
goose info -vAdd to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"pushover": {
"command": "/path/to/pushover-mcp-rs"
}
}
}The server uses JSON-RPC 2.0 over stdin/stdout:
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}' | ./pushover-mcp-rs{
"name": "send_notification",
"arguments": {
"message": "Build completed successfully!"
}
}{
"name": "send_notification",
"arguments": {
"message": "Deployment to production finished",
"title": "CI/CD Pipeline",
"priority": "high"
}
}{
"name": "send_notification",
"arguments": {
"message": "Server is down! Immediate attention required.",
"title": "Critical Alert",
"priority": "emergency",
"retry": 60,
"expire": 3600
}
}Returns a receipt ID for tracking acknowledgment.
{
"name": "check_emergency_receipt",
"arguments": {
"receipt": "receipt-id-from-send"
}
}{
"name": "cancel_emergency_notification",
"arguments": {
"receipt": "receipt-id-from-send"
}
}{
"name": "send_notification",
"arguments": {
"message": "New PR ready for review",
"url": "https://github.com/org/repo/pull/123",
"url_title": "View Pull Request"
}
}{
"name": "send_notification",
"arguments": {
"message": "<b>Task Complete</b><br>Processed <i>1,234</i> records",
"html": true
}
}{
"name": "send_notification",
"arguments": {
"message": "Error: connection refused\n at main.rs:42",
"monospace": true
}
}{
"name": "send_notification",
"arguments": {
"message": "Timer finished!",
"sound": "siren"
}
}{
"name": "list_devices",
"arguments": {}
}{
"name": "send_notification",
"arguments": {
"message": "Sent to your phone only",
"device": "iphone"
}
}- Rust 1.85 or later (edition 2024)
cargo build --releasecargo clippy --release -- -W clippy::all -W clippy::pedanticRUST_LOG=pushover_mcp_rs=debug ./target/release/pushover-mcp-rsCheck version:
./pushover-mcp-rs --versionRelease new version:
./set-version.sh 1.2.3
git push origin main --follow-tagssrc/
├── main.rs # Entry point, CLI, MCP server initialization
├── server.rs # MCP server and tool implementations
├── model.rs # Data structures for parameters and responses
└── config.rs # Configuration file management
- Edit the config file and add your API token
- Get your token from pushover.net/apps
- Add
default_user_keyto your config file - Get your user key from pushover.net
- The
messageparameter is required and cannot be blank
- Choose one formatting option: either
html: trueormonospace: true
- Run
/mcpto check server status - Verify the binary path is correct
- Check logs:
RUST_LOG=pushover_mcp_rs=debugfor verbose output
- Run
goose info -vto verify configuration - Increase timeout if the server is slow to start
MIT License. See LICENSE for details.
Christian Wohlert
- appbase-cloud-log-mcp-rs - MCP server for analyzing Kubernetes log files
- ro-mongodb-mcp-rs - Read-only MongoDB MCP server