# notifyd MCP server

> Operate a self-hosted notifyd notification service: digest, jobs, retries, suppressions, projects and test sends.

- Listing: https://mcp.tc/i/notifyd
- Connect: this is a local (stdio) server; install it on your machine (see Install). The listing link is a page, not an MCP endpoint.
- Type: local (stdio)
- Auth: API key
- Category: [Developer Tools](https://mcp.tc/c/developer-tools)
- Vendor: rmzlb
- Homepage: <https://rmzlb.github.io/notifyd/>
- Repository: <https://github.com/rmzlb/notifyd>
- Package: oci `ghcr.io/rmzlb/notifyd:0.4.0`

## About

notifyd is a self-hosted notification service written in Rust that sends email, SMS, WhatsApp, push and in-app messages through one API, backed only by PostgreSQL. Its built-in MCP server lets an assistant act as the operator: read a ranked digest of findings, inspect and retry failed jobs, manage suppressions, update project settings and send test messages.

It runs as a Docker image (ghcr.io/rmzlb/notifyd) and serves a Streamable HTTP endpoint at /mcp on your own host. Requests need an Authorization Bearer header: the admin key gives full access, and a read-only key exposes only the read tools.

## What it can do

- Get a ranked digest of what needs attention, with actions
- List and inspect jobs by project, channel, status or recipient
- Retry or cancel stuck or wrong sends
- List and update project sender identity, channels and send windows
- Manage the suppression list with all or marketing scope
- View sent, failed, bounced and opened metrics per template
- Send test notifications on any channel

## Example prompts

- "Run the notifyd digest and tell me what needs attention."
- "List failed jobs from the last 24 hours and retry the ones that are safe."
- "Add user@example.com to the marketing suppression list."
- "Send a test email from the myapp project to me@example.com."

## Install

### Claude Code

1. Run this in a terminal, in your project folder:

```bash
claude mcp add --transport stdio notifyd --env "DATABASE_URL=<YOUR_DATABASE_URL>" --env "JWT_SECRET=<YOUR_JWT_SECRET>" --env "ADMIN_API_KEY=<YOUR_ADMIN_API_KEY>" -- docker run -i --rm ghcr.io/rmzlb/notifyd:0.4.0
```

2. Start Claude Code and type `/mcp`. **notifyd** should show as connected.

Add `--scope user` to make it available in every project. Replace the placeholders with your own values.

### Claude Desktop

1. Open **Settings → Developer → Edit Config**. It opens `claude_desktop_config.json`. Add:

`claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "notifyd": {
      "command": "docker",
      "args": [
        "run",
        "-e",
        "DATABASE_URL",
        "-e",
        "JWT_SECRET",
        "-e",
        "ADMIN_API_KEY",
        "-i",
        "--rm",
        "ghcr.io/rmzlb/notifyd:0.4.0"
      ],
      "env": {
        "DATABASE_URL": "<YOUR_DATABASE_URL>",
        "JWT_SECRET": "<YOUR_JWT_SECRET>",
        "ADMIN_API_KEY": "<YOUR_ADMIN_API_KEY>"
      }
    }
  }
}
```

2. Save the file and restart Claude Desktop. Replace the placeholders with your own values.

Needs Docker on your computer. The file lives in `~/Library/Application Support/Claude/` on macOS and `%APPDATA%\Claude\` on Windows.

### Cursor

[Add to Cursor](<https://cursor.com/install-mcp?name=notifyd&config=eyJjb21tYW5kIjoiZG9ja2VyIiwiYXJncyI6WyJydW4iLCItZSIsIkRBVEFCQVNFX1VSTCIsIi1lIiwiSldUX1NFQ1JFVCIsIi1lIiwiQURNSU5fQVBJX0tFWSIsIi1pIiwiLS1ybSIsImdoY3IuaW8vcm16bGIvbm90aWZ5ZDowLjQuMCJdLCJlbnYiOnsiREFUQUJBU0VfVVJMIjoiPFlPVVJfREFUQUJBU0VfVVJMPiIsIkpXVF9TRUNSRVQiOiI8WU9VUl9KV1RfU0VDUkVUPiIsIkFETUlOX0FQSV9LRVkiOiI8WU9VUl9BRE1JTl9BUElfS0VZPiJ9fQ%3D%3D>) (opens Cursor)

Or add it by hand to `~/.cursor/mcp.json` (all projects) or `.cursor/mcp.json` (this project):

`mcp.json`:

```json
{
  "mcpServers": {
    "notifyd": {
      "command": "docker",
      "args": [
        "run",
        "-e",
        "DATABASE_URL",
        "-e",
        "JWT_SECRET",
        "-e",
        "ADMIN_API_KEY",
        "-i",
        "--rm",
        "ghcr.io/rmzlb/notifyd:0.4.0"
      ],
      "env": {
        "DATABASE_URL": "<YOUR_DATABASE_URL>",
        "JWT_SECRET": "<YOUR_JWT_SECRET>",
        "ADMIN_API_KEY": "<YOUR_ADMIN_API_KEY>"
      }
    }
  }
}
```

Needs Docker on your computer. Replace the placeholders with your own values.

### VS Code

Add it to `.vscode/mcp.json`. VS Code asks for the secret the first time and stores it securely:

`.vscode/mcp.json`:

```json
{
  "servers": {
    "notifyd": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "-e",
        "DATABASE_URL",
        "-e",
        "JWT_SECRET",
        "-e",
        "ADMIN_API_KEY",
        "-i",
        "--rm",
        "ghcr.io/rmzlb/notifyd:0.4.0"
      ],
      "env": {
        "DATABASE_URL": "${input:database-url}",
        "JWT_SECRET": "${input:jwt-secret}",
        "ADMIN_API_KEY": "${input:admin-api-key}"
      }
    }
  },
  "inputs": [
    {
      "type": "promptString",
      "id": "database-url",
      "description": "DATABASE_URL",
      "password": true
    },
    {
      "type": "promptString",
      "id": "jwt-secret",
      "description": "JWT_SECRET",
      "password": true
    },
    {
      "type": "promptString",
      "id": "admin-api-key",
      "description": "ADMIN_API_KEY",
      "password": true
    }
  ]
}
```

Needs Docker on your computer.

### Devin Desktop

1. Add it to `~/.config/devin/mcp_config.json` (macOS and Linux) or `%APPDATA%\devin\mcp_config.json` (Windows):

`mcp_config.json`:

```json
{
  "mcpServers": {
    "notifyd": {
      "command": "docker",
      "args": [
        "run",
        "-e",
        "DATABASE_URL",
        "-e",
        "JWT_SECRET",
        "-e",
        "ADMIN_API_KEY",
        "-i",
        "--rm",
        "ghcr.io/rmzlb/notifyd:0.4.0"
      ],
      "env": {
        "DATABASE_URL": "<YOUR_DATABASE_URL>",
        "JWT_SECRET": "<YOUR_JWT_SECRET>",
        "ADMIN_API_KEY": "<YOUR_ADMIN_API_KEY>"
      }
    }
  }
}
```

2. Refresh the MCP server list in Cascade. Replace the placeholders with your own values.

Devin Desktop is the new name for Windsurf.

### Codex

```bash
codex mcp add notifyd --env "DATABASE_URL=<YOUR_DATABASE_URL>" --env "JWT_SECRET=<YOUR_JWT_SECRET>" --env "ADMIN_API_KEY=<YOUR_ADMIN_API_KEY>" -- docker run -i --rm ghcr.io/rmzlb/notifyd:0.4.0
```

Or edit `~/.codex/config.toml` directly:

`config.toml`:

```toml
[mcp_servers.notifyd]
command = "docker"
args = ["run", "-i", "--rm", "ghcr.io/rmzlb/notifyd:0.4.0"]
env = { DATABASE_URL = "<YOUR_DATABASE_URL>", JWT_SECRET = "<YOUR_JWT_SECRET>", ADMIN_API_KEY = "<YOUR_ADMIN_API_KEY>" }
```

Needs Docker on your computer. Replace the placeholders with your own values.

### Gemini CLI

```bash
gemini mcp add -e "DATABASE_URL=<YOUR_DATABASE_URL>" -e "JWT_SECRET=<YOUR_JWT_SECRET>" -e "ADMIN_API_KEY=<YOUR_ADMIN_API_KEY>" notifyd docker -- run -i --rm ghcr.io/rmzlb/notifyd:0.4.0
```

This adds it to the current project. Add `-s user` to use it everywhere.

### Any client

Most clients that start local servers accept this shape:

```json
{
  "mcpServers": {
    "notifyd": {
      "command": "docker",
      "args": [
        "run",
        "-e",
        "DATABASE_URL",
        "-e",
        "JWT_SECRET",
        "-e",
        "ADMIN_API_KEY",
        "-i",
        "--rm",
        "ghcr.io/rmzlb/notifyd:0.4.0"
      ],
      "env": {
        "DATABASE_URL": "<YOUR_DATABASE_URL>",
        "JWT_SECRET": "<YOUR_JWT_SECRET>",
        "ADMIN_API_KEY": "<YOUR_ADMIN_API_KEY>"
      }
    }
  }
}
```

Zed puts servers under `context_servers` in its settings, with the same `command`, `args` and `env` fields.

Needs Docker on your computer. Replace the placeholders with your own values.

## Details

- Server version: 0.4.0
- Last checked: 2026-10-04
- Listed: 2026-10-04
- Updated: 2026-10-04

---
Source: https://mcp.tc/i/notifyd (mcp.tc is an independent directory, not affiliated with this server's publisher). Corrections: https://mcp.tc/report
