{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_gnacm3hfdw73","handle":"ray-notifications","url":"https://wellknown.network/agents/ray-notifications","links":{"self":"https://wellknown.network/agents/ray-notifications/record.json","html":"https://wellknown.network/agents/ray-notifications","markdown":"https://wellknown.network/agents/ray-notifications/record.md","api":"https://wellknown.network/api/v1/agents/ray-notifications","status":"https://wellknown.network/api/v1/agents/ray-notifications/status","claim":"https://wellknown.network/agents/ray-notifications/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/ray-notifications/claim.json","badge":"https://wellknown.network/agents/ray-notifications/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/ray-notifications/history","tools":"https://wellknown.network/api/v1/agents/ray-notifications/tools"},"ard":{"identifier":"urn:air:ray-api.gege.mn:server:ray-notifications","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"Ray notifications","summary":"Send email, push, Slack, Discord, Telegram and webhook notifications and manage templates with Ray.","description":"Send email, push, Slack, Discord, Telegram and webhook notifications and manage templates with Ray.","publisher":{"name":"gege-mn","url":null},"homepage":"https://ray.gege.mn/docs","repository":"https://github.com/gege-mn/ray-mcp","version":"0.1.0","license":"MIT","protocols":["mcp"],"tags":["mcp","model-context-protocol","mcp-server","ray","notifications","email","push-notifications","slack","discord","telegram","webhooks","ai-agents"],"pricing":null,"endpoints":[{"url":"https://ray-api.gege.mn/mcp","type":"mcp_streamable_http","auth":null,"probeable":true},{"url":"npm:@gege-mn/ray-mcp","type":"package_npm","auth":null,"probeable":false}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-09-14T17:44:01.043645Z","npmKeywords":["mcp","model-context-protocol","mcp-server","ray","notifications","email","push-notifications","slack","discord","telegram","webhooks","ai-agents"],"publishedAt":"2026-09-14T17:44:01.043645Z","registryName":"io.github.gege-mn/ray-mcp"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","license":"npm","repoUrl":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"dev.docs-lookup","name":"Documentation Lookup","confidence":1,"provenance":"derived"},{"slug":"productivity.email","name":"Email","confidence":1,"provenance":"declared"},{"slug":"communication.chat","name":"Team Chat","confidence":1,"provenance":"declared"},{"slug":"communication.sms-voice","name":"SMS & Voice","confidence":1,"provenance":"declared"},{"slug":"communication.notifications","name":"Notifications","confidence":1,"provenance":"declared"},{"slug":"ai.prompting","name":"Prompt Management","confidence":0.938,"provenance":"derived"},{"slug":"code.documentation","name":"Code Documentation","confidence":0.583,"provenance":"derived"},{"slug":"dev.terminal","name":"Terminal & Shell","confidence":0.525,"provenance":"derived"}],"categories":["ai","code","communication","dev","productivity"],"language":"en"},"observed":{"status":"live","statusReason":"Responded 59m ago.","lastOkAt":"2026-10-10T01:23:35.360Z","lastProbedAt":"2026-10-10T01:23:35.360Z","statusComputedAt":"2026-10-10T01:25:51.800Z","reliability30d":{"probes":405,"successRate":0.9926,"p50Ms":764,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":405,"ok":402,"authBoundaryOk":0,"serviceOk":402,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-10-10T01:23:35.360Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":758,"error":null,"detail":{"tools":[{"name":"whoami","description":"Identify the API key this connection uses (GET /me): `tenantId` (the workspace), `apiKeyId` and `scopes`. Write tools need the `write` scope; call this to check"},{"name":"get_usage","description":"The workspace's plan, subscription status and this calendar month's usage against the monthly quota (GET /billing/subscription). `used`/`remaining` are null on "},{"name":"list_channels","description":"List the delivery channels configured in this workspace (GET /channels). Call this FIRST before sending: each entry's `id` is the `channelConfigId` for send_not"},{"name":"send_notification","description":"Send a notification (POST /send; needs a `write`-scoped key). Returns `{ sendId }` with HTTP 202: delivery is asynchronous, so check the outcome with get_send_s"},{"name":"get_send_status","description":"Delivery status of a send (GET /sends/{id}): `aggregate` counts per status over the whole send (pending, claimed, delivered, failed_retryable, failed_terminal, "},{"name":"list_templates","description":"List message templates (GET /templates): id, name, folder, channelKind, and `publishedVersionId` (null = never published, so it cannot be sent by templateId yet"},{"name":"get_template","description":"Get one template with its published version and its current draft (GET /templates/{id}): content, logTitle/logDescription, `requiredParams` a send must supply, "},{"name":"create_template","description":"Create a template (POST /templates; write scope). `channelKind` is permanent and must match the channels you'll send through (list_channels `templateKind`). It "},{"name":"update_template_draft","description":"Replace a template's draft (PATCH /templates/{id}; write scope). This is a full replacement, not a partial patch: pass content, logTitle, logDescription and par"},{"name":"publish_template","description":"Publish 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 i"},{"name":"archive_template","description":"Archive a template (POST /templates/{id}/archive; write scope). Sends that reference it fail until it is restored with unarchive_template; its name stays reserv"},{"name":"unarchive_template","description":"Restore 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"},{"name":"test_send_template","description":"Send 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"},{"name":"list_feed_notifications","description":"Read 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 "},{"name":"get_click_stats","description":"Email 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"},{"name":"list_webhooks","description":"List the workspace's outbound event webhooks (GET /tenant-webhooks): url, subscribed events, enabled flag and delivery health (consecutiveFailures, lastError). "},{"name":"get_webhook","description":"Get one outbound webhook (GET /tenant-webhooks/{id}) including its delivery health (consecutiveFailures, lastDeliveryAt, lastFailureAt, lastError)."},{"name":"create_webhook","description":"Create 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 publ"},{"name":"update_webhook","description":"Change a webhook (PATCH /tenant-webhooks/{id}; write scope). Only the fields you pass change; pass at least one. `rotateSecret: true` issues a new signing secre"},{"name":"delete_webhook","description":"Delete (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 us"},{"name":"read_docs","description":"Read 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"}],"toolCount":21,"toolsHash":"e73a6bed7ef668621ee9ec8d51e50e7d5f2a5fe80e15426059d95c687c1330aa","serverName":"ray","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T00:27:06.108Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":780,"error":null,"detail":{"tools":[{"name":"whoami","description":"Identify the API key this connection uses (GET /me): `tenantId` (the workspace), `apiKeyId` and `scopes`. Write tools need the `write` scope; call this to check"},{"name":"get_usage","description":"The workspace's plan, subscription status and this calendar month's usage against the monthly quota (GET /billing/subscription). `used`/`remaining` are null on "},{"name":"list_channels","description":"List the delivery channels configured in this workspace (GET /channels). Call this FIRST before sending: each entry's `id` is the `channelConfigId` for send_not"},{"name":"send_notification","description":"Send a notification (POST /send; needs a `write`-scoped key). Returns `{ sendId }` with HTTP 202: delivery is asynchronous, so check the outcome with get_send_s"},{"name":"get_send_status","description":"Delivery status of a send (GET /sends/{id}): `aggregate` counts per status over the whole send (pending, claimed, delivered, failed_retryable, failed_terminal, "},{"name":"list_templates","description":"List message templates (GET /templates): id, name, folder, channelKind, and `publishedVersionId` (null = never published, so it cannot be sent by templateId yet"},{"name":"get_template","description":"Get one template with its published version and its current draft (GET /templates/{id}): content, logTitle/logDescription, `requiredParams` a send must supply, "},{"name":"create_template","description":"Create a template (POST /templates; write scope). `channelKind` is permanent and must match the channels you'll send through (list_channels `templateKind`). It "},{"name":"update_template_draft","description":"Replace a template's draft (PATCH /templates/{id}; write scope). This is a full replacement, not a partial patch: pass content, logTitle, logDescription and par"},{"name":"publish_template","description":"Publish 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 i"},{"name":"archive_template","description":"Archive a template (POST /templates/{id}/archive; write scope). Sends that reference it fail until it is restored with unarchive_template; its name stays reserv"},{"name":"unarchive_template","description":"Restore 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"},{"name":"test_send_template","description":"Send 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"},{"name":"list_feed_notifications","description":"Read 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 "},{"name":"get_click_stats","description":"Email 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"},{"name":"list_webhooks","description":"List the workspace's outbound event webhooks (GET /tenant-webhooks): url, subscribed events, enabled flag and delivery health (consecutiveFailures, lastError). "},{"name":"get_webhook","description":"Get one outbound webhook (GET /tenant-webhooks/{id}) including its delivery health (consecutiveFailures, lastDeliveryAt, lastFailureAt, lastError)."},{"name":"create_webhook","description":"Create 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 publ"},{"name":"update_webhook","description":"Change a webhook (PATCH /tenant-webhooks/{id}; write scope). Only the fields you pass change; pass at least one. `rotateSecret: true` issues a new signing secre"},{"name":"delete_webhook","description":"Delete (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 us"},{"name":"read_docs","description":"Read 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"}],"toolCount":21,"toolsHash":"e73a6bed7ef668621ee9ec8d51e50e7d5f2a5fe80e15426059d95c687c1330aa","serverName":"ray","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T23:28:35.016Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":702,"error":null,"detail":{"tools":[{"name":"whoami","description":"Identify the API key this connection uses (GET /me): `tenantId` (the workspace), `apiKeyId` and `scopes`. Write tools need the `write` scope; call this to check"},{"name":"get_usage","description":"The workspace's plan, subscription status and this calendar month's usage against the monthly quota (GET /billing/subscription). `used`/`remaining` are null on "},{"name":"list_channels","description":"List the delivery channels configured in this workspace (GET /channels). Call this FIRST before sending: each entry's `id` is the `channelConfigId` for send_not"},{"name":"send_notification","description":"Send a notification (POST /send; needs a `write`-scoped key). Returns `{ sendId }` with HTTP 202: delivery is asynchronous, so check the outcome with get_send_s"},{"name":"get_send_status","description":"Delivery status of a send (GET /sends/{id}): `aggregate` counts per status over the whole send (pending, claimed, delivered, failed_retryable, failed_terminal, "},{"name":"list_templates","description":"List message templates (GET /templates): id, name, folder, channelKind, and `publishedVersionId` (null = never published, so it cannot be sent by templateId yet"},{"name":"get_template","description":"Get one template with its published version and its current draft (GET /templates/{id}): content, logTitle/logDescription, `requiredParams` a send must supply, "},{"name":"create_template","description":"Create a template (POST /templates; write scope). `channelKind` is permanent and must match the channels you'll send through (list_channels `templateKind`). It "},{"name":"update_template_draft","description":"Replace a template's draft (PATCH /templates/{id}; write scope). This is a full replacement, not a partial patch: pass content, logTitle, logDescription and par"},{"name":"publish_template","description":"Publish 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 i"},{"name":"archive_template","description":"Archive a template (POST /templates/{id}/archive; write scope). Sends that reference it fail until it is restored with unarchive_template; its name stays reserv"},{"name":"unarchive_template","description":"Restore 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"},{"name":"test_send_template","description":"Send 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"},{"name":"list_feed_notifications","description":"Read 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 "},{"name":"get_click_stats","description":"Email 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"},{"name":"list_webhooks","description":"List the workspace's outbound event webhooks (GET /tenant-webhooks): url, subscribed events, enabled flag and delivery health (consecutiveFailures, lastError). "},{"name":"get_webhook","description":"Get one outbound webhook (GET /tenant-webhooks/{id}) including its delivery health (consecutiveFailures, lastDeliveryAt, lastFailureAt, lastError)."},{"name":"create_webhook","description":"Create 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 publ"},{"name":"update_webhook","description":"Change a webhook (PATCH /tenant-webhooks/{id}; write scope). Only the fields you pass change; pass at least one. `rotateSecret: true` issues a new signing secre"},{"name":"delete_webhook","description":"Delete (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 us"},{"name":"read_docs","description":"Read 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"}],"toolCount":21,"toolsHash":"e73a6bed7ef668621ee9ec8d51e50e7d5f2a5fe80e15426059d95c687c1330aa","serverName":"ray","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T22:26:16.497Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":770,"error":null,"detail":{"tools":[{"name":"whoami","description":"Identify the API key this connection uses (GET /me): `tenantId` (the workspace), `apiKeyId` and `scopes`. Write tools need the `write` scope; call this to check"},{"name":"get_usage","description":"The workspace's plan, subscription status and this calendar month's usage against the monthly quota (GET /billing/subscription). `used`/`remaining` are null on "},{"name":"list_channels","description":"List the delivery channels configured in this workspace (GET /channels). Call this FIRST before sending: each entry's `id` is the `channelConfigId` for send_not"},{"name":"send_notification","description":"Send a notification (POST /send; needs a `write`-scoped key). Returns `{ sendId }` with HTTP 202: delivery is asynchronous, so check the outcome with get_send_s"},{"name":"get_send_status","description":"Delivery status of a send (GET /sends/{id}): `aggregate` counts per status over the whole send (pending, claimed, delivered, failed_retryable, failed_terminal, "},{"name":"list_templates","description":"List message templates (GET /templates): id, name, folder, channelKind, and `publishedVersionId` (null = never published, so it cannot be sent by templateId yet"},{"name":"get_template","description":"Get one template with its published version and its current draft (GET /templates/{id}): content, logTitle/logDescription, `requiredParams` a send must supply, "},{"name":"create_template","description":"Create a template (POST /templates; write scope). `channelKind` is permanent and must match the channels you'll send through (list_channels `templateKind`). It "},{"name":"update_template_draft","description":"Replace a template's draft (PATCH /templates/{id}; write scope). This is a full replacement, not a partial patch: pass content, logTitle, logDescription and par"},{"name":"publish_template","description":"Publish 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 i"},{"name":"archive_template","description":"Archive a template (POST /templates/{id}/archive; write scope). Sends that reference it fail until it is restored with unarchive_template; its name stays reserv"},{"name":"unarchive_template","description":"Restore 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"},{"name":"test_send_template","description":"Send 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"},{"name":"list_feed_notifications","description":"Read 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 "},{"name":"get_click_stats","description":"Email 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"},{"name":"list_webhooks","description":"List the workspace's outbound event webhooks (GET /tenant-webhooks): url, subscribed events, enabled flag and delivery health (consecutiveFailures, lastError). "},{"name":"get_webhook","description":"Get one outbound webhook (GET /tenant-webhooks/{id}) including its delivery health (consecutiveFailures, lastDeliveryAt, lastFailureAt, lastError)."},{"name":"create_webhook","description":"Create 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 publ"},{"name":"update_webhook","description":"Change a webhook (PATCH /tenant-webhooks/{id}; write scope). Only the fields you pass change; pass at least one. `rotateSecret: true` issues a new signing secre"},{"name":"delete_webhook","description":"Delete (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 us"},{"name":"read_docs","description":"Read 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"}],"toolCount":21,"toolsHash":"e73a6bed7ef668621ee9ec8d51e50e7d5f2a5fe80e15426059d95c687c1330aa","serverName":"ray","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T21:25:17.823Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":780,"error":null,"detail":{"tools":[{"name":"whoami","description":"Identify the API key this connection uses (GET /me): `tenantId` (the workspace), `apiKeyId` and `scopes`. Write tools need the `write` scope; call this to check"},{"name":"get_usage","description":"The workspace's plan, subscription status and this calendar month's usage against the monthly quota (GET /billing/subscription). `used`/`remaining` are null on "},{"name":"list_channels","description":"List the delivery channels configured in this workspace (GET /channels). Call this FIRST before sending: each entry's `id` is the `channelConfigId` for send_not"},{"name":"send_notification","description":"Send a notification (POST /send; needs a `write`-scoped key). Returns `{ sendId }` with HTTP 202: delivery is asynchronous, so check the outcome with get_send_s"},{"name":"get_send_status","description":"Delivery status of a send (GET /sends/{id}): `aggregate` counts per status over the whole send (pending, claimed, delivered, failed_retryable, failed_terminal, "},{"name":"list_templates","description":"List message templates (GET /templates): id, name, folder, channelKind, and `publishedVersionId` (null = never published, so it cannot be sent by templateId yet"},{"name":"get_template","description":"Get one template with its published version and its current draft (GET /templates/{id}): content, logTitle/logDescription, `requiredParams` a send must supply, "},{"name":"create_template","description":"Create a template (POST /templates; write scope). `channelKind` is permanent and must match the channels you'll send through (list_channels `templateKind`). It "},{"name":"update_template_draft","description":"Replace a template's draft (PATCH /templates/{id}; write scope). This is a full replacement, not a partial patch: pass content, logTitle, logDescription and par"},{"name":"publish_template","description":"Publish 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 i"},{"name":"archive_template","description":"Archive a template (POST /templates/{id}/archive; write scope). Sends that reference it fail until it is restored with unarchive_template; its name stays reserv"},{"name":"unarchive_template","description":"Restore 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"},{"name":"test_send_template","description":"Send 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"},{"name":"list_feed_notifications","description":"Read 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 "},{"name":"get_click_stats","description":"Email 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"},{"name":"list_webhooks","description":"List the workspace's outbound event webhooks (GET /tenant-webhooks): url, subscribed events, enabled flag and delivery health (consecutiveFailures, lastError). "},{"name":"get_webhook","description":"Get one outbound webhook (GET /tenant-webhooks/{id}) including its delivery health (consecutiveFailures, lastDeliveryAt, lastFailureAt, lastError)."},{"name":"create_webhook","description":"Create 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 publ"},{"name":"update_webhook","description":"Change a webhook (PATCH /tenant-webhooks/{id}; write scope). Only the fields you pass change; pass at least one. `rotateSecret: true` issues a new signing secre"},{"name":"delete_webhook","description":"Delete (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 us"},{"name":"read_docs","description":"Read 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"}],"toolCount":21,"toolsHash":"e73a6bed7ef668621ee9ec8d51e50e7d5f2a5fe80e15426059d95c687c1330aa","serverName":"ray","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T20:28:54.677Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":754,"error":null,"detail":{"tools":[{"name":"whoami","description":"Identify the API key this connection uses (GET /me): `tenantId` (the workspace), `apiKeyId` and `scopes`. Write tools need the `write` scope; call this to check"},{"name":"get_usage","description":"The workspace's plan, subscription status and this calendar month's usage against the monthly quota (GET /billing/subscription). `used`/`remaining` are null on "},{"name":"list_channels","description":"List the delivery channels configured in this workspace (GET /channels). Call this FIRST before sending: each entry's `id` is the `channelConfigId` for send_not"},{"name":"send_notification","description":"Send a notification (POST /send; needs a `write`-scoped key). Returns `{ sendId }` with HTTP 202: delivery is asynchronous, so check the outcome with get_send_s"},{"name":"get_send_status","description":"Delivery status of a send (GET /sends/{id}): `aggregate` counts per status over the whole send (pending, claimed, delivered, failed_retryable, failed_terminal, "},{"name":"list_templates","description":"List message templates (GET /templates): id, name, folder, channelKind, and `publishedVersionId` (null = never published, so it cannot be sent by templateId yet"},{"name":"get_template","description":"Get one template with its published version and its current draft (GET /templates/{id}): content, logTitle/logDescription, `requiredParams` a send must supply, "},{"name":"create_template","description":"Create a template (POST /templates; write scope). `channelKind` is permanent and must match the channels you'll send through (list_channels `templateKind`). It "},{"name":"update_template_draft","description":"Replace a template's draft (PATCH /templates/{id}; write scope). This is a full replacement, not a partial patch: pass content, logTitle, logDescription and par"},{"name":"publish_template","description":"Publish 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 i"},{"name":"archive_template","description":"Archive a template (POST /templates/{id}/archive; write scope). Sends that reference it fail until it is restored with unarchive_template; its name stays reserv"},{"name":"unarchive_template","description":"Restore 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"},{"name":"test_send_template","description":"Send 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"},{"name":"list_feed_notifications","description":"Read 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 "},{"name":"get_click_stats","description":"Email 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"},{"name":"list_webhooks","description":"List the workspace's outbound event webhooks (GET /tenant-webhooks): url, subscribed events, enabled flag and delivery health (consecutiveFailures, lastError). "},{"name":"get_webhook","description":"Get one outbound webhook (GET /tenant-webhooks/{id}) including its delivery health (consecutiveFailures, lastDeliveryAt, lastFailureAt, lastError)."},{"name":"create_webhook","description":"Create 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 publ"},{"name":"update_webhook","description":"Change a webhook (PATCH /tenant-webhooks/{id}; write scope). Only the fields you pass change; pass at least one. `rotateSecret: true` issues a new signing secre"},{"name":"delete_webhook","description":"Delete (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 us"},{"name":"read_docs","description":"Read 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"}],"toolCount":21,"toolsHash":"e73a6bed7ef668621ee9ec8d51e50e7d5f2a5fe80e15426059d95c687c1330aa","serverName":"ray","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T19:25:28.342Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":758,"error":null,"detail":{"tools":[{"name":"whoami","description":"Identify the API key this connection uses (GET /me): `tenantId` (the workspace), `apiKeyId` and `scopes`. Write tools need the `write` scope; call this to check"},{"name":"get_usage","description":"The workspace's plan, subscription status and this calendar month's usage against the monthly quota (GET /billing/subscription). `used`/`remaining` are null on "},{"name":"list_channels","description":"List the delivery channels configured in this workspace (GET /channels). Call this FIRST before sending: each entry's `id` is the `channelConfigId` for send_not"},{"name":"send_notification","description":"Send a notification (POST /send; needs a `write`-scoped key). Returns `{ sendId }` with HTTP 202: delivery is asynchronous, so check the outcome with get_send_s"},{"name":"get_send_status","description":"Delivery status of a send (GET /sends/{id}): `aggregate` counts per status over the whole send (pending, claimed, delivered, failed_retryable, failed_terminal, "},{"name":"list_templates","description":"List message templates (GET /templates): id, name, folder, channelKind, and `publishedVersionId` (null = never published, so it cannot be sent by templateId yet"},{"name":"get_template","description":"Get one template with its published version and its current draft (GET /templates/{id}): content, logTitle/logDescription, `requiredParams` a send must supply, "},{"name":"create_template","description":"Create a template (POST /templates; write scope). `channelKind` is permanent and must match the channels you'll send through (list_channels `templateKind`). It "},{"name":"update_template_draft","description":"Replace a template's draft (PATCH /templates/{id}; write scope). This is a full replacement, not a partial patch: pass content, logTitle, logDescription and par"},{"name":"publish_template","description":"Publish 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 i"},{"name":"archive_template","description":"Archive a template (POST /templates/{id}/archive; write scope). Sends that reference it fail until it is restored with unarchive_template; its name stays reserv"},{"name":"unarchive_template","description":"Restore 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"},{"name":"test_send_template","description":"Send 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"},{"name":"list_feed_notifications","description":"Read 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 "},{"name":"get_click_stats","description":"Email 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"},{"name":"list_webhooks","description":"List the workspace's outbound event webhooks (GET /tenant-webhooks): url, subscribed events, enabled flag and delivery health (consecutiveFailures, lastError). "},{"name":"get_webhook","description":"Get one outbound webhook (GET /tenant-webhooks/{id}) including its delivery health (consecutiveFailures, lastDeliveryAt, lastFailureAt, lastError)."},{"name":"create_webhook","description":"Create 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 publ"},{"name":"update_webhook","description":"Change a webhook (PATCH /tenant-webhooks/{id}; write scope). Only the fields you pass change; pass at least one. `rotateSecret: true` issues a new signing secre"},{"name":"delete_webhook","description":"Delete (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 us"},{"name":"read_docs","description":"Read 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"}],"toolCount":21,"toolsHash":"e73a6bed7ef668621ee9ec8d51e50e7d5f2a5fe80e15426059d95c687c1330aa","serverName":"ray","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T18:24:47.831Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":751,"error":null,"detail":{"tools":[{"name":"whoami","description":"Identify the API key this connection uses (GET /me): `tenantId` (the workspace), `apiKeyId` and `scopes`. Write tools need the `write` scope; call this to check"},{"name":"get_usage","description":"The workspace's plan, subscription status and this calendar month's usage against the monthly quota (GET /billing/subscription). `used`/`remaining` are null on "},{"name":"list_channels","description":"List the delivery channels configured in this workspace (GET /channels). Call this FIRST before sending: each entry's `id` is the `channelConfigId` for send_not"},{"name":"send_notification","description":"Send a notification (POST /send; needs a `write`-scoped key). Returns `{ sendId }` with HTTP 202: delivery is asynchronous, so check the outcome with get_send_s"},{"name":"get_send_status","description":"Delivery status of a send (GET /sends/{id}): `aggregate` counts per status over the whole send (pending, claimed, delivered, failed_retryable, failed_terminal, "},{"name":"list_templates","description":"List message templates (GET /templates): id, name, folder, channelKind, and `publishedVersionId` (null = never published, so it cannot be sent by templateId yet"},{"name":"get_template","description":"Get one template with its published version and its current draft (GET /templates/{id}): content, logTitle/logDescription, `requiredParams` a send must supply, "},{"name":"create_template","description":"Create a template (POST /templates; write scope). `channelKind` is permanent and must match the channels you'll send through (list_channels `templateKind`). It "},{"name":"update_template_draft","description":"Replace a template's draft (PATCH /templates/{id}; write scope). This is a full replacement, not a partial patch: pass content, logTitle, logDescription and par"},{"name":"publish_template","description":"Publish 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 i"},{"name":"archive_template","description":"Archive a template (POST /templates/{id}/archive; write scope). Sends that reference it fail until it is restored with unarchive_template; its name stays reserv"},{"name":"unarchive_template","description":"Restore 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"},{"name":"test_send_template","description":"Send 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"},{"name":"list_feed_notifications","description":"Read 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 "},{"name":"get_click_stats","description":"Email 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"},{"name":"list_webhooks","description":"List the workspace's outbound event webhooks (GET /tenant-webhooks): url, subscribed events, enabled flag and delivery health (consecutiveFailures, lastError). "},{"name":"get_webhook","description":"Get one outbound webhook (GET /tenant-webhooks/{id}) including its delivery health (consecutiveFailures, lastDeliveryAt, lastFailureAt, lastError)."},{"name":"create_webhook","description":"Create 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 publ"},{"name":"update_webhook","description":"Change a webhook (PATCH /tenant-webhooks/{id}; write scope). Only the fields you pass change; pass at least one. `rotateSecret: true` issues a new signing secre"},{"name":"delete_webhook","description":"Delete (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 us"},{"name":"read_docs","description":"Read 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"}],"toolCount":21,"toolsHash":"e73a6bed7ef668621ee9ec8d51e50e7d5f2a5fe80e15426059d95c687c1330aa","serverName":"ray","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T17:26:51.357Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":742,"error":null,"detail":{"tools":[{"name":"whoami","description":"Identify the API key this connection uses (GET /me): `tenantId` (the workspace), `apiKeyId` and `scopes`. Write tools need the `write` scope; call this to check"},{"name":"get_usage","description":"The workspace's plan, subscription status and this calendar month's usage against the monthly quota (GET /billing/subscription). `used`/`remaining` are null on "},{"name":"list_channels","description":"List the delivery channels configured in this workspace (GET /channels). Call this FIRST before sending: each entry's `id` is the `channelConfigId` for send_not"},{"name":"send_notification","description":"Send a notification (POST /send; needs a `write`-scoped key). Returns `{ sendId }` with HTTP 202: delivery is asynchronous, so check the outcome with get_send_s"},{"name":"get_send_status","description":"Delivery status of a send (GET /sends/{id}): `aggregate` counts per status over the whole send (pending, claimed, delivered, failed_retryable, failed_terminal, "},{"name":"list_templates","description":"List message templates (GET /templates): id, name, folder, channelKind, and `publishedVersionId` (null = never published, so it cannot be sent by templateId yet"},{"name":"get_template","description":"Get one template with its published version and its current draft (GET /templates/{id}): content, logTitle/logDescription, `requiredParams` a send must supply, "},{"name":"create_template","description":"Create a template (POST /templates; write scope). `channelKind` is permanent and must match the channels you'll send through (list_channels `templateKind`). It "},{"name":"update_template_draft","description":"Replace a template's draft (PATCH /templates/{id}; write scope). This is a full replacement, not a partial patch: pass content, logTitle, logDescription and par"},{"name":"publish_template","description":"Publish 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 i"},{"name":"archive_template","description":"Archive a template (POST /templates/{id}/archive; write scope). Sends that reference it fail until it is restored with unarchive_template; its name stays reserv"},{"name":"unarchive_template","description":"Restore 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"},{"name":"test_send_template","description":"Send 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"},{"name":"list_feed_notifications","description":"Read 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 "},{"name":"get_click_stats","description":"Email 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"},{"name":"list_webhooks","description":"List the workspace's outbound event webhooks (GET /tenant-webhooks): url, subscribed events, enabled flag and delivery health (consecutiveFailures, lastError). "},{"name":"get_webhook","description":"Get one outbound webhook (GET /tenant-webhooks/{id}) including its delivery health (consecutiveFailures, lastDeliveryAt, lastFailureAt, lastError)."},{"name":"create_webhook","description":"Create 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 publ"},{"name":"update_webhook","description":"Change a webhook (PATCH /tenant-webhooks/{id}; write scope). Only the fields you pass change; pass at least one. `rotateSecret: true` issues a new signing secre"},{"name":"delete_webhook","description":"Delete (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 us"},{"name":"read_docs","description":"Read 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"}],"toolCount":21,"toolsHash":"e73a6bed7ef668621ee9ec8d51e50e7d5f2a5fe80e15426059d95c687c1330aa","serverName":"ray","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T16:31:41.876Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":713,"error":null,"detail":{"tools":[{"name":"whoami","description":"Identify the API key this connection uses (GET /me): `tenantId` (the workspace), `apiKeyId` and `scopes`. Write tools need the `write` scope; call this to check"},{"name":"get_usage","description":"The workspace's plan, subscription status and this calendar month's usage against the monthly quota (GET /billing/subscription). `used`/`remaining` are null on "},{"name":"list_channels","description":"List the delivery channels configured in this workspace (GET /channels). Call this FIRST before sending: each entry's `id` is the `channelConfigId` for send_not"},{"name":"send_notification","description":"Send a notification (POST /send; needs a `write`-scoped key). Returns `{ sendId }` with HTTP 202: delivery is asynchronous, so check the outcome with get_send_s"},{"name":"get_send_status","description":"Delivery status of a send (GET /sends/{id}): `aggregate` counts per status over the whole send (pending, claimed, delivered, failed_retryable, failed_terminal, "},{"name":"list_templates","description":"List message templates (GET /templates): id, name, folder, channelKind, and `publishedVersionId` (null = never published, so it cannot be sent by templateId yet"},{"name":"get_template","description":"Get one template with its published version and its current draft (GET /templates/{id}): content, logTitle/logDescription, `requiredParams` a send must supply, "},{"name":"create_template","description":"Create a template (POST /templates; write scope). `channelKind` is permanent and must match the channels you'll send through (list_channels `templateKind`). It "},{"name":"update_template_draft","description":"Replace a template's draft (PATCH /templates/{id}; write scope). This is a full replacement, not a partial patch: pass content, logTitle, logDescription and par"},{"name":"publish_template","description":"Publish 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 i"},{"name":"archive_template","description":"Archive a template (POST /templates/{id}/archive; write scope). Sends that reference it fail until it is restored with unarchive_template; its name stays reserv"},{"name":"unarchive_template","description":"Restore 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"},{"name":"test_send_template","description":"Send 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"},{"name":"list_feed_notifications","description":"Read 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 "},{"name":"get_click_stats","description":"Email 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"},{"name":"list_webhooks","description":"List the workspace's outbound event webhooks (GET /tenant-webhooks): url, subscribed events, enabled flag and delivery health (consecutiveFailures, lastError). "},{"name":"get_webhook","description":"Get one outbound webhook (GET /tenant-webhooks/{id}) including its delivery health (consecutiveFailures, lastDeliveryAt, lastFailureAt, lastError)."},{"name":"create_webhook","description":"Create 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 publ"},{"name":"update_webhook","description":"Change a webhook (PATCH /tenant-webhooks/{id}; write scope). Only the fields you pass change; pass at least one. `rotateSecret: true` issues a new signing secre"},{"name":"delete_webhook","description":"Delete (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 us"},{"name":"read_docs","description":"Read 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"}],"toolCount":21,"toolsHash":"e73a6bed7ef668621ee9ec8d51e50e7d5f2a5fe80e15426059d95c687c1330aa","serverName":"ray","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"whoami","description":"Identify the API key this connection uses (GET /me): `tenantId` (the workspace), `apiKeyId` and `scopes`. Write tools need the `write` scope; call this to check"},{"name":"get_usage","description":"The workspace's plan, subscription status and this calendar month's usage against the monthly quota (GET /billing/subscription). `used`/`remaining` are null on "},{"name":"list_channels","description":"List the delivery channels configured in this workspace (GET /channels). Call this FIRST before sending: each entry's `id` is the `channelConfigId` for send_not"},{"name":"send_notification","description":"Send a notification (POST /send; needs a `write`-scoped key). Returns `{ sendId }` with HTTP 202: delivery is asynchronous, so check the outcome with get_send_s"},{"name":"get_send_status","description":"Delivery status of a send (GET /sends/{id}): `aggregate` counts per status over the whole send (pending, claimed, delivered, failed_retryable, failed_terminal, "},{"name":"list_templates","description":"List message templates (GET /templates): id, name, folder, channelKind, and `publishedVersionId` (null = never published, so it cannot be sent by templateId yet"},{"name":"get_template","description":"Get one template with its published version and its current draft (GET /templates/{id}): content, logTitle/logDescription, `requiredParams` a send must supply, "},{"name":"create_template","description":"Create a template (POST /templates; write scope). `channelKind` is permanent and must match the channels you'll send through (list_channels `templateKind`). It "},{"name":"update_template_draft","description":"Replace a template's draft (PATCH /templates/{id}; write scope). This is a full replacement, not a partial patch: pass content, logTitle, logDescription and par"},{"name":"publish_template","description":"Publish 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 i"},{"name":"archive_template","description":"Archive a template (POST /templates/{id}/archive; write scope). Sends that reference it fail until it is restored with unarchive_template; its name stays reserv"},{"name":"unarchive_template","description":"Restore 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"},{"name":"test_send_template","description":"Send 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"},{"name":"list_feed_notifications","description":"Read 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 "},{"name":"get_click_stats","description":"Email 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"},{"name":"list_webhooks","description":"List the workspace's outbound event webhooks (GET /tenant-webhooks): url, subscribed events, enabled flag and delivery health (consecutiveFailures, lastError). "},{"name":"get_webhook","description":"Get one outbound webhook (GET /tenant-webhooks/{id}) including its delivery health (consecutiveFailures, lastDeliveryAt, lastFailureAt, lastError)."},{"name":"create_webhook","description":"Create 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 publ"},{"name":"update_webhook","description":"Change a webhook (PATCH /tenant-webhooks/{id}; write scope). Only the fields you pass change; pass at least one. `rotateSecret: true` issues a new signing secre"},{"name":"delete_webhook","description":"Delete (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 us"},{"name":"read_docs","description":"Read 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"}],"package":{"name":"@gege-mn/ray-mcp","registry":"npm","observedAt":"2026-10-10T01:26:22.490Z","publishedAt":"2026-09-14T17:13:11.013Z","latestVersion":"0.1.0","weeklyDownloads":26},"toolSurface":{"id":"ts_f3v75kucsuaz","endpointId":"ep_g4fvw43gyyuc","hash":"e73a6bed7ef668621ee9ec8d51e50e7d5f2a5fe80e15426059d95c687c1330aa","toolCount":21,"serverName":"ray","serverVersion":"0.1.0","protocolVersion":"2025-06-18","firstSeenAt":"2026-09-19T13:28:32.283Z","lastSeenAt":"2026-10-10T01:23:35.369Z","observations":388,"toolNames":["whoami","get_usage","list_channels","send_notification","get_send_status","list_templates","get_template","create_template","update_template_draft","publish_template","archive_template","unarchive_template","test_send_template","list_feed_notifications","get_click_stats","list_webhooks","get_webhook","create_webhook","update_webhook","delete_webhook","read_docs"],"distinctSurfaces":2},"endpointFacts":[{"id":"ep_g4fvw43gyyuc","url":"https://ray-api.gege.mn/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-10-09T13:29:21.386Z","auth":{"observedAt":"2026-10-09T13:29:21.670Z","authRequired":false,"scheme":null,"resourceMetadata":null,"authorizationServer":null,"conformance":{"dpop":false,"rfc8414":false,"rfc9728":false,"pkceS256":false,"clientIdMetadataDocument":false,"dynamicClientRegistration":false}},"tls":{"observedAt":"2026-10-09T13:29:21.684Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"gege.mn","issuer":{"commonName":"WE1","organization":"Google Trust Services"},"validFrom":"2026-09-15T08:28:47.000Z","validTo":"2026-12-14T09:28:29.000Z","daysToExpiry":65,"sanCount":2,"fingerprint256":"67:08:84:E6:3E:01:48:9F:EF:08:0D:C3:84:5C:6A:08:0F:E2:A6:97:CC:4E:F3:FB:CA:01:17:DB:2A:F3:F9:9A"}}]},"verification":{"claimed":true,"claimedAt":"2026-09-24T05:07:09.414Z","proofs":[{"method":"github_owner","target":"gege-mn","verifiedAt":"2026-09-24T05:07:09.414Z"}]},"provenance":{"sources":[{"source":"npm","key":"@gege-mn/ray-mcp","url":"https://www.npmjs.com/package/@gege-mn/ray-mcp","firstSeenAt":"2026-09-22T09:21:39.906Z","fetchedAt":"2026-10-10T01:17:43.257Z","normalizedAt":"2026-10-10T01:17:43.257Z"},{"source":"mcp_registry","key":"io.github.gege-mn/ray-mcp","url":"https://registry.modelcontextprotocol.io/v0/servers/io.github.gege-mn%2Fray-mcp","firstSeenAt":"2026-09-16T23:19:22.101Z","fetchedAt":"2026-10-07T12:21:59.684Z","normalizedAt":"2026-10-07T12:21:59.684Z"}]},"firstSeenAt":"2026-09-16T23:19:22.101Z","updatedAt":"2026-10-10T01:26:22.490Z"}