apprise-rmcp
Apprise notifications over MCP and CLI with authenticated stdio and HTTP transports.
It exposes one MCP tool, apprise, plus the rapprise CLI. Agents can send
tagged notifications through a preconfigured Apprise server, run one-off
Apprise URL sends, and check upstream health through stdio MCP, Streamable HTTP
MCP, or direct shell commands.
30-second path: run npx -y @dinglebear/rapprise health --json -> start loopback
HTTP with APPRISE_MCP_HOST=127.0.0.1 npx -y @dinglebear/rapprise serve -> call
tools/call with {"action":"health"}.
Status: operational RMCP upstream-client server. Write-capable; notification
sends are intentional side effects. HTTP MCP supports loopback dev mode, static
bearer tokens, and Google OAuth through lab-auth.
Not for: replacing Apprise API, storing notification destinations in this repo, scheduling reminders, building a generic webhook relay, multi-tenant isolation, or passing upstream Apprise bearer tokens through MCP tool arguments.
Contents
- Naming
- Capabilities And Boundaries
- Install
- Quickstart
- Client Configuration
- Runtime Surfaces
- MCP Tool Reference
- CLI Reference
- Configuration
- Authentication
- Safety And Trust Model
- Architecture
- Distribution Contract
- Development
- Verification
- Deployment
- Troubleshooting
- Related Servers
- Documentation
- License
Naming
The repo and npm package use the RMCP family name, while the shipped binary uses
the short Rust CLI name rapprise.
Capabilities And Boundaries
- Send notifications through tags configured in the upstream Apprise API server.
- Send one-off notifications to Apprise URL schemas with
notify_url. - Check upstream Apprise API health.
- Expose the
send_alertprompt for critical alert workflows. - Provide setup and doctor commands for local plugin/runtime checks.
Install
Releases publish SHA-256 files and offline GitHub build-provenance bundles. The installers verify both the checksum and provenance identity with GitHub CLI 2.68+. The npm launcher supports x86_64 Linux and Windows release assets.
npm / npx
Run the stdio MCP server or CLI without a manual binary install:
npx -y @dinglebear/rapprise --help
npx -y @dinglebear/rapprise mcp
npx -y @dinglebear/rapprise health --json
The npm package downloads rapprise during postinstall. Override download
behavior only when testing packaging:
Verified binary installation is fail-closed and pins the repository, release
workflow, and source tag. Install gh 2.68 or newer before using npm or the
release installer.
Verified Release Installer
Download the installer and its verification material without executing it, then verify both integrity and provenance before running it:
Replace version with the release tag you want; v0.2.0 is current.
version=v0.2.0
base="https://github.com/dinglebear-ai/rapprise/releases/download/${version}/rapprise-installer.sh"
curl -fsSLO "$base"
curl -fsSLO "$base.sha256"
curl -fsSLO "$base.sigstore.json"
sha256sum --check rapprise-installer.sh.sha256
gh attestation verify rapprise-installer.sh \
--repo dinglebear-ai/rapprise \
--bundle rapprise-installer.sh.sigstore.json \
--signer-workflow dinglebear-ai/rapprise/.github/workflows/release.yml \
--source-ref "refs/tags/${version}" \
--deny-self-hosted-runners
APPRISE_RMCP_VERSION="$version" bash rapprise-installer.sh
The --repo and --signer-workflow values must match the identity recorded in
the attestation at build time. Releases cut before the repository moved to the
dinglebear-ai org are attested as jmagar/rapprise; use dinglebear-ai/rapprise
for releases cut afterwards.
The npm launcher supports Windows x86_64 only when GitHub CLI 2.68+ is installed
and gh.exe is available on PATH; provenance verification is not skipped.
Build From Source
git clone https://github.com/dinglebear-ai/rapprise
cd rapprise
cargo build --release
./target/release/rapprise --help
Minimum supported Rust version: 1.90. Rust edition 2021. The Cargo workspace has
two members: the root apprise-mcp package and xtask.
Quickstart
1. Start Or Point At Apprise API
The default upstream is http://localhost:8000.
docker run --rm -p 8000:8000 caronc/apprise:latest
Use APPRISE_URL when the API server is elsewhere:
export APPRISE_URL=http://198.51.100.2:8766
Set APPRISE_TOKEN only when your Apprise API server requires bearer auth:
export APPRISE_TOKEN=...
2. Run A Safe CLI Call
npx -y @dinglebear/rapprise health --json
3. Start Loopback HTTP MCP
APPRISE_MCP_HOST=127.0.0.1 npx -y @dinglebear/rapprise serve
In another shell:
curl -sf http://127.0.0.1:40050/health
4. Make A First MCP Call
curl -s -X POST http://127.0.0.1:40050/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"apprise","arguments":{"action":"health"}}}'
Client Configuration
Claude Code Stdio
{
"mcpServers": {
"apprise": {
"command": "npx",
"args": ["-y", "apprise-rmcp", "mcp"],
"env": {
"APPRISE_URL": "http://localhost:8000"
}
}
}
}
Claude Code HTTP
{
"mcpServers": {
"apprise": {
"type": "http",
"url": "http://127.0.0.1:40050/mcp",
"headers": {
"Authorization": "Bearer ${APPRISE_MCP_TOKEN}"
}
}
}
}
Codex / Labby Gateway
Register Apprise through Labby as an HTTP upstream when sharing one long-running server, or run it directly as stdio for local-only use.
[mcp_servers.apprise]
command = "npx"
args = ["-y", "apprise-rmcp", "mcp"]
Generic MCP JSON
{
"command": "rapprise",
"args": ["mcp"],
"env": {
"APPRISE_URL": "http://localhost:8000"
}
}
Do not put APPRISE_TOKEN, OAuth secrets, SSH keys, passwords, or upstream
bearer tokens in MCP tool arguments. Use env, config files, or the MCP client's
secret storage.
Runtime Surfaces
MCP Tool Reference
One MCP tool is exposed: apprise. Pass the required action argument to select
the operation.
Read Actions
Write Actions
Notification Types
MCP Call Examples
curl -s -X POST http://127.0.0.1:40050/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"apprise","arguments":{"action":"health"}}}'
{
"name": "apprise",
"arguments": {
"action": "notify",
"body": "Deployment succeeded",
"tag": "ops",
"title": "Deploy complete",
"type": "success"
}
}
Curated action summaries live here. docs/INVENTORY.md is the current
source of truth for complete parameters until a generated docs/MCP_SCHEMA.md
is added.
CLI Reference
The CLI calls the same service methods as the MCP tool.
rapprise health [--json]
rapprise notify <body> [--tag TAG] [--title T] [--type info|success|warning|failure] [--json]
rapprise notify-url <urls> <body> [--title T] [--type info|success|warning|failure] [--json]
rapprise serve # Streamable HTTP MCP on :40050
rapprise serve mcp # same as `serve`
rapprise mcp # stdio MCP
rapprise doctor [--json] # pre-flight environment validation
rapprise setup check # read-only audit of appdata/env
rapprise setup repair # idempotent: create missing setup files
rapprise setup install # copy this binary into ~/.local/bin
rapprise setup plugin-hook [--no-repair]
rapprise help # or --help / -h
rapprise --version # or -V
--json emits raw JSON instead of pretty-printed fields. --help prints the
full environment-variable reference.
Configuration
Configuration loads from config.toml when present, then environment variables
override those values. On startup it loads
${APPRISE_HOME:-~/.apprise}/.env on hosts or /data/.env in containers.
See the complete inventory.
Upstream Variables
Runtime Variables
Token TTL and rate-limit variables (APPRISE_MCP_AUTH_*_TTL_SECS,
APPRISE_MCP_AUTH_*_REQUESTS_PER_MINUTE, APPRISE_MCP_AUTH_MAX_PENDING_OAUTH_STATES)
are listed in full in docs/INVENTORY.md.
Authentication
MCP scopes are apprise:notify and apprise:admin. OAuth tokens are checked
before MCP calls are dispatched.
Safety And Trust Model
- MCP callers never provide
APPRISE_TOKEN, OAuth secrets, static bearer tokens, passwords, SSH keys, or API keys as tool arguments. - Upstream Apprise credentials are loaded from env/config only.
notifyis the preferred path because destinations are configured upstream under tags.notify_urlintentionally accepts Apprise URL schemas in MCP arguments for one-off sends. Treat those URLs as sensitive payloads and avoid using them when a tagged upstream destination is available.- Apprise API is the durable source of destination configuration; this server is a thin projection over that API.
- HTTP mode should not be exposed beyond loopback without bearer or OAuth auth plus TLS from an upstream reverse proxy.
Architecture
MCP client / CLI
|
v
rapprise
|
+-- MCP shim: JSON args -> AppriseService -> structured result
+-- CLI shim: argv -> AppriseService -> stdout
|
v
AppriseService
|
v
AppriseClient
|
v
Apprise API server
|
v
Notification backends
Notification commands and MCP converge on AppriseService. The CLI also owns
setup, doctor, self-install, filesystem, and output orchestration today; it is
not a pure argument shim.
Distribution Contract
Release invariant: npm, crate, registry/server metadata, manifest, GitHub tag, and native assets move together. Release Please owns these updates.
Development
cargo fmt -- --check
cargo clippy --all-targets -- -D warnings
cargo test
cargo build --release
npm --prefix packages/apprise-rmcp run check
npm --prefix packages/apprise-rmcp test
# Contract checks
bash tests/docs-contract.sh # docs, versions, and plugin invariants
bash scripts/validate-plugin-layout.sh # or: just validate-plugin
just wraps the common loops: just check, just lint, just fmt,
just test, just release, just build-plugin, just docker-up,
just health. The plugin recipe is build-plugin — there is no plugin-build.
Cargo.toml declares rmcp = "1.6.0", but the caret range resolves forward and
Cargo.lock pins rmcp 1.7.0. Trust the lock.
Verification
# Binary and CLI
cargo build --release
./target/release/rapprise --version
./target/release/rapprise health --json
# HTTP health
APPRISE_MCP_HOST=127.0.0.1 ./target/release/rapprise serve
curl -sf http://127.0.0.1:40050/health
# MCP tool call
curl -s -X POST http://127.0.0.1:40050/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"apprise","arguments":{"action":"health"}}}'
For live notification tests, configure at least one destination in the Apprise
API server and call notify with its tag.
Deployment
Docker / Compose
docker-compose.prod.yml declares the apprise-mcp network as external: true,
so create it once before the first bring-up:
cp .env.example .env
$EDITOR .env
docker network create apprise-mcp
docker compose up -d
curl -sf http://127.0.0.1:40050/health
docker-compose.yml builds apprise-mcp:dev from config/Dockerfile and
extends the production service. docker-compose.prod.yml alone runs the
published image with pull_policy: never, so pull or load it first. The
container runs read-only as UID 1000 and stores app data under /data, normally
mounted from ${APPRISE_DATA_DIR:-${HOME}/.apprise}. Override the published
host port with APPRISE_MCP_HOST_PORT.
Reverse Proxy
Expose only /mcp and /health — plus the lab-auth and /mcp/.well-known/*
routes when running OAuth. Keep /ready and /status internal. Preserve
Streamable HTTP headers, require TLS, and configure bearer or OAuth auth before
exposing the server beyond loopback.
Plugin
The plugin is bundled stdio and ships no Claude Code hooks — nothing runs automatically on session start, so run setup yourself once:
just build-plugin
claude plugin install ./plugins/apprise
rapprise setup check
Troubleshooting
Related Servers
- soma - RMCP runtime and scaffold for provider-backed MCP servers.
- unifi-rmcp - UniFi controller REST API bridge.
- tailscale-rmcp - Tailscale API bridge for devices, users, and tailnet operations.
- unraid - Unraid monorepo;
unraid-rs/is the GraphQL MCP bridge (binaryrunraid). - gotify-rmcp - Gotify push notification bridge for sends, messages, apps, and clients.
- arcane-rmcp - Arcane Docker management bridge for containers and related resources.
- yarr - Media-stack bridge for Sonarr, Radarr, Prowlarr, Plex, and related services.
- ytdl-rmcp - Media download and metadata workflow server.
- synapse-rmcp - Local Synapse workflow server for scout and flux actions.
- cortex - Syslog and homelab log aggregation MCP server.
- axon - RAG, crawl, scrape, extract, and semantic search project.
- labby - Homelab control plane and MCP gateway project.
Documentation
Start here:
docs/QUICKSTART.md- focused setup flow.docs/INVENTORY.md- component inventory for actions, CLI commands, env vars, and endpoints.docs/README.md- docs index.server.json- MCP registry metadata.packages/apprise-rmcp/README.md- npm package launcher notes.
This README is curated. Generated or exhaustive catalogs should be refreshed in their own files and treated as the source of truth for current branch details.
License
Original Dinglebear-authored portions of this project are licensed under AGPL-3.0-only. Separate commercial licensing is available for organizations that need terms outside the AGPL. Third-party material remains under its original license. See LICENSING.md.