three.ws Notifications

io.github.nirholas由 GitHub 帳號 nirholas 發布v0.1.4更新於 Oct 24, 2026

Read the inbox, mark items read, manage delivery preferences, and register Web Push devices.

已驗證STDIO僅桌面效率與工作流溝通與協作

概覽

AI 產生的概覽

一個本機 MCP 伺服器,讓助理讀取與整理 three.ws 通知收件匣、調整各類別通知的投遞管道,並管理 Web Push 裝置。

可以做什麼
依時間新到舊列出收件匣通知,可依類型篩選,並顯示未讀數與每則通知的已讀狀態。將單則通知或全部未讀通知標示為已讀。永久刪除單則通知。讀取各類別對應各管道的投遞矩陣。修改銷售、提醒、社群、帳號等類別的投遞偏好,並設定或清除 Telegram 聊天 ID。依瀏覽器推送訂閱註冊或移除 Web Push 裝置。
適用情境
當代理或帳號擁有者依賴會產生入站事件的 three.ws 帳號(例如行情提醒、銷售、購買收據、社群提及或安全通知),並希望直接在助理中查看與整理這些事件,而不是輪詢多個端點時適用。
執行需求
透過 npx 或 npm 以 stdio 在本機執行,需要 Node 20 以上版本。需要在 THREE_WS_API_KEY 中提供 three.ws API 金鑰或 OAuth 存取權杖(別名 THREE_WS_TOKEN 與 THREE_WS_BEARER)。選用 THREE_WS_BASE 供自架或預覽部署,THREE_WS_TIMEOUT_MS 設定請求逾時。需要連線至 three.ws API 的網路。
安裝前請注意
此憑證擁有帳號收件匣與投遞設定的完整讀寫權限,應視同密碼保管。寫入操作會改變真實帳號狀態:delete_notification 無法復原,unregister_push_device 會停止推送至該裝置,set_preferences 會改變哪些管道能觸達擁有者。伺服器會向 three.ws API 送出請求,並在每次呼叫時解析所屬帳號。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 three.ws Notifications,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[three.ws]

@three-ws/notifications-mcp

Your three.ws notification inbox, delivery preferences, and Web Push devices — from any AI agent.

[npm] [downloads] [license] [node] [MCP Registry] [three.ws]

Install · Quick start · Tools · Authentication · Errors · three.ws


A Model Context Protocol server that gives an AI assistant its own three.ws notification inbox + delivery control over stdio. Read inbound events (pump/market alerts, sales & earnings, purchase receipts, social mentions, IRL interactions, account/security notices), mark them read, tune the per-category → per-channel delivery matrix, and register Web Push devices — all live, all account-scoped.

Why

An agent that trades, sells skills, or stands in the real world generates inbound events around the clock — a coin it launched pumps, a skill it published sells, someone taps its IRL pin. Without an inbox surface, the agent polls a dozen endpoints or misses everything. This server turns the platform's own notification feed into seven MCP tools: the agent reads what happened since it last looked, triages it, and controls exactly which channels (in_app, push, email, telegram) each category of event uses to reach its owner.

Every read and write hits the real three.ws API. The server is authenticated: it carries a three.ws API key (or OAuth access token) as a Bearer credential and resolves the owning account on every call. It signs nothing locally and holds no other secret.

Install

bash
npm install @three-ws/notifications-mcp

Or run with npx (no install):

bash
THREE_WS_API_KEY=sk_live_… npx @three-ws/notifications-mcp

Node 20+. Two runtime dependencies (@modelcontextprotocol/sdk, zod).

Quick start

Claude Code, one line:

bash
claude mcp add notifications -e THREE_WS_API_KEY=sk_live_… -- npx -y @three-ws/notifications-mcp

Claude Desktop / Cursor / any MCP client — add to your MCP config (claude_desktop_config.json, .cursor/mcp.json, .mcp.json):

json
{	"mcpServers": {		"notifications": {			"command": "npx",			"args": ["-y", "@three-ws/notifications-mcp"],			"env": { "THREE_WS_API_KEY": "sk_live_…" }		}	}}

Restart the client and the seven tools appear. Inspect the surface in a GUI:

bash
npx -y @modelcontextprotocol/inspector npx -y @three-ws/notifications-mcp

Then ask in plain language:

Anything new in my inbox? Mark the pump alerts read, and turn off email for social mentions.

Runs list_notifications → mark_read → set_preferences.

Tools

