Multi-backend notification system for SciTeX
Project description
SciTeX Notification (scitex-notification)
Multi-backend notification system — give your AI agents a voice
Full Documentation · pip install scitex-notification
Problem
Developers delegate tasks to AI coding agents — and then wait. Staring at terminals wastes time and drains cognitive resources. Sitting for hours waiting for results takes a physical toll, too.
Solution
SciTeX Notification lets you leave your desk — or even sleep — while your agents keep working. One MCP server gives them a voice in the following channels: TTS, phone calls, SMS, email, and webhooks.
Supported Backends
| Backend | API | Transport | Cost | Internet | Notes |
|---|---|---|---|---|---|
| Audio | alert() |
TTS to local speakers | Free | No | Via scitex-audio; SSH relay supported |
| Desktop | alert() |
notify-send / PowerShell |
Free | No | Linux / WSL |
| Emacs | alert() |
emacsclient message |
Free | No | Popup, minibuffer, or alert |
| Matplotlib | alert() |
Visual popup window | Free | No | |
| Playwright | alert() |
Browser popup | Free | No | |
alert() |
SMTP | Free | Required | Gmail, SMTP relay | |
| Webhook | alert() |
HTTP POST | Free | Required | Slack, Discord, custom endpoints |
| Twilio | call() sms() |
Phone call / SMS | Paid | Required | Twilio setup needed |
alert() tries backends in fallback order until one succeeds. call() and sms() target Twilio directly.
Auditory Feedback -> Phone Call Escalation
When an AI agent needs your attention — even while you sleep — it can escalate from audio to phone call.
Fig. 1: Left — Claude Code terminal showing audio → phone call escalation after 7 consecutive auditory feedback but with no response from the user. Right — iPhone receiving repeated "SciTeX Alert" calls from the AI agent.
Penetrating iPhone Silent Mode:
- Emergency Bypass (most reliable): Save your Twilio number as a contact → Ringtone → enable Emergency Bypass. All calls ring regardless of Focus/Silent mode.
- Repeated Calls (fallback): iOS allows the second call from the same number within 3 minutes to ring through.
repeat=2triggers this automatically with a 30-second gap.
Example Command for Claude Code (`/speak-and-continue`)
The /speak-and-continue command is a real-world example of scitex-notification in action. It configures an AI coding agent (Claude Code) to:
- Provide TTS feedback via
audio_speakMCP tool while working autonomously - Repeat the same audio message when the user sends
/speak-and-continueagain (they may be away) - Count consecutive speaks without user response (spoke counter)
- Escalate to phone call after 7 unanswered speaks — waking the user if asleep
This enables a 24/7 development workflow: the agent works autonomously, speaks progress aloud, and calls your phone when it needs your attention or when all tasks are complete.
Installation
Requires Python >= 3.10.
pip install scitex-notification
Install with optional backends:
pip install "scitex-notification[audio]" # audio alerts via scitex-audio
pip install "scitex-notification[twilio]" # SMS via Twilio
pip install "scitex-notification[mcp]" # MCP server for AI agents
pip install "scitex-notification[all]" # everything
Quickstart
Python API
import scitex_notification as notification
notification.alert("Job done") # default backend (with fallback)
notification.alert("Error", backend="email") # specific backend
notification.alert("Critical", backend=["sms", "email"]) # multiple backends
notification.call("Urgent!") # phone call via Twilio
notification.sms("Build done!") # SMS via Twilio
notification.available_backends() # list installed backends
CLI Commands
scitex-notification --help # Show all commands
scitex-notification send "Job done" # Send via default backend
scitex-notification send "Done" --backend email # Send via specific backend
scitex-notification config # Show configuration
scitex-notification backends # List available backends
scitex-notification mcp list-tools # List MCP tools
MCP Server — for AI Agents
AI agents can send notifications and check system status autonomously.
| Tool | Description |
|---|---|
notify_handler |
Send an alert via specified or fallback backends |
notify_by_level_handler |
Send alert using level-based backend config |
list_backends_handler |
List all backends with availability status |
get_config_handler |
Show current notification configuration |
scitex-notification mcp start
Setup
Environmental Variables List .env.example.
MCP Server
For AI Agents such as Claude Code.
Example
Add .mcp.json to your project root. Use SCITEX_NOTIFICATION_ENV_SRC to load all configuration from a .src file — this keeps .mcp.json static across environments:
{
"mcpServers": {
"scitex-notification": {
"command": "scitex-notification",
"args": ["mcp", "start"],
"env": {
"SCITEX_NOTIFICATION_DEFAULT_BACKEND": "audio",
"SCITEX_NOTIFICATION_TWILIO_SID": "ACxxxxxxx",
"SCITEX_NOTIFICATION_TWILIO_TOKEN": "...",
"SCITEX_NOTIFICATION_TWILIO_TO": "+XX-XXX-XXX-XXXX",
"SCITEX_AUDIO_RELAY_PORT": "${SCITEX_AUDIO_RELAY_PORT}"
}
}
}
}
Speakers Centralization
Remote machines can speak from your local speakers.
Setup example can be seen at ./docs/audio-relay-setup.src
Example
1. Local machine (has speakers) — start the relay server:
scitex-audio relay start --port 31293
2. SSH config (~/.ssh/config) — forward the relay port:
Host my-server
HostName 192.168.x.x
RemoteForward 31293 127.0.0.1:31293
3. Remote server — audio plays on your local speakers:
import scitex_notification as notify
notify.alert("Training complete. Val loss: 0.042")
4. Shell profile (optional) — auto-configure per host:
# ~/.bashrc.d/audio.src (sourced via SCITEX_AUDIO_ENV_SRC)
export SCITEX_AUDIO_RELAY_PORT=31293
# Local machine: run relay server
if [[ "$(hostname)" == "my-laptop" ]]; then
export SCITEX_AUDIO_MODE=local
scitex-audio relay start --port $SCITEX_AUDIO_RELAY_PORT &>/dev/null &
fi
# Remote server: use relay via SSH tunnel
if [[ "$(hostname)" == "my-server" ]]; then
export SCITEX_AUDIO_MODE=remote
fi
Twilio for Phone Call and SMS
Example
export SCITEX_NOTIFICATION_DEFAULT_BACKEND=audio
export SCITEX_NOTIFICATION_TWILIO_SID=ACxxxxxxx
export SCITEX_NOTIFICATION_TWILIO_TOKEN=...
export SCITEX_NOTIFICATION_TWILIO_TO=+XX-XXX-XXX-XXXX
Part of SciTeX
SciTeX Notification is part of SciTeX.
The SciTeX system follows the Four Freedoms for Research below, inspired by the Free Software Definition:
Four Freedoms for Research
- The freedom to run your research anywhere — your machine, your terms.
- The freedom to study how every step works — from raw data to final manuscript.
- The freedom to redistribute your workflows, not just your papers.
- The freedom to modify any module and share improvements with the community.
AGPL-3.0 — because we believe research infrastructure deserves the same freedoms as the software it runs on.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file scitex_notification-0.2.0.tar.gz.
File metadata
- Download URL: scitex_notification-0.2.0.tar.gz
- Upload date:
- Size: 56.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba64175f410ef23dae32a043e553d8963745010f36065308d0391322c57c2797
|
|
| MD5 |
f54e494d4e04453f10d02cca41b30d65
|
|
| BLAKE2b-256 |
a8d408214dc120e04a29812ebcea8b55ee46235b9aff1515c1775405199d58cb
|
Provenance
The following attestation bundles were made for scitex_notification-0.2.0.tar.gz:
Publisher:
publish-pypi.yml on ywatanabe1989/scitex-notification
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scitex_notification-0.2.0.tar.gz -
Subject digest:
ba64175f410ef23dae32a043e553d8963745010f36065308d0391322c57c2797 - Sigstore transparency entry: 1338813106
- Sigstore integration time:
-
Permalink:
ywatanabe1989/scitex-notification@314dac13fabb1cf89fb884f979d158ad3b6dcb36 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/ywatanabe1989
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@314dac13fabb1cf89fb884f979d158ad3b6dcb36 -
Trigger Event:
push
-
Statement type:
File details
Details for the file scitex_notification-0.2.0-py3-none-any.whl.
File metadata
- Download URL: scitex_notification-0.2.0-py3-none-any.whl
- Upload date:
- Size: 59.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a0da15086d1f630592ac3ae2ccbccef7ae6a79fd58d9879e06179239aad61e73
|
|
| MD5 |
b4d9923be524d395171386369d88ad0a
|
|
| BLAKE2b-256 |
24171ad74b2f6efc3ee134cb4169d53679a5f5aaddffc602b95ca9f9e65b9881
|
Provenance
The following attestation bundles were made for scitex_notification-0.2.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on ywatanabe1989/scitex-notification
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scitex_notification-0.2.0-py3-none-any.whl -
Subject digest:
a0da15086d1f630592ac3ae2ccbccef7ae6a79fd58d9879e06179239aad61e73 - Sigstore transparency entry: 1338813109
- Sigstore integration time:
-
Permalink:
ywatanabe1989/scitex-notification@314dac13fabb1cf89fb884f979d158ad3b6dcb36 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/ywatanabe1989
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@314dac13fabb1cf89fb884f979d158ad3b6dcb36 -
Trigger Event:
push
-
Statement type: