Skip to main content
AllMCPs
BrowseBestCategoriesStackCompareToolsGuidesBlog Log in Submit MCP

Stay in the loop

Get new MCP servers and top picks in your inbox.

AllMCPs

The open directory for discovering and installing Model Context Protocol servers.

Explore

  • Browse servers
  • Best MCP servers
  • Categories
  • MCP clients
  • Agent prompts
  • Stack Builder
  • Compare servers
  • Tags index
  • Submit a server
  • Pricing

Learn

  • Guides hub
  • What is MCP?
  • Install guide
  • Troubleshooting
  • Security
  • Blog
  • Blog RSS

Tools

  • All tools
  • Config generator
  • Config validator
  • MCP playground
  • OpenAPI β†’ MCP
  • Badge generator

For agents

  • API docs
  • Trust & traffic
  • llms.txt β†— (opens in a new tab)
  • Catalog JSON β†— (opens in a new tab)
  • Remote MCP β†— (opens in a new tab)

Company

  • About
  • Contact
  • X (@AllMCPs) β†— (opens in a new tab)
  • GitHub β†— (opens in a new tab)
  • Terms
  • Privacy
AllMCPs VerifiedAllMCPs VerifiedFeatured on Nick LaunchesFeatured on Nick LaunchesLaunch Llama NewsletterLaunch Llama NewsletterVerified DR - allmcps.comVerified DR - allmcps.comFeatured on SaaSGrowFeatured on SaaSGrowFeatured on Twelve ToolsFeatured on Twelve ToolsFeatured on Saaspa.geFeatured on Saaspa.geFeatured on Findly.toolsFeatured on Findly.toolsFeatured on Startup FameFeatured on Startup FameFeatured on LaunchKiwiFeatured on LaunchKiwiFeatured on ScrollLaunchFeatured on ScrollLaunchFeatured on DailyPingsFeatured on DailyPingsFazier badgeFazier badgeFeatured on NewTool.siteFeatured on NewTool.siteFeatured on saasfame.comFeatured on saasfame.comDR Checker - Domain RatingDR Checker - Domain RatingListed on Turbo0Listed on Turbo0Launched on LaunchBoard - Product Launch PlatformLaunched on LaunchBoard - Product Launch PlatformList on SimilarlabsList on Similarlabshttps://codetrendy.comhttps://codetrendy.comListed on DevTool.ioFeatured on BuildlistFeatured on BuildlistAllMCPs VerifiedAllMCPs VerifiedFeatured on Nick LaunchesFeatured on Nick LaunchesLaunch Llama NewsletterLaunch Llama NewsletterVerified DR - allmcps.comVerified DR - allmcps.comFeatured on SaaSGrowFeatured on SaaSGrowFeatured on Twelve ToolsFeatured on Twelve ToolsFeatured on Saaspa.geFeatured on Saaspa.geFeatured on Findly.toolsFeatured on Findly.toolsFeatured on Startup FameFeatured on Startup FameFeatured on LaunchKiwiFeatured on LaunchKiwiFeatured on ScrollLaunchFeatured on ScrollLaunchFeatured on DailyPingsFeatured on DailyPingsFazier badgeFazier badgeFeatured on NewTool.siteFeatured on NewTool.siteFeatured on saasfame.comFeatured on saasfame.comDR Checker - Domain RatingDR Checker - Domain RatingListed on Turbo0Listed on Turbo0Launched on LaunchBoard - Product Launch PlatformLaunched on LaunchBoard - Product Launch PlatformList on SimilarlabsList on Similarlabshttps://codetrendy.comhttps://codetrendy.comListed on DevTool.ioFeatured on BuildlistFeatured on Buildlist
Β© 2026 Jackalope Digital LLC. All rights reserved.
  1. Home
  2. πŸ’¬ Communication
  3. Mcp
M
Health: Not checked yetWe have not completed a health check for this listing yet.Last checked 8/10/2026, 11:43:11 PM

Mcp

Enrichment pendingWe haven’t run our AI enrichment pass on this listing yet, so the overview, use cases, and FAQ below may be sparse or missing. We work through the catalog over time β€” check back soon.
View RepositoryVisit Website

