Ray notifications MCP server
online · 100% uptimeio.github.gege-mn/ray-mcp·v0.1.0Send email, push, Slack, Discord, Telegram and webhook notifications and manage templates with Ray.
0 stars26 downloads/wk
Reviews
Write oneNobody has reviewed Ray notifications yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Ray notifications tools (21, 10 write)
write = sends, deletes, buys or postsarchive_templateFreeArchive a template (POST /templates/{id}/archive; write scope). Sends that reference it fail until it is restored with unarchive_template; its name stays reserved meanwhile. Confirm with the user first if it may be in production use.
create_templatewrite actionFreeCreate a template (POST /templates; write scope). `channelKind` is permanent and must match the channels you'll send through (list_channels `templateKind`). It is saved as an unpublished draft unless `publish: true`; sending by templateId needs a published version (publish_template). Names are unique per workspace including archived templates: a collision returns 409, so unarchive_template the old one instead. Returns `{ id, requiredParams }`. Designed (drag-and-drop) email templates can only be made in the dashboard.
create_webhookwrite actionFreeCreate an outbound webhook that Ray POSTs signed event payloads to (POST /tenant-webhooks; write scope; Pro plan or higher, otherwise 403). The URL must be public HTTPS. The response contains the signing `secret` exactly once: show it to the user to store (e.g. as an env var), since it can't be read again, only rotated with update_webhook. Read the `webhooks` docs page for the signature scheme.
delete_webhookwrite actionFreeDelete (archive) a webhook so it receives no more events (DELETE /tenant-webhooks/{id}; write scope). It cannot be restored through the API; confirm with the user first.
get_click_statswrite actionFreeEmail link click counts grouped by destination URL (GET /clicks) for a `sendId`, a `campaignId`, or both (at least one is required). Only links from email sends made with `trackClicks: true` are counted.
get_send_statuswrite actionFreeDelivery status of a send (GET /sends/{id}): `aggregate` counts per status over the whole send (pending, claimed, delivered, failed_retryable, failed_terminal, suppressed) plus one page of per-recipient delivery rows including provider errors. Right after sending, rows are usually `pending`; check again after a few seconds. Feed-only sends have no rows. For more rows, pass the returned `nextCursor` as `cursor`.
get_templateFreeGet one template with its published version and its current draft (GET /templates/{id}): content, logTitle/logDescription, `requiredParams` a send must supply, and paramOverrides. Read this before update_template_draft, which needs the full body.
get_usageFreeThe workspace's plan, subscription status and this calendar month's usage against the monthly quota (GET /billing/subscription). `used`/`remaining` are null on unmetered plans. On a hard-capped plan, sends beyond the quota fail with HTTP 402 quota_exceeded.
get_webhookFreeGet one outbound webhook (GET /tenant-webhooks/{id}) including its delivery health (consecutiveFailures, lastDeliveryAt, lastFailureAt, lastError).
list_channelsFreeList the delivery channels configured in this workspace (GET /channels). Call this FIRST before sending: each entry's `id` is the `channelConfigId` for send_notification and test_send_template, `kind` is the channel type (ses_email, smtp_email, fcm_push, slack_webhook, discord_webhook, telegram_bot, twilio_sms, sendsms_mn, generic_webhook), `templateKind` is the template channelKind it accepts, and `recipientSchema` is the exact JSON Schema of the `recipient` it expects. Channels and their provider credentials are set up in the Ray dashboard, not through this API; if the list is empty, ask the user to add one there.
list_feed_notificationsFreeRead one end user's in-app notification feed (GET /notifications): the entries created by sends with `feed` or `showInFeed`. This is what an in-app inbox would show, not delivery status (use get_send_status for that). Paginate by passing `nextCursor` back as `cursor`.
list_templatesFreeList message templates (GET /templates): id, name, folder, channelKind, and `publishedVersionId` (null = never published, so it cannot be sent by templateId yet). Archived templates are hidden unless `includeArchived` is true. Use get_template for content and required params.
list_webhooksFreeList the workspace's outbound event webhooks (GET /tenant-webhooks): url, subscribed events, enabled flag and delivery health (consecutiveFailures, lastError). Signing secrets are never returned.
publish_templatewrite actionFreePublish a template's current draft as its new live version (POST /templates/{id}/publish; write scope). Sends by templateId use it immediately. Fails if there is no draft or the template is archived.
read_docsFreeRead Ray's documentation as markdown. With no `slug` it returns the index (llms.txt) listing every page; then pass a page slug, i.e. the path after /docs/ without `.md`, such as `sending`, `templates`, `idempotency`, `errors`, `rate-limits`, `webhooks`, `status-and-feeds` or `channels/telegram`. Use it for anything the tool descriptions don't cover.
send_notificationwrite actionFreeSend a notification (POST /send; needs a `write`-scoped key). Returns `{ sendId }` with HTTP 202: delivery is asynchronous, so check the outcome with get_send_status. Use exactly one mode: 1. Single: `channelConfigId` + `recipient`. 2. Fan-out: `channelConfigId` + `targets` (1-1000 `{ recipient, externalUserId? }`), one channel, one sendId. 3. Multi-channel: `deliveries` (1-10, each with its own `channelConfigId`, `recipient` and `templateId` or `content`) for ONE person over several channels; add `feed` + `externalUserId` for a single in-app feed entry. 4. Feed-only: `feed` (with `title`) + `externalUserId` and no channel: an in-app notification only. In modes 1-2 give exactly one of `templateId` (a published template, plus `params`) or inline `content`; in mode 3 that choice is made per delivery. Get channel ids and each recipient shape from list_channels first. Pass `idempotencyKey` whenever a retry must not deliver twice.
test_send_templatewrite actionFreeSend a real test of a template's PUBLISHED version to one recipient (POST /templates/{id}/test-send; write scope). It goes through the provider for real, so use a recipient the user controls. Test sends don't count toward the monthly quota (a small daily allowance applies instead) and never appear in feeds. Returns `{ sendId }` for get_send_status.
unarchive_templateFreeRestore an archived template (POST /templates/{id}/unarchive; write scope). This is how to reclaim a name held by an archived template instead of creating a new one.
update_template_draftwrite actionFreeReplace a template's draft (PATCH /templates/{id}; write scope). This is a full replacement, not a partial patch: pass content, logTitle, logDescription and paramOverrides as they should end up (get_template first). `name`, `folder` and `channelKind` are required for validation but not changed (channelKind must equal the original). Live sends keep using the published version until you publish, either with `publish: true` here or publish_template. Fails on archived templates.
update_webhookwrite actionFreeChange a webhook (PATCH /tenant-webhooks/{id}; write scope). Only the fields you pass change; pass at least one. `rotateSecret: true` issues a new signing secret, returned once in the response, and the old secret stops verifying immediately, so the receiving service must be updated at the same time.
whoamiFreeIdentify the API key this connection uses (GET /me): `tenantId` (the workspace), `apiKeyId` and `scopes`. Write tools need the `write` scope; call this to check before attempting them.
Public scan report
scanner v0.1.10 · 2026-10-03 · same rubric, same numbers if you re-run it
- Code scan2 source files scanned25/25
- Live reliabilityremote reachable in 1958ms20/20
- Tool poisoning21 tool descriptions checked15/15
- Auth qualityAPI key sent as a header8/15
- Maintenancelast push 14 days ago15/15
- Maintainer identityregistry namespace matches repository owner7/10
How Ray notifications compares
Against every graded Email MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 90/100
- higher than 85% of 916 Email servers
- Tools
- 21
- the typical Email server has 7
- Tools that change things
- 48%
- typical: 25%. Fewer write tools means less an agent can break
- Uptime
- 100%
- of our recent checks; the typical remote Email server answers 100%
- Response time
- 717 ms
- faster than 17% of 609 Email servers
- Downloads a week
- 26
- more than 9% of 235 Email servers with a package
What its tools let an agent do: 10 read · 2 create · 5 change · 2 delete · 2 send or post
Install Ray notifications in Claude Code, Cursor or VS Code
claude mcp add --transport http ray-mcp https://ray-api.gege.mn/mcp
What the publisher says
From the Ray notifications repository's README, as published. We do not edit it. Read it on GitHub
Ray MCP server
MCP server for Ray, the notification delivery API. It lets Claude, Cursor, VS Code, Windsurf, Codex, Zed and any other MCP client send notifications and manage templates, delivery webhooks and usage in your Ray workspace.
Ray here is the multi-tenant notification API from gege.mn (email via Amazon SES or SMTP, Firebase push, Slack, Discord, Telegram, SMS via Twilio or sendsms.mn, generic webhooks and an in-app feed). It is not the Ray distributed computing framework.
Hosted or local?
Ray runs an MCP server for you. There are two ways to connect, with the same tools:
This package is a thin bridge: it connects to the hosted endpoint with your key and mirrors its tool list, descriptions and instructions, so new tools appear without upgrading the package. All validation, scopes, rate limits and quota are enforced by Ray's API.
1. Get an API key
- Sign in at ray.gege.mn and open API keys.
- Create a key. It starts with cklive and is shown only once.
- read scope: status, templates, usage, docs.
- write scope: also needed to send, create or change templates, and manage webhooks.
- Configure at least one channel in the dashboard under Channels. Channel credentials can't be created through the API or MCP.
The examples below use cklive... as a placeholder. Keep real keys out of version control.
2. Add Ray to your client
Claude Code
Hosted:
claude mcp add --transport http ray https://ray-api.gege.mn/mcp --header "Authorization: Bearer $RAY_API_KEY"Local:
claude mcp add ray --env RAY_API_KEY=ck_live_... -- npx -y @gege-mn/ray-mcpAdd --scope user to make it available in every project. Check the connection with claude mcp get ray.
Claude Desktop
Edit claudedesktopconfig.json (Settings → Developer → Edit Config; macOS ~/Library/Application Support/Claude/claudedesktopconfig.json, Windows %APPDATA%\Claude\claudedesktopconfig.json), then fully restart Claude Desktop:
{
"mcpServers": {
"ray": {
"command": "npx",
"args": ["-y", "@gege-mn/ray-mcp"],
"env": { "RAY_API_KEY": "ck_live_..." }
}
}
}Cursor
.cursor/mcp.json in a project, or ~/.cursor/mcp.json for all projects.
Hosted:
{
"mcpServers": {
"ray": {
"url": "https://ray-api.gege.mn/mcp",
"headers": { "Authorization": "Bearer ck_live_..." }
}
}
}Local:
{
"mcpServers": {
"ray": {
"command": "npx",
"args": ["-y", "@gege-mn/ray-mcp"],
"env": { "RAY_API_KEY": "ck_live_..." }
}
}
}Cursor can read the key from your environment instead: "Authorization": "Bearer ${env:RAYAPIKEY}".
VS Code (GitHub Copilot)
VS Code's mcp.json (.vscode/mcp.json in a workspace, or MCP: Open User Configuration) uses a top-level servers key and can prompt for the key so it isn't stored in the file:
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Ray notifications: common questions
- Is Ray notifications MCP server safe?
- Yes, by our scan: it is graded A (90/100). Read the Ray notifications safety report
- How do I install Ray notifications?
- It runs remotely at ray-api.gege.mn. Add it to Claude Code, Cursor, VS Code or Claude Desktop with the snippets above, or call it through the mcp.market gateway without installing anything.
- Does Ray notifications need an API key?
- Yes. The registry entry asks for
RAY_API_KEY,Authorization. - Is Ray notifications maintained?
- The last commit was 46 days ago (2026-09-19). The latest release is v0.1.0.
- Is Ray notifications up?
- 100% of our last 28 checks got an answer. We check remote servers about four times a day.
- What can I use instead of Ray notifications?
- Servers from other publishers that do the same job: Notifykit MCP server, Pushizo MCP server and Qmailing MCP server. Compare all Ray notifications alternatives.
- How does Ray notifications compare with other Email MCP servers?
- safety score 90/100 (higher than 85% of 916 Email servers); tools 21 (the typical Email server has 7); tools that change things 48% (typical: 25%. Fewer write tools means less an agent can break). Full comparison.
Alternatives to Ray notifications
Same job from other publishers: the closest match first, then the best rated.
- NotifykitUnified notifications for Next.js. Multi-provider SMS, email, and push.not reviewedGrowingA
- PushizoPush, email, SMS, in-app and journeys. 54 tools: reads and drafts; only test sends.not reviewedGrowingA
QmailingAI agents read & send email, manage mailboxes, domains and webhooks via the QMailing API.not reviewedGrowingA- MailkiteSend email, manage domains, DNS, webhooks, templates, and inbound routing on MailKitenot reviewedGrowingA
- SendGrid TransactionalSendGrid transactional email: preflight send, templates, and delivery diagnostics.not reviewedGrowingB