Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Send notifications across 23 channels with 36 AI-ready tools. One API, zero boilerplate.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
NOTIFY_CHANNELS_EMAIL_HOST, NOTIFY_CHANNELS_EMAIL_PORT, NOTIFY_CHANNELS_EMAIL_USERNAME, NOTIFY_CHANNELS_EMAIL_PASSWORD, NOTIFY_CHANNELS_EMAIL_FROM, NOTIFY_CHANNELS_SMS_ACCOUNTSID, NOTIFY_CHANNELS_SMS_AUTHTOKEN, NOTIFY_CHANNELS_SMS_FROMNUMBER, NOTIFY_CHANNELS_SLACK_WEBHOOKURL, NOTIFY_CHANNELS_TELEGRAM_BOTTOKEN, NOTIFY_CHANNELS_TELEGRAM_CHATID, NOTIFY_CHANNELS_DISCORD_WEBHOOKURL, NOTIFY_CHANNELS_TEAMS_WEBHOOKURL, NOTIFY_CHANNELS_GOOGLECHAT_WEBHOOKURL, NOTIFY_CHANNELS_TWITTER_APIKEY, NOTIFY_CHANNELS_TWITTER_APISECRET, NOTIFY_CHANNELS_TWITTER_ACCESSTOKEN, NOTIFY_CHANNELS_TWITTER_ACCESSTOKENSECRET, NOTIFY_CHANNELS_LINKEDIN_ACCESSTOKEN, NOTIFY_CHANNELS_LINKEDIN_ORGANIZATIONID, NOTIFY_CHANNELS_WHATSAPP_ACCOUNTSID, NOTIFY_CHANNELS_WHATSAPP_AUTHTOKEN, NOTIFY_CHANNELS_WHATSAPP_FROMNUMBER, NOTIFY_CHANNELS_PUSH_FIREBASECREDENTIALS, NOTIFY_CHANNELS_NOTION_APIKEY, NOTIFY_CHANNELS_NOTION_DATABASEID, NOTIFY_CHANNELS_TWITCH_CLIENTID, NOTIFY_CHANNELS_TWITCH_CLIENTSECRET, NOTIFY_CHANNELS_TWITCH_BROADCASTERID, NOTIFY_CHANNELS_YOUTUBE_CLIENTID, NOTIFY_CHANNELS_YOUTUBE_CLIENTSECRET, NOTIFY_CHANNELS_YOUTUBE_REFRESHTOKEN, NOTIFY_CHANNELS_YOUTUBE_LIVECHATID, NOTIFY_CHANNELS_INSTAGRAM_ACCESSTOKEN, NOTIFY_CHANNELS_INSTAGRAM_USERID, NOTIFY_CHANNELS_SENDGRID_APIKEY, NOTIFY_CHANNELS_SENDGRID_FROMEMAIL, NOTIFY_CHANNELS_TIKTOKSHOP_APPKEY, NOTIFY_CHANNELS_TIKTOKSHOP_APPSECRET, NOTIFY_CHANNELS_TIKTOKSHOP_ACCESSTOKEN, NOTIFY_CHANNELS_TIKTOKSHOP_SHOPID, NOTIFY_CHANNELS_FACEBOOK_PAGEACCESSTOKEN, NOTIFY_CHANNELS_FACEBOOK_PAGEID, NOTIFY_CHANNELS_AWSSNS_ACCESSKEYID, NOTIFY_CHANNELS_AWSSNS_SECRETACCESSKEY, NOTIFY_CHANNELS_AWSSNS_REGION, NOTIFY_CHANNELS_MAILGUN_APIKEY, NOTIFY_CHANNELS_MAILGUN_DOMAIN, NOTIFY_CHANNELS_MAILGUN_FROMEMAIL, NOTIFY_CHANNELS_PAGERDUTY_APIKEY标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"notify-hub": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"NOTIFY_CHANNELS_EMAIL_HOST",
"-e",
"NOTIFY_CHANNELS_EMAIL_PORT",
"-e",
"NOTIFY_CHANNELS_EMAIL_USERNAME",
"-e",
"NOTIFY_CHANNELS_EMAIL_PASSWORD",
"-e",
"NOTIFY_CHANNELS_EMAIL_FROM",
"-e",
"NOTIFY_CHANNELS_SMS_ACCOUNTSID",
"-e",
"NOTIFY_CHANNELS_SMS_AUTHTOKEN",
"-e",
"NOTIFY_CHANNELS_SMS_FROMNUMBER",
"-e",
"NOTIFY_CHANNELS_SLACK_WEBHOOKURL",
"-e",
"NOTIFY_CHANNELS_TELEGRAM_BOTTOKEN",
"-e",
"NOTIFY_CHANNELS_TELEGRAM_CHATID",
"-e",
"NOTIFY_CHANNELS_DISCORD_WEBHOOKURL",
"-e",
"NOTIFY_CHANNELS_TEAMS_WEBHOOKURL",
"-e",
"NOTIFY_CHANNELS_GOOGLECHAT_WEBHOOKURL",
"-e",
"NOTIFY_CHANNELS_TWITTER_APIKEY",
"-e",
"NOTIFY_CHANNELS_TWITTER_APISECRET",
"-e",
"NOTIFY_CHANNELS_TWITTER_ACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_TWITTER_ACCESSTOKENSECRET",
"-e",
"NOTIFY_CHANNELS_LINKEDIN_ACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_LINKEDIN_ORGANIZATIONID",
"-e",
"NOTIFY_CHANNELS_WHATSAPP_ACCOUNTSID",
"-e",
"NOTIFY_CHANNELS_WHATSAPP_AUTHTOKEN",
"-e",
"NOTIFY_CHANNELS_WHATSAPP_FROMNUMBER",
"-e",
"NOTIFY_CHANNELS_PUSH_FIREBASECREDENTIALS",
"-e",
"NOTIFY_CHANNELS_NOTION_APIKEY",
"-e",
"NOTIFY_CHANNELS_NOTION_DATABASEID",
"-e",
"NOTIFY_CHANNELS_TWITCH_CLIENTID",
"-e",
"NOTIFY_CHANNELS_TWITCH_CLIENTSECRET",
"-e",
"NOTIFY_CHANNELS_TWITCH_BROADCASTERID",
"-e",
"NOTIFY_CHANNELS_YOUTUBE_CLIENTID",
"-e",
"NOTIFY_CHANNELS_YOUTUBE_CLIENTSECRET",
"-e",
"NOTIFY_CHANNELS_YOUTUBE_REFRESHTOKEN",
"-e",
"NOTIFY_CHANNELS_YOUTUBE_LIVECHATID",
"-e",
"NOTIFY_CHANNELS_INSTAGRAM_ACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_INSTAGRAM_USERID",
"-e",
"NOTIFY_CHANNELS_SENDGRID_APIKEY",
"-e",
"NOTIFY_CHANNELS_SENDGRID_FROMEMAIL",
"-e",
"NOTIFY_CHANNELS_TIKTOKSHOP_APPKEY",
"-e",
"NOTIFY_CHANNELS_TIKTOKSHOP_APPSECRET",
"-e",
"NOTIFY_CHANNELS_TIKTOKSHOP_ACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_TIKTOKSHOP_SHOPID",
"-e",
"NOTIFY_CHANNELS_FACEBOOK_PAGEACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_FACEBOOK_PAGEID",
"-e",
"NOTIFY_CHANNELS_AWSSNS_ACCESSKEYID",
"-e",
"NOTIFY_CHANNELS_AWSSNS_SECRETACCESSKEY",
"-e",
"NOTIFY_CHANNELS_AWSSNS_REGION",
"-e",
"NOTIFY_CHANNELS_MAILGUN_APIKEY",
"-e",
"NOTIFY_CHANNELS_MAILGUN_DOMAIN",
"-e",
"NOTIFY_CHANNELS_MAILGUN_FROMEMAIL",
"-e",
"NOTIFY_CHANNELS_PAGERDUTY_APIKEY",
"ghcr.io/gabrielbbaldez/notify-hub:1.1.0"
],
"env": {
"NOTIFY_CHANNELS_EMAIL_HOST": "your-value",
"NOTIFY_CHANNELS_EMAIL_PORT": "your-value",
"NOTIFY_CHANNELS_EMAIL_USERNAME": "your-value",
"NOTIFY_CHANNELS_EMAIL_PASSWORD": "your-value",
"NOTIFY_CHANNELS_EMAIL_FROM": "your-value",
"NOTIFY_CHANNELS_SMS_ACCOUNTSID": "your-value",
"NOTIFY_CHANNELS_SMS_AUTHTOKEN": "your-value",
"NOTIFY_CHANNELS_SMS_FROMNUMBER": "your-value",
"NOTIFY_CHANNELS_SLACK_WEBHOOKURL": "your-value",
"NOTIFY_CHANNELS_TELEGRAM_BOTTOKEN": "your-value",
"NOTIFY_CHANNELS_TELEGRAM_CHATID": "your-value",
"NOTIFY_CHANNELS_DISCORD_WEBHOOKURL": "your-value",
"NOTIFY_CHANNELS_TEAMS_WEBHOOKURL": "your-value",
"NOTIFY_CHANNELS_GOOGLECHAT_WEBHOOKURL": "your-value",
"NOTIFY_CHANNELS_TWITTER_APIKEY": "your-value",
"NOTIFY_CHANNELS_TWITTER_APISECRET": "your-value",
"NOTIFY_CHANNELS_TWITTER_ACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_TWITTER_ACCESSTOKENSECRET": "your-value",
"NOTIFY_CHANNELS_LINKEDIN_ACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_LINKEDIN_ORGANIZATIONID": "your-value",
"NOTIFY_CHANNELS_WHATSAPP_ACCOUNTSID": "your-value",
"NOTIFY_CHANNELS_WHATSAPP_AUTHTOKEN": "your-value",
"NOTIFY_CHANNELS_WHATSAPP_FROMNUMBER": "your-value",
"NOTIFY_CHANNELS_PUSH_FIREBASECREDENTIALS": "your-value",
"NOTIFY_CHANNELS_NOTION_APIKEY": "your-value",
"NOTIFY_CHANNELS_NOTION_DATABASEID": "your-value",
"NOTIFY_CHANNELS_TWITCH_CLIENTID": "your-value",
"NOTIFY_CHANNELS_TWITCH_CLIENTSECRET": "your-value",
"NOTIFY_CHANNELS_TWITCH_BROADCASTERID": "your-value",
"NOTIFY_CHANNELS_YOUTUBE_CLIENTID": "your-value",
"NOTIFY_CHANNELS_YOUTUBE_CLIENTSECRET": "your-value",
"NOTIFY_CHANNELS_YOUTUBE_REFRESHTOKEN": "your-value",
"NOTIFY_CHANNELS_YOUTUBE_LIVECHATID": "your-value",
"NOTIFY_CHANNELS_INSTAGRAM_ACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_INSTAGRAM_USERID": "your-value",
"NOTIFY_CHANNELS_SENDGRID_APIKEY": "your-value",
"NOTIFY_CHANNELS_SENDGRID_FROMEMAIL": "your-value",
"NOTIFY_CHANNELS_TIKTOKSHOP_APPKEY": "your-value",
"NOTIFY_CHANNELS_TIKTOKSHOP_APPSECRET": "your-value",
"NOTIFY_CHANNELS_TIKTOKSHOP_ACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_TIKTOKSHOP_SHOPID": "your-value",
"NOTIFY_CHANNELS_FACEBOOK_PAGEACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_FACEBOOK_PAGEID": "your-value",
"NOTIFY_CHANNELS_AWSSNS_ACCESSKEYID": "your-value",
"NOTIFY_CHANNELS_AWSSNS_SECRETACCESSKEY": "your-value",
"NOTIFY_CHANNELS_AWSSNS_REGION": "your-value",
"NOTIFY_CHANNELS_MAILGUN_APIKEY": "your-value",
"NOTIFY_CHANNELS_MAILGUN_DOMAIN": "your-value",
"NOTIFY_CHANNELS_MAILGUN_FROMEMAIL": "your-value",
"NOTIFY_CHANNELS_PAGERDUTY_APIKEY": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add notify-hub --env NOTIFY_CHANNELS_EMAIL_HOST=your-value --env NOTIFY_CHANNELS_EMAIL_PORT=your-value --env NOTIFY_CHANNELS_EMAIL_USERNAME=your-value --env NOTIFY_CHANNELS_EMAIL_PASSWORD=your-value --env NOTIFY_CHANNELS_EMAIL_FROM=your-value --env NOTIFY_CHANNELS_SMS_ACCOUNTSID=your-value --env NOTIFY_CHANNELS_SMS_AUTHTOKEN=your-value --env NOTIFY_CHANNELS_SMS_FROMNUMBER=your-value --env NOTIFY_CHANNELS_SLACK_WEBHOOKURL=your-value --env NOTIFY_CHANNELS_TELEGRAM_BOTTOKEN=your-value --env NOTIFY_CHANNELS_TELEGRAM_CHATID=your-value --env NOTIFY_CHANNELS_DISCORD_WEBHOOKURL=your-value --env NOTIFY_CHANNELS_TEAMS_WEBHOOKURL=your-value --env NOTIFY_CHANNELS_GOOGLECHAT_WEBHOOKURL=your-value --env NOTIFY_CHANNELS_TWITTER_APIKEY=your-value --env NOTIFY_CHANNELS_TWITTER_APISECRET=your-value --env NOTIFY_CHANNELS_TWITTER_ACCESSTOKEN=your-value --env NOTIFY_CHANNELS_TWITTER_ACCESSTOKENSECRET=your-value --env NOTIFY_CHANNELS_LINKEDIN_ACCESSTOKEN=your-value --env NOTIFY_CHANNELS_LINKEDIN_ORGANIZATIONID=your-value --env NOTIFY_CHANNELS_WHATSAPP_ACCOUNTSID=your-value --env NOTIFY_CHANNELS_WHATSAPP_AUTHTOKEN=your-value --env NOTIFY_CHANNELS_WHATSAPP_FROMNUMBER=your-value --env NOTIFY_CHANNELS_PUSH_FIREBASECREDENTIALS=your-value --env NOTIFY_CHANNELS_NOTION_APIKEY=your-value --env NOTIFY_CHANNELS_NOTION_DATABASEID=your-value --env NOTIFY_CHANNELS_TWITCH_CLIENTID=your-value --env NOTIFY_CHANNELS_TWITCH_CLIENTSECRET=your-value --env NOTIFY_CHANNELS_TWITCH_BROADCASTERID=your-value --env NOTIFY_CHANNELS_YOUTUBE_CLIENTID=your-value --env NOTIFY_CHANNELS_YOUTUBE_CLIENTSECRET=your-value --env NOTIFY_CHANNELS_YOUTUBE_REFRESHTOKEN=your-value --env NOTIFY_CHANNELS_YOUTUBE_LIVECHATID=your-value --env NOTIFY_CHANNELS_INSTAGRAM_ACCESSTOKEN=your-value --env NOTIFY_CHANNELS_INSTAGRAM_USERID=your-value --env NOTIFY_CHANNELS_SENDGRID_APIKEY=your-value --env NOTIFY_CHANNELS_SENDGRID_FROMEMAIL=your-value --env NOTIFY_CHANNELS_TIKTOKSHOP_APPKEY=your-value --env NOTIFY_CHANNELS_TIKTOKSHOP_APPSECRET=your-value --env NOTIFY_CHANNELS_TIKTOKSHOP_ACCESSTOKEN=your-value --env NOTIFY_CHANNELS_TIKTOKSHOP_SHOPID=your-value --env NOTIFY_CHANNELS_FACEBOOK_PAGEACCESSTOKEN=your-value --env NOTIFY_CHANNELS_FACEBOOK_PAGEID=your-value --env NOTIFY_CHANNELS_AWSSNS_ACCESSKEYID=your-value --env NOTIFY_CHANNELS_AWSSNS_SECRETACCESSKEY=your-value --env NOTIFY_CHANNELS_AWSSNS_REGION=your-value --env NOTIFY_CHANNELS_MAILGUN_APIKEY=your-value --env NOTIFY_CHANNELS_MAILGUN_DOMAIN=your-value --env NOTIFY_CHANNELS_MAILGUN_FROMEMAIL=your-value --env NOTIFY_CHANNELS_PAGERDUTY_APIKEY=your-value -- docker run -i --rm -e NOTIFY_CHANNELS_EMAIL_HOST -e NOTIFY_CHANNELS_EMAIL_PORT -e NOTIFY_CHANNELS_EMAIL_USERNAME -e NOTIFY_CHANNELS_EMAIL_PASSWORD -e NOTIFY_CHANNELS_EMAIL_FROM -e NOTIFY_CHANNELS_SMS_ACCOUNTSID -e NOTIFY_CHANNELS_SMS_AUTHTOKEN -e NOTIFY_CHANNELS_SMS_FROMNUMBER -e NOTIFY_CHANNELS_SLACK_WEBHOOKURL -e NOTIFY_CHANNELS_TELEGRAM_BOTTOKEN -e NOTIFY_CHANNELS_TELEGRAM_CHATID -e NOTIFY_CHANNELS_DISCORD_WEBHOOKURL -e NOTIFY_CHANNELS_TEAMS_WEBHOOKURL -e NOTIFY_CHANNELS_GOOGLECHAT_WEBHOOKURL -e NOTIFY_CHANNELS_TWITTER_APIKEY -e NOTIFY_CHANNELS_TWITTER_APISECRET -e NOTIFY_CHANNELS_TWITTER_ACCESSTOKEN -e NOTIFY_CHANNELS_TWITTER_ACCESSTOKENSECRET -e NOTIFY_CHANNELS_LINKEDIN_ACCESSTOKEN -e NOTIFY_CHANNELS_LINKEDIN_ORGANIZATIONID -e NOTIFY_CHANNELS_WHATSAPP_ACCOUNTSID -e NOTIFY_CHANNELS_WHATSAPP_AUTHTOKEN -e NOTIFY_CHANNELS_WHATSAPP_FROMNUMBER -e NOTIFY_CHANNELS_PUSH_FIREBASECREDENTIALS -e NOTIFY_CHANNELS_NOTION_APIKEY -e NOTIFY_CHANNELS_NOTION_DATABASEID -e NOTIFY_CHANNELS_TWITCH_CLIENTID -e NOTIFY_CHANNELS_TWITCH_CLIENTSECRET -e NOTIFY_CHANNELS_TWITCH_BROADCASTERID -e NOTIFY_CHANNELS_YOUTUBE_CLIENTID -e NOTIFY_CHANNELS_YOUTUBE_CLIENTSECRET -e NOTIFY_CHANNELS_YOUTUBE_REFRESHTOKEN -e NOTIFY_CHANNELS_YOUTUBE_LIVECHATID -e NOTIFY_CHANNELS_INSTAGRAM_ACCESSTOKEN -e NOTIFY_CHANNELS_INSTAGRAM_USERID -e NOTIFY_CHANNELS_SENDGRID_APIKEY -e NOTIFY_CHANNELS_SENDGRID_FROMEMAIL -e NOTIFY_CHANNELS_TIKTOKSHOP_APPKEY -e NOTIFY_CHANNELS_TIKTOKSHOP_APPSECRET -e NOTIFY_CHANNELS_TIKTOKSHOP_ACCESSTOKEN -e NOTIFY_CHANNELS_TIKTOKSHOP_SHOPID -e NOTIFY_CHANNELS_FACEBOOK_PAGEACCESSTOKEN -e NOTIFY_CHANNELS_FACEBOOK_PAGEID -e NOTIFY_CHANNELS_AWSSNS_ACCESSKEYID -e NOTIFY_CHANNELS_AWSSNS_SECRETACCESSKEY -e NOTIFY_CHANNELS_AWSSNS_REGION -e NOTIFY_CHANNELS_MAILGUN_APIKEY -e NOTIFY_CHANNELS_MAILGUN_DOMAIN -e NOTIFY_CHANNELS_MAILGUN_FROMEMAIL -e NOTIFY_CHANNELS_PAGERDUTY_APIKEY ghcr.io/gabrielbbaldez/notify-hub:1.1.0运行前请先填写空着的值。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"notify-hub": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"NOTIFY_CHANNELS_EMAIL_HOST",
"-e",
"NOTIFY_CHANNELS_EMAIL_PORT",
"-e",
"NOTIFY_CHANNELS_EMAIL_USERNAME",
"-e",
"NOTIFY_CHANNELS_EMAIL_PASSWORD",
"-e",
"NOTIFY_CHANNELS_EMAIL_FROM",
"-e",
"NOTIFY_CHANNELS_SMS_ACCOUNTSID",
"-e",
"NOTIFY_CHANNELS_SMS_AUTHTOKEN",
"-e",
"NOTIFY_CHANNELS_SMS_FROMNUMBER",
"-e",
"NOTIFY_CHANNELS_SLACK_WEBHOOKURL",
"-e",
"NOTIFY_CHANNELS_TELEGRAM_BOTTOKEN",
"-e",
"NOTIFY_CHANNELS_TELEGRAM_CHATID",
"-e",
"NOTIFY_CHANNELS_DISCORD_WEBHOOKURL",
"-e",
"NOTIFY_CHANNELS_TEAMS_WEBHOOKURL",
"-e",
"NOTIFY_CHANNELS_GOOGLECHAT_WEBHOOKURL",
"-e",
"NOTIFY_CHANNELS_TWITTER_APIKEY",
"-e",
"NOTIFY_CHANNELS_TWITTER_APISECRET",
"-e",
"NOTIFY_CHANNELS_TWITTER_ACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_TWITTER_ACCESSTOKENSECRET",
"-e",
"NOTIFY_CHANNELS_LINKEDIN_ACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_LINKEDIN_ORGANIZATIONID",
"-e",
"NOTIFY_CHANNELS_WHATSAPP_ACCOUNTSID",
"-e",
"NOTIFY_CHANNELS_WHATSAPP_AUTHTOKEN",
"-e",
"NOTIFY_CHANNELS_WHATSAPP_FROMNUMBER",
"-e",
"NOTIFY_CHANNELS_PUSH_FIREBASECREDENTIALS",
"-e",
"NOTIFY_CHANNELS_NOTION_APIKEY",
"-e",
"NOTIFY_CHANNELS_NOTION_DATABASEID",
"-e",
"NOTIFY_CHANNELS_TWITCH_CLIENTID",
"-e",
"NOTIFY_CHANNELS_TWITCH_CLIENTSECRET",
"-e",
"NOTIFY_CHANNELS_TWITCH_BROADCASTERID",
"-e",
"NOTIFY_CHANNELS_YOUTUBE_CLIENTID",
"-e",
"NOTIFY_CHANNELS_YOUTUBE_CLIENTSECRET",
"-e",
"NOTIFY_CHANNELS_YOUTUBE_REFRESHTOKEN",
"-e",
"NOTIFY_CHANNELS_YOUTUBE_LIVECHATID",
"-e",
"NOTIFY_CHANNELS_INSTAGRAM_ACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_INSTAGRAM_USERID",
"-e",
"NOTIFY_CHANNELS_SENDGRID_APIKEY",
"-e",
"NOTIFY_CHANNELS_SENDGRID_FROMEMAIL",
"-e",
"NOTIFY_CHANNELS_TIKTOKSHOP_APPKEY",
"-e",
"NOTIFY_CHANNELS_TIKTOKSHOP_APPSECRET",
"-e",
"NOTIFY_CHANNELS_TIKTOKSHOP_ACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_TIKTOKSHOP_SHOPID",
"-e",
"NOTIFY_CHANNELS_FACEBOOK_PAGEACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_FACEBOOK_PAGEID",
"-e",
"NOTIFY_CHANNELS_AWSSNS_ACCESSKEYID",
"-e",
"NOTIFY_CHANNELS_AWSSNS_SECRETACCESSKEY",
"-e",
"NOTIFY_CHANNELS_AWSSNS_REGION",
"-e",
"NOTIFY_CHANNELS_MAILGUN_APIKEY",
"-e",
"NOTIFY_CHANNELS_MAILGUN_DOMAIN",
"-e",
"NOTIFY_CHANNELS_MAILGUN_FROMEMAIL",
"-e",
"NOTIFY_CHANNELS_PAGERDUTY_APIKEY",
"ghcr.io/gabrielbbaldez/notify-hub:1.1.0"
],
"env": {
"NOTIFY_CHANNELS_EMAIL_HOST": "your-value",
"NOTIFY_CHANNELS_EMAIL_PORT": "your-value",
"NOTIFY_CHANNELS_EMAIL_USERNAME": "your-value",
"NOTIFY_CHANNELS_EMAIL_PASSWORD": "your-value",
"NOTIFY_CHANNELS_EMAIL_FROM": "your-value",
"NOTIFY_CHANNELS_SMS_ACCOUNTSID": "your-value",
"NOTIFY_CHANNELS_SMS_AUTHTOKEN": "your-value",
"NOTIFY_CHANNELS_SMS_FROMNUMBER": "your-value",
"NOTIFY_CHANNELS_SLACK_WEBHOOKURL": "your-value",
"NOTIFY_CHANNELS_TELEGRAM_BOTTOKEN": "your-value",
"NOTIFY_CHANNELS_TELEGRAM_CHATID": "your-value",
"NOTIFY_CHANNELS_DISCORD_WEBHOOKURL": "your-value",
"NOTIFY_CHANNELS_TEAMS_WEBHOOKURL": "your-value",
"NOTIFY_CHANNELS_GOOGLECHAT_WEBHOOKURL": "your-value",
"NOTIFY_CHANNELS_TWITTER_APIKEY": "your-value",
"NOTIFY_CHANNELS_TWITTER_APISECRET": "your-value",
"NOTIFY_CHANNELS_TWITTER_ACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_TWITTER_ACCESSTOKENSECRET": "your-value",
"NOTIFY_CHANNELS_LINKEDIN_ACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_LINKEDIN_ORGANIZATIONID": "your-value",
"NOTIFY_CHANNELS_WHATSAPP_ACCOUNTSID": "your-value",
"NOTIFY_CHANNELS_WHATSAPP_AUTHTOKEN": "your-value",
"NOTIFY_CHANNELS_WHATSAPP_FROMNUMBER": "your-value",
"NOTIFY_CHANNELS_PUSH_FIREBASECREDENTIALS": "your-value",
"NOTIFY_CHANNELS_NOTION_APIKEY": "your-value",
"NOTIFY_CHANNELS_NOTION_DATABASEID": "your-value",
"NOTIFY_CHANNELS_TWITCH_CLIENTID": "your-value",
"NOTIFY_CHANNELS_TWITCH_CLIENTSECRET": "your-value",
"NOTIFY_CHANNELS_TWITCH_BROADCASTERID": "your-value",
"NOTIFY_CHANNELS_YOUTUBE_CLIENTID": "your-value",
"NOTIFY_CHANNELS_YOUTUBE_CLIENTSECRET": "your-value",
"NOTIFY_CHANNELS_YOUTUBE_REFRESHTOKEN": "your-value",
"NOTIFY_CHANNELS_YOUTUBE_LIVECHATID": "your-value",
"NOTIFY_CHANNELS_INSTAGRAM_ACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_INSTAGRAM_USERID": "your-value",
"NOTIFY_CHANNELS_SENDGRID_APIKEY": "your-value",
"NOTIFY_CHANNELS_SENDGRID_FROMEMAIL": "your-value",
"NOTIFY_CHANNELS_TIKTOKSHOP_APPKEY": "your-value",
"NOTIFY_CHANNELS_TIKTOKSHOP_APPSECRET": "your-value",
"NOTIFY_CHANNELS_TIKTOKSHOP_ACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_TIKTOKSHOP_SHOPID": "your-value",
"NOTIFY_CHANNELS_FACEBOOK_PAGEACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_FACEBOOK_PAGEID": "your-value",
"NOTIFY_CHANNELS_AWSSNS_ACCESSKEYID": "your-value",
"NOTIFY_CHANNELS_AWSSNS_SECRETACCESSKEY": "your-value",
"NOTIFY_CHANNELS_AWSSNS_REGION": "your-value",
"NOTIFY_CHANNELS_MAILGUN_APIKEY": "your-value",
"NOTIFY_CHANNELS_MAILGUN_DOMAIN": "your-value",
"NOTIFY_CHANNELS_MAILGUN_FROMEMAIL": "your-value",
"NOTIFY_CHANNELS_PAGERDUTY_APIKEY": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"notify-hub": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"NOTIFY_CHANNELS_EMAIL_HOST",
"-e",
"NOTIFY_CHANNELS_EMAIL_PORT",
"-e",
"NOTIFY_CHANNELS_EMAIL_USERNAME",
"-e",
"NOTIFY_CHANNELS_EMAIL_PASSWORD",
"-e",
"NOTIFY_CHANNELS_EMAIL_FROM",
"-e",
"NOTIFY_CHANNELS_SMS_ACCOUNTSID",
"-e",
"NOTIFY_CHANNELS_SMS_AUTHTOKEN",
"-e",
"NOTIFY_CHANNELS_SMS_FROMNUMBER",
"-e",
"NOTIFY_CHANNELS_SLACK_WEBHOOKURL",
"-e",
"NOTIFY_CHANNELS_TELEGRAM_BOTTOKEN",
"-e",
"NOTIFY_CHANNELS_TELEGRAM_CHATID",
"-e",
"NOTIFY_CHANNELS_DISCORD_WEBHOOKURL",
"-e",
"NOTIFY_CHANNELS_TEAMS_WEBHOOKURL",
"-e",
"NOTIFY_CHANNELS_GOOGLECHAT_WEBHOOKURL",
"-e",
"NOTIFY_CHANNELS_TWITTER_APIKEY",
"-e",
"NOTIFY_CHANNELS_TWITTER_APISECRET",
"-e",
"NOTIFY_CHANNELS_TWITTER_ACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_TWITTER_ACCESSTOKENSECRET",
"-e",
"NOTIFY_CHANNELS_LINKEDIN_ACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_LINKEDIN_ORGANIZATIONID",
"-e",
"NOTIFY_CHANNELS_WHATSAPP_ACCOUNTSID",
"-e",
"NOTIFY_CHANNELS_WHATSAPP_AUTHTOKEN",
"-e",
"NOTIFY_CHANNELS_WHATSAPP_FROMNUMBER",
"-e",
"NOTIFY_CHANNELS_PUSH_FIREBASECREDENTIALS",
"-e",
"NOTIFY_CHANNELS_NOTION_APIKEY",
"-e",
"NOTIFY_CHANNELS_NOTION_DATABASEID",
"-e",
"NOTIFY_CHANNELS_TWITCH_CLIENTID",
"-e",
"NOTIFY_CHANNELS_TWITCH_CLIENTSECRET",
"-e",
"NOTIFY_CHANNELS_TWITCH_BROADCASTERID",
"-e",
"NOTIFY_CHANNELS_YOUTUBE_CLIENTID",
"-e",
"NOTIFY_CHANNELS_YOUTUBE_CLIENTSECRET",
"-e",
"NOTIFY_CHANNELS_YOUTUBE_REFRESHTOKEN",
"-e",
"NOTIFY_CHANNELS_YOUTUBE_LIVECHATID",
"-e",
"NOTIFY_CHANNELS_INSTAGRAM_ACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_INSTAGRAM_USERID",
"-e",
"NOTIFY_CHANNELS_SENDGRID_APIKEY",
"-e",
"NOTIFY_CHANNELS_SENDGRID_FROMEMAIL",
"-e",
"NOTIFY_CHANNELS_TIKTOKSHOP_APPKEY",
"-e",
"NOTIFY_CHANNELS_TIKTOKSHOP_APPSECRET",
"-e",
"NOTIFY_CHANNELS_TIKTOKSHOP_ACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_TIKTOKSHOP_SHOPID",
"-e",
"NOTIFY_CHANNELS_FACEBOOK_PAGEACCESSTOKEN",
"-e",
"NOTIFY_CHANNELS_FACEBOOK_PAGEID",
"-e",
"NOTIFY_CHANNELS_AWSSNS_ACCESSKEYID",
"-e",
"NOTIFY_CHANNELS_AWSSNS_SECRETACCESSKEY",
"-e",
"NOTIFY_CHANNELS_AWSSNS_REGION",
"-e",
"NOTIFY_CHANNELS_MAILGUN_APIKEY",
"-e",
"NOTIFY_CHANNELS_MAILGUN_DOMAIN",
"-e",
"NOTIFY_CHANNELS_MAILGUN_FROMEMAIL",
"-e",
"NOTIFY_CHANNELS_PAGERDUTY_APIKEY",
"ghcr.io/gabrielbbaldez/notify-hub:1.1.0"
],
"env": {
"NOTIFY_CHANNELS_EMAIL_HOST": "your-value",
"NOTIFY_CHANNELS_EMAIL_PORT": "your-value",
"NOTIFY_CHANNELS_EMAIL_USERNAME": "your-value",
"NOTIFY_CHANNELS_EMAIL_PASSWORD": "your-value",
"NOTIFY_CHANNELS_EMAIL_FROM": "your-value",
"NOTIFY_CHANNELS_SMS_ACCOUNTSID": "your-value",
"NOTIFY_CHANNELS_SMS_AUTHTOKEN": "your-value",
"NOTIFY_CHANNELS_SMS_FROMNUMBER": "your-value",
"NOTIFY_CHANNELS_SLACK_WEBHOOKURL": "your-value",
"NOTIFY_CHANNELS_TELEGRAM_BOTTOKEN": "your-value",
"NOTIFY_CHANNELS_TELEGRAM_CHATID": "your-value",
"NOTIFY_CHANNELS_DISCORD_WEBHOOKURL": "your-value",
"NOTIFY_CHANNELS_TEAMS_WEBHOOKURL": "your-value",
"NOTIFY_CHANNELS_GOOGLECHAT_WEBHOOKURL": "your-value",
"NOTIFY_CHANNELS_TWITTER_APIKEY": "your-value",
"NOTIFY_CHANNELS_TWITTER_APISECRET": "your-value",
"NOTIFY_CHANNELS_TWITTER_ACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_TWITTER_ACCESSTOKENSECRET": "your-value",
"NOTIFY_CHANNELS_LINKEDIN_ACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_LINKEDIN_ORGANIZATIONID": "your-value",
"NOTIFY_CHANNELS_WHATSAPP_ACCOUNTSID": "your-value",
"NOTIFY_CHANNELS_WHATSAPP_AUTHTOKEN": "your-value",
"NOTIFY_CHANNELS_WHATSAPP_FROMNUMBER": "your-value",
"NOTIFY_CHANNELS_PUSH_FIREBASECREDENTIALS": "your-value",
"NOTIFY_CHANNELS_NOTION_APIKEY": "your-value",
"NOTIFY_CHANNELS_NOTION_DATABASEID": "your-value",
"NOTIFY_CHANNELS_TWITCH_CLIENTID": "your-value",
"NOTIFY_CHANNELS_TWITCH_CLIENTSECRET": "your-value",
"NOTIFY_CHANNELS_TWITCH_BROADCASTERID": "your-value",
"NOTIFY_CHANNELS_YOUTUBE_CLIENTID": "your-value",
"NOTIFY_CHANNELS_YOUTUBE_CLIENTSECRET": "your-value",
"NOTIFY_CHANNELS_YOUTUBE_REFRESHTOKEN": "your-value",
"NOTIFY_CHANNELS_YOUTUBE_LIVECHATID": "your-value",
"NOTIFY_CHANNELS_INSTAGRAM_ACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_INSTAGRAM_USERID": "your-value",
"NOTIFY_CHANNELS_SENDGRID_APIKEY": "your-value",
"NOTIFY_CHANNELS_SENDGRID_FROMEMAIL": "your-value",
"NOTIFY_CHANNELS_TIKTOKSHOP_APPKEY": "your-value",
"NOTIFY_CHANNELS_TIKTOKSHOP_APPSECRET": "your-value",
"NOTIFY_CHANNELS_TIKTOKSHOP_ACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_TIKTOKSHOP_SHOPID": "your-value",
"NOTIFY_CHANNELS_FACEBOOK_PAGEACCESSTOKEN": "your-value",
"NOTIFY_CHANNELS_FACEBOOK_PAGEID": "your-value",
"NOTIFY_CHANNELS_AWSSNS_ACCESSKEYID": "your-value",
"NOTIFY_CHANNELS_AWSSNS_SECRETACCESSKEY": "your-value",
"NOTIFY_CHANNELS_AWSSNS_REGION": "your-value",
"NOTIFY_CHANNELS_MAILGUN_APIKEY": "your-value",
"NOTIFY_CHANNELS_MAILGUN_DOMAIN": "your-value",
"NOTIFY_CHANNELS_MAILGUN_FROMEMAIL": "your-value",
"NOTIFY_CHANNELS_PAGERDUTY_APIKEY": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
NOTIFY_CHANNELS_EMAIL_HOST envNOTIFY_CHANNELS_EMAIL_PORT envNOTIFY_CHANNELS_EMAIL_FROM envNOTIFY_CHANNELS_SMS_FROMNUMBER envNOTIFY_CHANNELS_TELEGRAM_CHATID envNOTIFY_CHANNELS_LINKEDIN_ORGANIZATIONID envNOTIFY_CHANNELS_WHATSAPP_FROMNUMBER envNOTIFY_CHANNELS_NOTION_DATABASEID envNOTIFY_CHANNELS_TWITCH_BROADCASTERID envNOTIFY_CHANNELS_YOUTUBE_LIVECHATID envNOTIFY_CHANNELS_INSTAGRAM_USERID envNOTIFY_CHANNELS_SENDGRID_FROMEMAIL envNOTIFY_CHANNELS_TIKTOKSHOP_SHOPID envNOTIFY_CHANNELS_FACEBOOK_PAGEID envNOTIFY_CHANNELS_AWSSNS_REGION envNOTIFY_CHANNELS_MAILGUN_DOMAIN envNOTIFY_CHANNELS_MAILGUN_FROMEMAIL env这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过 GitHub 账户 GabrielBBaldez 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:NOTIFY_CHANNELS_EMAIL_USERNAME, NOTIFY_CHANNELS_EMAIL_PASSWORD, NOTIFY_CHANNELS_SMS_ACCOUNTSID, NOTIFY_CHANNELS_SMS_AUTHTOKEN, NOTIFY_CHANNELS_SLACK_WEBHOOKURL, NOTIFY_CHANNELS_TELEGRAM_BOTTOKEN, NOTIFY_CHANNELS_DISCORD_WEBHOOKURL, NOTIFY_CHANNELS_TEAMS_WEBHOOKURL, NOTIFY_CHANNELS_GOOGLECHAT_WEBHOOKURL, NOTIFY_CHANNELS_TWITTER_APIKEY, NOTIFY_CHANNELS_TWITTER_APISECRET, NOTIFY_CHANNELS_TWITTER_ACCESSTOKEN, NOTIFY_CHANNELS_TWITTER_ACCESSTOKENSECRET, NOTIFY_CHANNELS_LINKEDIN_ACCESSTOKEN, NOTIFY_CHANNELS_WHATSAPP_ACCOUNTSID, NOTIFY_CHANNELS_WHATSAPP_AUTHTOKEN, NOTIFY_CHANNELS_PUSH_FIREBASECREDENTIALS, NOTIFY_CHANNELS_NOTION_APIKEY, NOTIFY_CHANNELS_TWITCH_CLIENTID, NOTIFY_CHANNELS_TWITCH_CLIENTSECRET, NOTIFY_CHANNELS_YOUTUBE_CLIENTID, NOTIFY_CHANNELS_YOUTUBE_CLIENTSECRET, NOTIFY_CHANNELS_YOUTUBE_REFRESHTOKEN, NOTIFY_CHANNELS_INSTAGRAM_ACCESSTOKEN, NOTIFY_CHANNELS_SENDGRID_APIKEY, NOTIFY_CHANNELS_TIKTOKSHOP_APPKEY, NOTIFY_CHANNELS_TIKTOKSHOP_APPSECRET, NOTIFY_CHANNELS_TIKTOKSHOP_ACCESSTOKEN, NOTIFY_CHANNELS_FACEBOOK_PAGEACCESSTOKEN, NOTIFY_CHANNELS_AWSSNS_ACCESSKEYID, NOTIFY_CHANNELS_AWSSNS_SECRETACCESSKEY, NOTIFY_CHANNELS_MAILGUN_APIKEY, NOTIFY_CHANNELS_PAGERDUTY_APIKEY
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(1.1.0)于8个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Docker。
同一分类中有:Spec Driven Development, Remote Desktop Commander, Date Math
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Exact date/time math for agents: business days, holidays, time zones, cron, RRULE, SLA. x402 paid.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
NotifyHub
One API. Every channel.
Unified notification library for Java and Spring Boot.
Website · Documentation · Getting Started
Stop writing different code for each notification channel. NotifyHub gives you a single fluent API to send notifications via Email, SMS, WhatsApp, Slack, Telegram, Discord, Microsoft Teams, Firebase Push, Webhooks, WebSocket, Google Chat, Twitter/X, LinkedIn, Notion, Twitch, YouTube, Instagram, SendGrid, TikTok Shop, Facebook, AWS SNS, Mailgun, PagerDuty, Kick — or any custom channel you create.
notify.to(user)
.via(EMAIL) .fallback(SMS) .priority(Priority.HIGH) .subject("Order confirmed") .template("order-confirmed") .param("orderId", order.getId()) .attach(invoicePdf) .send();
| | Problem | Without NotifyHub | With NotifyHub | |:-:|---------|------------------|----------------| | | Email | JavaMail config, MIME types, Session... | .via(EMAIL) | | 📱 | SMS | Twilio SDK, different API entirely | .via(SMS) | | | WhatsApp | Another Twilio setup, prefix logic | .via(WHATSAPP) | | | Slack | Webhook HTTP, JSON payload | .via(SLACK) | | | Telegram | Bot API, HTTP client setup | .via(TELEGRAM) | | | Discord | Webhook HTTP, JSON payload | .via(DISCORD) | | 👥 | Teams | Incoming Webhook, MessageCard JSON | .via(TEAMS) | | | Push | Firebase Admin SDK, credentials... | .via(PUSH) | | 🔗 | Webhook | Custom HTTP, payload template | .via(Channel.custom("pagerduty")) | | | WebSocket | Java WebSocket API, reconnect logic | .via(WEBSOCKET) | | | Google Chat | Webhook HTTP, JSON payload | .via(GOOGLE_CHAT) | | | Twitter/X | OAuth 1.0a, API v2 setup | .via(TWITTER) | | 💼 | LinkedIn | OAuth 2.0, REST API setup | .via(LINKEDIN) | | | Notion | Integration Token, API setup | .via(NOTION) | | | Twitch | OAuth 2.0, Twitch API setup | .via(TWITCH) | | | YouTube | YouTube Data API v3 setup | .via(YOUTUBE) | | | Instagram | Meta Graph API setup | .via(INSTAGRAM) | | 📧 | SendGrid | SendGrid API, webhook tracking | .via(Channel.custom("sendgrid")) | | | TikTok Shop | HMAC-SHA256, Shop API | .via(TIKTOK_SHOP) | | | Facebook | Graph API, Page tokens | .via(FACEBOOK) | | ☁️ | AWS SNS | AWS SDK, credentials, ARN | .via(Channel.custom("aws-sns")) | | | Mailgun | Mailgun API, domain setup | .via(Channel.custom("mailgun")) | | | PagerDuty | Events API v2, routing key | .via(Channel.custom("pagerduty")) | | | Kick | Public API, OAuth 2.1 | .via(KICK) | | | Multiple channels | Completely different code for each | Same fluent API | | Fallback | Manual try/catch chain | .fallback(SMS) | | Retry | Implement yourself | Built-in exponential backoff | | Async | Thread pools, CompletableFuture | .sendAsync() | | Scheduling | ScheduledExecutor, timer logic | .schedule(Duration.ofMinutes(30)) | | Templates | Each channel has its own engine | One template, all channels | | i18n | Manual locale resolution | .locale(Locale.PT_BR) | | Rate limiting | Token bucket from scratch | Config-driven per-channel | | Tracking | Build your own delivery log | Built-in receipts + JPA | | Dead letters | Lost in the void | Auto-captured in DLQ | | Deduplication | Track sent messages yourself | Built-in content hash / explicit key | | Template versions | Manage files manually | .templateVersion("v2") + A/B test | | Batch | Loop and pray | .toAll(users).send() | | Monitoring | Wire Micrometer yourself | Auto-configured counters | | Health checks | Write an Actuator indicator | Auto-configured | | Admin UI | Build your own dashboard | Built-in /notify-admin | | Circuit breaker | Implement yourself per channel | Built-in per-channel circuit breaker | | Orchestration | Manual escalation logic | .orchestrate().first(EMAIL).ifNoOpen(24h).then(PUSH) | | A/B testing | External service + glue code | Built-in .abTest("exp").variant(...).split(50,50) | | Testing | Mock everything | TestNotifyHub captures all sends | | New channel | Build from scratch | Implement one interface |
<dependency>
io.github.gabrielbbaldez notify-spring-boot-starter 1.0.0
Need extra channels? Add optional modules:
`xml
io.github.gabrielbbaldez
notify-sms
1.0.0
io.github.gabrielbbaldez
notify-slack
1.0.0
io.github.gabrielbbaldez
notify-websocket
1.0.0
`
application.ymlnotify:
channels: email: host: smtp.gmail.com port: 587 username: ${GMAIL_USER} password: ${GMAIL_PASS} from: noreply@myapp.com from-name: MyApp tls: true retry: max-attempts: 3 strategy: exponential tracking: enabled: true
@Service
public class OrderService {
private final NotifyHub notify;
public OrderService(NotifyHub notify) { this.notify = notify; }
public void confirmOrder(Order order) { notify.to(order.getCustomer()) .via(Channel.EMAIL) .subject("Order confirmed!") .template("order-confirmed") .param("customerName", order.getCustomer().getName()) .param("orderId", order.getId()) .param("total", order.getTotal()) .send(); } }
That's it. Three steps.
If the primary channel fails, automatically try the next one:
notify.to(user)
.via(Channel.WHATSAPP) .fallback(Channel.SMS) .fallback(Channel.EMAIL) .template("payment-reminder") .param("amount", "R$ 150,00") .send(); // Tries WhatsApp -> SMS -> Email
Send through ALL channels simultaneously:
notify.to(user)
.via(Channel.EMAIL) .via(Channel.SLACK) .via(Channel.TEAMS) .subject("Security Alert") .content("Login from a new device detected") .sendAll();
Send notifications without blocking:
// Fire and forget
notify.to(user) .via(Channel.EMAIL) .template("welcome") .sendAsync();
// Or wait for result CompletableFuture future = notify.to(user) .via(Channel.EMAIL) .via(Channel.SLACK) .content("Deploy complete!") .sendAllAsync();
future.thenRun(() -> log.info("All notifications sent!"));
Automatic retry with exponential or fixed backoff:
# application.yml (global)
notify: retry: max-attempts: 3 strategy: exponential # waits 1s, 2s, 4s...
// Or per-notification
notify.to(user) .via(Channel.EMAIL) .retry(3) .template("invoice") .send();
Create templates in src/main/resources/templates/notify/:
order-confirmed.html (auto-used for email):
<h1>Hello, {{customerName}}!</h1>
Your order #{{orderId}} has been confirmed. Total: {{total}}
order-confirmed.txt (auto-us
只显示了开头部分;其余内容请在仓库中阅读