ToolKindWhat it does
list_notificationsreadThe inbox, newest first, filterable by type, with an unread_count.
mark_readwriteMark one notification — or every unread one — read. Idempotent.
delete_notificationwrite ⚠️Permanently remove one notification (irreversible).
get_preferencesreadThe per-category → per-channel delivery matrix.
set_preferenceswritePatch which channels deliver each category. Idempotent.
register_push_devicewriteRegister a Web Push device from a browser PushSubscription. Idempotent.
unregister_push_devicewrite ⚠️Remove a Web Push device (tears down delivery to it). Idempotent.

Every tool ships MCP tool annotations: the two reads advertise readOnlyHint: true, and the two ⚠️ tools are flagged destructiveHint: true, so annotation-aware clients prompt before running them.

list_notifications

Read the account's inbox — the inbound-event feed the platform delivers: market/pump alerts, sales & earnings, purchase receipts, social mentions, IRL interactions, and account/security notices. Wraps GET /api/notifications.

ArgTypeRequiredNotes
typestringnoReturn only one notification type (e.g. "pump_alert", "skill_purchased", "referral_earned", "security_alert"). Lower_snake_case, ≤ 40 chars. Omit for all types.
limitnumbernoHow many to return, newest first. 1–50, default 20.

Example call and response (shape illustration — your inbox contents will differ):

jsonc
// call{ "type": "pump_alert", "limit": 2 }
// response (example){  "ok": true,  "type": "pump_alert",  "unread_count": 5,  "count": 2,  "notifications": [    {      "id": "5d1c2f0a-9b1e-4c3d-8e7f-000000000001",      "type": "pump_alert",      "payload": { "mint": "FeMbDoX7R1Psc4GEcvJdsbNbZA3bfztcyDCatJVJpump", "symbol": "THREE" },      "read": false,      "read_at": null,      "created_at": "2026-07-11T18:04:12.000Z"    }  ]}

read is derived from read_at (null ⇒ unread). unread_count is the total unread across the whole inbox, not just this page.

mark_read

Mark notifications read. Wraps POST /api/notifications/:id/read (one) and POST /api/notifications/read-all (all). Pass exactly one of the two arguments. Marking read only sets read_at — nothing is deleted, and re-running is a no-op.

ArgTypeRequiredNotes
idstring (UUID)one ofA single notification to mark read (from list_notifications).
allbooleanone oftrue ⇒ mark every unread notification read.
jsonc
// call{ "all": true }
// response (example){ "ok": true, "scope": "all", "marked_read": 5 }

With id, the response is { "ok": true, "scope": "one", "id": "…", "read_at": "…" }.

delete_notification

Permanently remove one notification. Wraps DELETE /api/notifications/:id. Irreversible — prefer mark_read for normal triage. Only a notification the caller owns can be deleted; a missing or already-deleted id returns a not-found error.

ArgTypeRequiredNotes
idstring (UUID)yesThe notification to delete (from list_notifications).
jsonc
// call{ "id": "5d1c2f0a-9b1e-4c3d-8e7f-000000000001" }
// response (example){ "ok": true, "id": "5d1c2f0a-9b1e-4c3d-8e7f-000000000001", "deleted": true }

get_preferences

Read the resolved delivery matrix — for each category, which channels deliver it. No arguments. Wraps GET /api/notifications/preferences. Read this before set_preferences so you patch from real current state.

jsonc
// response (example){  "ok": true,  "categories": [    { "key": "sales", "label": "Sales & earnings", "description": "…" },    { "key": "alerts", "label": "Market & pump alerts", "description": "…" }    /* purchases, social, irl, account … */  ],  "channels": ["in_app", "push", "email", "telegram"],  "prefs": {    "categories": { "alerts": { "in_app": true, "push": true, "email": false, "telegram": false } },    "telegram_chat_id": null  },  "push": { "subscribed_devices": 1 }}

The seven categories are sales, purchases, social, irl, alerts, creations, account; the four channels are in_app, push, email, telegram. prefs.categories is the effective matrix with the user's sparse overrides already merged onto platform defaults. A category may also carry lockedChannels: account locks in_app on, so security and withdrawal notices always reach the bell inbox.

set_preferences

Patch the delivery matrix. Wraps PUT /api/notifications/preferences. Provide at least one of the two arguments. Only the category/channel pairs you pass change; unknown keys are dropped server-side; untouched pairs keep their current value. Re-applying the same values is a no-op.

ArgTypeRequiredNotes
categoriesobjectat least oneOuter keys: sales, purchases, social, irl, alerts, creations, account. Inner keys: in_app, push, email, telegram → boolean. account's in_app is locked on and a false for it is ignored.
telegram_chat_idstringat least oneNumeric Telegram chat id to deliver the telegram channel to, or "" to unlink. ≤ 24 chars.
jsonc
// call — stop emailing social mentions, push pump alerts{ "categories": { "social": { "email": false }, "alerts": { "push": true } } }
// response (example) — the full resolved matrix after the update{ "ok": true, "prefs": { "categories": { "social": { "email": false /* … */ } }, "telegram_chat_id": null } }

register_push_device

Register a Web Push device so the account receives push notifications on it. Wraps POST /api/push/subscribe. The subscription argument is exactly what the browser's pushManager.subscribe().toJSON() returns. Push endpoints are globally unique — re-registering the same device upserts (latest owner wins), so this is idempotent. Whether a category actually delivers over push is still governed by set_preferences.

ArgTypeRequiredNotes
subscriptionobjectyes{ endpoint, keys: { p256dh, auth } } — endpoint is the push-service URL (≤ 2048 chars); p256dh/auth are the base64url-encoded keys from the browser.
jsonc
// call{  "subscription": {    "endpoint": "https://fcm.googleapis.com/fcm/send/exampleSubscriptionId",    "keys": { "p256dh": "BNcRd…", "auth": "tBHI…" }  }}
// response (example){ "ok": true, "registered": true, "endpoint": "https://fcm.googleapis.com/fcm/send/exampleSubscriptionId" }

unregister_push_device

Remove a Web Push device so it stops receiving pushes. Wraps DELETE /api/push/subscribe. Provide at least one of the two arguments — the endpoint is what locates the device. Idempotent: removing an endpoint that isn't registered still returns ok. Only push delivery to that device changes; in_app, email, and telegram preferences are untouched.

ArgTypeRequiredNotes
endpointstring (URL)one ofThe push endpoint URL of the device to remove (preferred).
subscriptionobjectone ofAlternatively the full subscription object; its endpoint is used.
jsonc
// call{ "endpoint": "https://fcm.googleapis.com/fcm/send/exampleSubscriptionId" }
// response (example){ "ok": true, "unregistered": true, "endpoint": "https://fcm.googleapis.com/fcm/send/exampleSubscriptionId" }

Authentication

Every endpoint is account-scoped and returns 401 without a valid credential — this server can never read or change another account.

Set THREE_WS_API_KEY to either:

  • a three.ws API key (sk_live_… / sk_test_…) — create one in your three.ws dashboard, or
  • an OAuth access token for the account.

Both are carried as Authorization: Bearer … on every request. Bearer auth is CSRF-exempt server-side, so writes need no extra token. THREE_WS_TOKEN and THREE_WS_BEARER are accepted aliases. Treat the credential like a password — it grants full read/write over the account's inbox and delivery settings.

Configuration

Env varRequiredDefaultDescription
THREE_WS_API_KEYyes—three.ws API key or OAuth access token (see Authentication). Aliases: THREE_WS_TOKEN, THREE_WS_BEARER.
THREE_WS_BASEnohttps://three.wsAPI base URL. Override only when self-hosting or targeting a preview.
THREE_WS_TIMEOUT_MSno20000Per-request timeout in milliseconds. Must be a positive number.

The credential is checked when a tool runs, not at startup — the server boots and advertises its tool surface without one, so tools/list always works.

Errors

A failed tool call returns an MCP error result (isError: true) whose text is a single JSON object:

jsonc
// error shape (example){ "ok": false, "error": "upstream_error", "message": "Not found", "status": 404, "detail": { /* API body */ } }
errorHTTPMeaningRecovery
missing_credential401No THREE_WS_API_KEY (or alias) configured.Set the env var and restart the client.
validation_error400Bad arguments (e.g. neither id nor all on mark_read).Fix the call — the message says exactly what's missing.
upstream_erroras returnedThe three.ws API rejected the request; status + detail carry the real response (401 bad key, 404 unknown id, 429 rate-limited).Act on status — a 429 is safe to retry after a pause.
timeout—No response within THREE_WS_TIMEOUT_MS.Retry; raise the timeout if it recurs.
network_error—The request never reached the API (DNS, offline).Check connectivity / THREE_WS_BASE.

Reads are always safe to retry. The writes are idempotent by design (mark_read, set_preferences, register_push_device, unregister_push_device re-run to the same state) — only delete_notification is not, and a repeat simply returns not-found.

Related

  • @three-ws/brain-mcp — the three.ws multi-provider LLM router over MCP.
  • @three-ws/pumpfun-mcp — free, read-only pump.fun + Solana data (the source of many pump_alert events).
  • @three-ws/irl — the real-world presence layer whose interactions land in the irl category.

Links


Part of the three.ws SDK suite — 3D AI agents, on-chain identity, and agent payments.
Website · Changelog · GitHub

來源:packages/notifications-mcp/README.md,提交 c8f2cde

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

2
  1. v0.1.4最新Oct 10, 2026
  2. v0.1.3Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分