io.github.gege-mn/ray-mcp
up checked
Unclaimed · Unverified
Agent searches it appeared in, last 30 days: 0. Run this server? Claim the listing: verified label, uptime alerts and analytics.
Publisher-provided title
Ray notifications
Publisher-provided description
Send email, push, Slack, Discord, Telegram and webhook notifications and manage templates with Ray.
Summary by lookupd
Sends notifications over email, push, Slack, Discord, Telegram and webhooks, and manages message templates and delivery tracking.
Install
Claude Code, remote (streamable-http)
claude mcp add --transport http ray https://ray-api.gege.mn/mcp
Claude Code, npm package (stdio)
claude mcp add ray -- npx -y @gege-mn/ray-mcp
Codex, remote (streamable-http)
codex mcp add ray --url https://ray-api.gege.mn/mcp
Codex, npm package (stdio)
codex mcp add ray -- npx -y @gege-mn/ray-mcp
Cursor, remote (streamable-http) → .cursor/mcp.json
{
"mcpServers": {
"ray": {
"url": "https://ray-api.gege.mn/mcp"
}
}
}Cursor, npm package (stdio) → .cursor/mcp.json
{
"mcpServers": {
"ray": {
"command": "npx",
"args": [
"-y",
"@gege-mn/ray-mcp"
]
}
}
}Other clients: docs. Or tell your agent: Set up lookupd for me: read https://lookupd.com/agent.md and follow it.
Tools (21 tools)
Publisher-provided text
whoamiIdentify the API key this connection uses (GET /me): `tenantId` (the workspace), `apiKeyId` and `scopes`. Write tools need the `write` scope; call this to checkget_usageThe workspace's plan, subscription status and this calendar month's usage against the monthly quota (GET /billing/subscription). `used`/`remaining` are null onlist_channelsList the delivery channels configured in this workspace (GET /channels). Call this FIRST before sending: each entry's `id` is the `channelConfigId` for send_notsend_notificationSend a notification (POST /send; needs a `write`-scoped key). Returns `{ sendId }` with HTTP 202: delivery is asynchronous, so check the outcome with get_send_sget_send_statusDelivery status of a send (GET /sends/{id}): `aggregate` counts per status over the whole send (pending, claimed, delivered, failed_retryable, failed_terminal,list_templatesList message templates (GET /templates): id, name, folder, channelKind, and `publishedVersionId` (null = never published, so it cannot be sent by templateId yetget_templateGet one template with its published version and its current draft (GET /templates/{id}): content, logTitle/logDescription, `requiredParams` a send must supply,create_templateCreate a template (POST /templates; write scope). `channelKind` is permanent and must match the channels you'll send through (list_channels `templateKind`). Itupdate_template_draftReplace a template's draft (PATCH /templates/{id}; write scope). This is a full replacement, not a partial patch: pass content, logTitle, logDescription and parpublish_templatePublish 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 iarchive_templateArchive a template (POST /templates/{id}/archive; write scope). Sends that reference it fail until it is restored with unarchive_template; its name stays reservunarchive_templateRestore 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 newtest_send_templateSend 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 uselist_feed_notificationsRead 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 wouldget_click_statsEmail 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 sendslist_webhooksList the workspace's outbound event webhooks (GET /tenant-webhooks): url, subscribed events, enabled flag and delivery health (consecutiveFailures, lastError).get_webhookGet one outbound webhook (GET /tenant-webhooks/{id}) including its delivery health (consecutiveFailures, lastDeliveryAt, lastFailureAt, lastError).create_webhookCreate 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 publupdate_webhookChange a webhook (PATCH /tenant-webhooks/{id}; write scope). Only the fields you pass change; pass at least one. `rotateSecret: true` issues a new signing secredelete_webhookDelete (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 usread_docsRead 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/ witho
Details
- Version: 0.1.0
- Transports: streamable-http, stdio
- Uptime (7 days): 100%
- Median latency: 1452 ms
- First indexed:
- Last seen in registry:
- Repository: https://github.com/gege-mn/ray-mcp
- Website: https://ray.gege.mn/docs
Badge for your README
Shows this live status and links here; updates hourly.
[](https://lookupd.com/servers/io.github.gege-mn/ray-mcp)
- 62033 servers
- Last crawl: 2026-11-11T15:38:39.561Z
- API base:
https://api.lookupd.com - MCP URL:
https://api.lookupd.com/mcp