Create Elaan notification types, templates and brands, trigger sends, and debug delivery.

Quick Install

Automated & IDE Setup

Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β€” or use 1-click editor setup below.

Add to CursorAdd to VS Code
Manual Client & Custom JSON ConfigExpand JSON β–Ύ

Install Config Generator

Choose your client
claude_desktop_config.json
{
  "mcpServers": {
    "mcp-186": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-186"
      ]
    }
  }
}

πŸ’‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)

Install Directory Badge Claim listing AlternativesπŸ’¬ More in Communication

Documentation Overview

Elaan JavaScript SDKs

Client SDKs for Elaan β€” drop-in notification inbox, preferences, and push-token management for your users' frontends.

This is the JavaScript/TypeScript family. Swift and Kotlin/Android live in their own repos (elaan-swift, elaan-kotlin).

Packages

PackageWhat it isRegistry
@elaanio/coreFramework-agnostic foundation β€” API client, types, observable inbox/preferences stores, and a realtime-transport interface. No UI, no framework.npm
@elaanio/react-coreReact bindings only (no DOM) β€” ElaanProvider + hooks (useNotifications, useUnreadCount, usePreferences, usePush, useBrowserPush) over the core stores. Shared by web and native.npm
@elaanio/reactReact (web) components β€” notification bell, feed, and preferences UI, plus real-time updates over SSE-on-fetch.npm
@elaanio/react-nativeReact Native components over the same hooks; realtime over SSE (react-native-sse) with polling fallback.npm
@elaanio/vueVue 3 components + composables β€” bell, feed, and preferences, with fetch-SSE realtime.npm
@elaanio/svelteSvelte stores (headless) β€” reactive inbox, unread count, and preferences; bring your own markup.npm
@elaanio/elementsFramework-agnostic Web Components β€” <elaan-bell> / <elaan-feed> / <elaan-preferences>. Drop into any page or framework.npm

How they fit together

Code
@elaanio/core                  vanilla TS: client Β· stores Β· realtime transport
   β”œβ”€ @elaanio/react-core           React provider + hooks (framework, no DOM)
   β”‚    β”œβ”€ @elaanio/react                web components + fetch-SSE realtime
   β”‚    └─ @elaanio/react-native         RN components (SSE via react-native-sse)
   β”œβ”€ @elaanio/vue                  Vue 3 components + composables
   β”œβ”€ @elaanio/svelte               Svelte stores (headless)
   └─ @elaanio/elements             Web Components (works anywhere)

The non-visual logic lives once in @elaanio/core; each framework package is a thin adapter over the core client + observable stores (React goes through the shared @elaanio/react-core hooks; Vue and Svelte bind the stores to their own reactivity). Adding another framework means a new binding over @elaanio/core, not a reimplementation of the client or stores.

Authentication (all packages)

The SDK never sees your API key. Your backend mints a short-lived contact token for the signed-in user (POST /v1/contacts/tokens with your service key, by external_id) and returns it to the client. You pass the SDK a tokenProvider callback that fetches a fresh token from your own endpoint; it refreshes automatically on expiry. See @elaanio/react for the full token flow.

Quick start β€” React (web)

server.ts
import { ElaanProvider, NotificationBell, Preferences } from "@elaanio/react";
import "@elaanio/react/styles.css";

async function tokenProvider() {
  const res = await fetch("/api/elaan-token"); // your endpoint
  const { token, contact_id } = await res.json();
  return { token, contactId: contact_id };
}

export function App() {
  return (
    <ElaanProvider apiBase="https://api.elaan.io/v1" tokenProvider={tokenProvider}>
      <NotificationBell />
      <Preferences />
    </ElaanProvider>
  );
}

Quick start β€” React Native

Same provider and hooks; the components render with React Native primitives (View/FlatList/Switch/Modal) instead of DOM, and there's no stylesheet to import. Realtime works over SSE via react-native-sse (RN can't stream fetch, but its XHR-based EventSource can send the auth header), wired into the RN provider by default and falling back to polling when the deployment has realtime off. Pass realtime={null} for polling only.

