Operating notifyd
notifyd has no dashboard. You are the operator: read the digest, act with the tools, read the digest again.
Connect
MCP endpoint: POST <instance>/mcp, Authorization: Bearer <key>.
Two keys exist: the admin key (everything) and an optional read-only key
(digest, listings, metrics). With the read-only key, mutating tools answer
isError: true and say so; do not retry them, report the limitation.
Claude Code: .mcp.json →
{"mcpServers":{"notifyd":{"type":"http","url":"<instance>/mcp","headers":{"Authorization":"Bearer ${NOTIFYD_ADMIN_API_KEY}"}}}}
Procedure
digest(window24hby default;7dfor a weekly review). Read the findings first: each has a severity and the action to take. "All quiet" means stop here unless the user asked for details.- For a failure finding:
list_jobswithstatus: "failed"(addproject_id,channel,sinceto narrow), thenget_jobon the sample id from the finding. Readerror:HTTP 4xx/invalid recipient/unverified sender→ permanent, the caller must fix the address, the sender (update_projectwithfrom_email) or the template. Thenretry_job.suppression-list: …→ the address bounced, complained or unsubscribed. Do not release a bounce or complaint unless the user confirms the address is valid again. A marketing-scope suppression is a commercial unsubscribe: never override it for marketing.HTTP 5xx/transport error→ transient; the worker already retried (5 attempts over ~2 h 40) or failed over to the fallback provider. Retry only if the provider is back.
- For a queue finding ("oldest job waiting"): check
retries_waitingandpaused_lanesin the digest (one entry per channel). A paused channel means a 429 from the provider; it clears itself. A stuck queue with nothing paused means the worker is down: escalate to the operator, you cannot restart it. - For deliverability findings (bounce rate, complaints):
template_metricswithbucket: "1d"shows which template drives them. Suggest list hygiene; do not send more. - To prove a channel after a fix:
send_testto an address the user owns, thenget_jobuntilstatus: "sent"andprovider_message_idis set. - Close with
digestagain and report: what was wrong, what you changed, what remains (with the finding text).
Rules
- Recipients are masked in listings; never try to reconstruct them.
retry_jobandsend_testsend real messages. Say so before calling them when the user did not explicitly ask.- Never release a suppression created by a bounce or a complaint without an explicit instruction that names the address.
- Numbers you report must come from the digest or metrics of this call, not from memory.