server.ts
import {
  ElaanProvider,
  NotificationBell,
  NotificationFeed,
  Preferences,
} from "@elaanio/react-native";

async function tokenProvider() {
  const res = await fetch("https://yourapp.com/api/elaan-token", {
    headers: { Authorization: `Bearer ${yourSessionToken}` },
  });
  const { token, contact_id } = await res.json();
  return { token, contactId: contact_id };
}

export default function App() {
  return (
    <ElaanProvider apiBase="https://api.elaan.io/v1" tokenProvider={tokenProvider}>
      {/* A bell + badge that opens the inbox in a modal card */}
      <NotificationBell />

      {/* …or the inbox inline as a full screen */}
      <NotificationFeed emptyText="Nothing here yet." />

      {/* per-type Γ— channel preference switches */}
      <Preferences />
    </ElaanProvider>
  );
}

Registering a device token (Expo / FCM)

server.ts
import { usePush } from "@elaanio/react-native";

function useRegisterPush(expoToken: string) {
  const { register } = usePush();
  useEffect(() => {
    // provider: "expo" | "fcm" | "apns" | "onesignal"
    register(expoToken, "expo", "ios");
  }, [expoToken]);
}

Browser push (the web_push channel)

A separate channel from mobile push, not a provider under it β€” a contact's opt-out is keyed by (type, channel), so "no browser nags, keep my phone alerts" has to be expressible.

There is no token to hand in here, only a handshake to perform, so useBrowserPush does the whole thing: permission, service worker registration, subscribe(), and converting the subscription's two keys into what the API stores.

server.ts
import { useBrowserPush } from "@elaanio/react";
import type { BrowserPushResult } from "@elaanio/react";

function PushToggle() {
  const push = useBrowserPush({ serviceWorkerUrl: "/sw.js" });
  const [note, setNote] = useState<string | null>(null);
  if (!push.supported) return null;

  // Handle the result, and catch: the hook rethrows genuine faults after setting
  // `push.error`, so passing `push.subscribe` straight to onClick turns one into an
  // unhandled rejection.
  const onClick = async () => {
    try {
      if (push.subscribed) {
        setNote((await push.unsubscribe()) ? null : "Nothing to turn off.");
      } else {
        setNote(explain(await push.subscribe()));
      }
    } catch {
      setNote(push.error?.message ?? "Something went wrong.");
    }
  };

  return (
    <>
      <button onClick={onClick} disabled={push.busy || push.permission === "denied"}>
        {push.subscribed ? "Turn off" : "Turn on"} browser notifications
      </button>
      {note && <p>{note}</p>}
    </>
  );
}

function explain(result: BrowserPushResult): string | null {
  if (result.ok) return null;
  switch (result.reason) {
    case "denied":
      return "Notifications are blocked for this site. Change it in site settings β€” the browser won't ask again.";
    case "dismissed":
      return "No problem β€” you can turn these on any time.";
    case "not-configured":
      return "Browser notifications aren't set up for this account yet.";
    case "unsupported":
      return "This browser can't do notifications.";
  }
}

subscribe() resolves to a result rather than throwing, because the failures are states to render: unsupported, denied, dismissed, not-configured. denied is the one to handle deliberately β€” the browser will not prompt again, so the only way forward is site settings.

Your service worker must show the notification. If it doesn't, the browser substitutes its own "site has been updated in the background" notice:

server.ts
// sw.js β€” bundle this; a classic service worker can't `import`.
import { handlePush, handleNotificationClick } from "@elaanio/core/service-worker";

self.addEventListener("push", handlePush);
self.addEventListener("notificationclick", handleNotificationClick);

The account needs a VAPID keypair (Push Transport in the console). Without one subscribe() returns not-configured β€” the SDK checks before it prompts, so a one-shot permission isn't spent on an account that can't send.

It also needs a browser push template for each notification type you send, but the SDK cannot check that and does not claim to: subscribing succeeds and the sends then fail server-side with "no resolvable template". If notifications never arrive for a browser that reports itself subscribed, that is the first thing to check β€” the delivery log in the console names it directly.

A runnable version of all of this is in examples/web-push-demo.

Theming & styling

Web (@elaanio/react) ships a stylesheet driven entirely by CSS variables, so you theme it without touching component internals. Import the stylesheet once, then override the variables on :root (or any ancestor of the components):

css
:root {
  --elaan-accent: #7c3aed;   /* brand color: badges, links, active states */
  --elaan-accent-ink: #fff;  /* text/icon on top of the accent */
  --elaan-bg: #ffffff;
  --elaan-bg-hover: #f4f6f9;
  --elaan-text: #1a1d23;
  --elaan-muted: #6b7280;
  --elaan-border: #e5e7eb;
  --elaan-danger: #ef4444;
  --elaan-radius: 10px;
  --elaan-shadow: 0 12px 32px -12px rgba(0, 0, 0, 0.3);
}

The default theme already adapts to light/dark via prefers-color-scheme; override the same variables inside your own media query to customize dark mode. Each element also carries a stable elaan-* class (.elaan-bell, .elaan-feed, .elaan-item, …) if you need finer CSS control.

React Native (@elaanio/react-native) components use StyleSheet with a small built-in palette (accent, background, text, muted, border). There are no CSS variables in RN, so for anything beyond the defaults β€” brand fonts, custom row layouts, dark-mode palettes β€” build your own components on the hooks (next section). That's the intended path for heavy RN customization.

Building your own components

The packaged components are deliberately thin. When the defaults don't fit β€” your own markup, a design system, a different layout, or a framework we don't ship yet β€” drop down a layer. Pick the lowest one you need:

1. Same framework, your own UI β†’ use the hooks. @elaanio/react and @elaanio/react-native both re-export the hooks from @elaanio/react-core. Render whatever you like; the hook owns loading, polling, realtime, and optimistic updates:

server.ts
import { useNotifications, usePreferences } from "@elaanio/react"; // or /react-native

function MyInbox() {
  const { notifications, unreadCount, loading, markRead, markAllRead, remove } =
    useNotifications();

  if (loading && notifications.length === 0) return <Spinner />;
  return (
    <MyList
      items={notifications}
      onOpen={(n) => markRead(n.id)}
      onDismiss={(n) => remove(n.id)}
      onClearAll={markAllRead}
    />
  );
}

function MyPrefs() {
  const { preferences, setPreference, clearPreference } = usePreferences();
  // preferences: [{ notification_type_key, channels: [{ channel, enabled, overridden }] }]
  // setPreference(typeKey, channel, enabled) / clearPreference(typeKey, channel)
}

Available hooks: useNotifications, useUnreadCount, usePreferences, usePush β€” all require an ancestor <ElaanProvider>.

2. A different framework (Vue, Svelte, Solid, vanilla) β†’ use @elaanio/core. The core exposes the same logic as framework-agnostic observable stores. This is exactly what @elaanio/react-core is built on, so a new binding is small:

server.ts
import { ElaanClient, createInboxStore } from "@elaanio/core";

const client = new ElaanClient("https://api.elaan.io/v1", tokenProvider);
const inbox = createInboxStore(client, { pollInterval: 30000 });

inbox.subscribe(() => render(inbox.getState())); // getState() / getUnreadCount()
inbox.markRead(id);                              // + markUnread / markAllRead / remove / refresh
// inbox.destroy() when you tear down

Wire store.subscribe + store.getState into your framework's reactivity (Vue ref, Svelte store contract, useSyncExternalStore, …). For one-off calls that don't need a store, ElaanClient has every endpoint directly. If you build a binding for another framework, a PR adding an @elaanio/<framework> package is very welcome.

Development

This repo is a pnpm workspace.

bash
pnpm install     # install all packages
pnpm -r build    # build every package (topological order)
pnpm -r typecheck

Releasing

Versioning is manual semver, per package. To cut a release:

  1. Bump "version" in the package.json of each package you're releasing.
  2. Commit, then push a tag:
    bash
    git tag v0.2.0 && git push origin v0.2.0
    
  3. The Publish workflow builds, typechecks, and runs pnpm -r publish β€” which publishes each package in dependency order (rewriting workspace:* to real versions) and skips any version already on npm, so releasing a subset just works.

One-time setup (repo owner):

  • Own the @elaan scope/org on npmjs.com (the packages are scoped @elaanio/*).
  • Add an NPM_TOKEN repository secret (Settings β†’ Secrets and variables β†’ Actions) β€” an npm Automation token with publish rights to the scope.

Packages publish as public via each one's publishConfig.access, with npm provenance attested from the workflow.

License

MIT β€” see LICENSE.

Related MCP Servers

View all in Communication View all alternatives
  • Slack Mcp Server logoSlack Mcp Server

    The most powerful MCP server for Slack Workspaces.

    πŸ’¬ Communication1 views
    Compare vs Slack Mcp Server β†’
  • Ntfy Me Mcp logoNtfy Me Mcp

    An ntfy MCP server for sending/fetching ntfy notifications to your self-hosted ntfy server from AI Agents πŸ“€ (supports secure token auth & more - use with npx or docker!)

    πŸ’¬ Communication3 views
    Compare vs Ntfy Me Mcp β†’
  • M
    Mcp

    Create and manage Templated email templates from any MCP client - bring your own model.

    πŸ’¬ Communication0 views
    Compare vs Mcp β†’
  • Telegram Mcp logoTelegram Mcp

    Telegram API integration for accessing user data, managing dialogs (chats, channels, groups), retrieving messages, and handling read status

    πŸ’¬ Communication2 views
    Compare vs Telegram Mcp β†’

Frequently Asked Questions about Mcp

Add the following block to your claude_desktop_config.json under mcpServers: "mcpServers": { "mcp": { "command": "npx", "args": ["-y", "mcp"] } }

AllMCPs Directory Badge

Full Badge Customizer

Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.

Badge Style:
Live Dynamic SVG PreviewMcp AllMCPs Directory Badge
Markdown (GitHub README)
[![AllMCPs](https://allmcps.com/api/badge/mcp-186?style=directory)](https://allmcps.com/mcp/mcp-186)
HTML Embed
<a href="https://allmcps.com/mcp/mcp-186"><img src="https://allmcps.com/api/badge/mcp-186?style=directory" alt="Mcp on AllMCPs" /></a>

Technical Specs & Signals

CategoryπŸ’¬Communication
More technical detailsExpand β–Ύ
TransportSTDIO
RuntimeNode.js
0/4 checks healthy over the last 6h
Views0
Unique ViewsTotal visits recorded for this listing page on AllMCPs.
Installs0
Installs & Copy ActionsTotal times users copied install commands or configuration snippets for this server.
27Quality signal: Emerging Β· 27/100How this signal is calculated β–Ύ
Server availabilityNot measured

Not scored for repo-hosted servers β€” we can't reach the running server, only its GitHub page. Hosted MCP endpoints are health-checked live.

Verified ownership8/20
Documentation & tools11/30
Adoption & activity1/15
Community engagement0/10

A guidance signal from public completeness & health data β€” not a user rating. New listings start lower and rise as they add docs, get verified, and grow adoption. Signals we can't observe for a listing are skipped, not counted against it.

β˜… FeaturedMoxie Docs MCP logo

Moxie Docs MCP

MCP & Agent Skills for Automated Documentation, and codebase conventions + context

Explore Server β†’

Own this project?

This directory is pre-filled from public sources. Claim via GitHub README, site badge, or DNS TXT to get the verified badge.

Free dofollow backlink: after claiming, verify your product site and place a dofollow AllMCPs badge β€” we recheck it stays live.

Claim & get free dofollow

Share & Embed

Add our SVG badge (dark/light directory styles) or embeddable widget to your site.

Explore more

More in πŸ’¬ Communication β†’Best MCP servers for Slack & Communication β†’Alternatives to Mcp β†’Install in Claude DesktopInstall in CursorInstall in VS Code