Skip to main content

signal-scanner — rule-based stock/crypto screener with alerts

signal-scanner MCP server

License: MIT Python MCP

signal-scanner - live scan demo

Define a watchlist and a ruleset (plain YAML); the scanner pulls market data, computes indicators, and tells you which symbols match — on the console, in Telegram, or from any MCP host (Claude Desktop / Claude Code).

Built once, reskinned per client: swap watchlist.txt + rules.yaml, ship.

Why it's different

  • Keyless by default. Market data via yfinance — no API key. Works for stocks, ETFs, FX (EURUSD=X) and crypto (BTC-USD). Demo it anywhere.
  • No-code rules. Clients edit rules.yaml (conditions on indicators) — never the code.
  • Honest signals. Indicators are computed from closed bars (no look-ahead); a symbol with no data is reported, never faked.
  • Delivery that degrades. Telegram alerts when a bot token is set; otherwise prints to console. The scanner always runs.
  • Three surfaces, one engine. CLI (one-shot or --watch), Telegram push, and an MCP scan tool.

Indicators & rules

Indicators per symbol: price, pct_change, rsi, sma_fast, sma_slow, sma_cross (golden/death), vol_ratio (vs 20-day avg), pct_from_52w_high, pct_from_52w_low.

A rule fires when all its conditions are true:

rules:
  - name: oversold
    when:
      - {indicator: rsi, op: "<", value: 30}
  - name: volume_spike_up
    when:
      - {indicator: vol_ratio, op: ">", value: 2.0}
      - {indicator: pct_change, op: ">", value: 1.0}

Quickstart

pip install -r requirements.txt
PYTHONUTF8=1 python tests/test_smoke.py     # deterministic, no network — proves the engine

python -m signal_scanner                    # scan the watchlist once, print matches
python -m signal_scanner AAPL MSFT BTC-USD  # scan ad-hoc symbols
python -m signal_scanner --watch            # loop every SCAN_INTERVAL_S (default 15m)
python -m signal_scanner --notify           # also push matches to Telegram (if configured)

Telegram (optional)

Create a bot with @BotFather, get the token; get your chat id from @userinfobot. Then in .env:

TELEGRAM_BOT_TOKEN=...
TELEGRAM_CHAT_ID=...

As an MCP server (Claude Desktop)

{
  "signal-scanner": {
    "command": "python",
    "args": ["-m", "signal_scanner.server"],
    "cwd": "C:/path/to/signal-scanner"
  }
}

Use the full path to your Python (e.g. the one where you ran pip install -r requirements.txt) if python isn't on PATH. Then ask Claude: "Run my scanner" or "Any signals on NVDA and BTC-USD?" — it calls the scan tool.

Configuration

All knobs in config.py / .env (see .env.example): RSI period, SMA fast/slow, volume window, lookback, poll interval, data backend, Telegram. A client reskin is usually just watchlist.txt + rules.yaml.

Architecture

watchlist.txt ─┐
               ├─ scanner.py ─ data.py(yfinance) ─ indicators.py ─ rules.py(rules.yaml)
rules.yaml ────┘                                                         │
                                                  signals ──> console / Telegram / MCP `scan`

Reuses the mcp-factory contract (Result, formatting, cache) so it composes with the rest of the catalog.

License

MIT.

Metadata

Release files for signal-scanner 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for signal-scanner 0.1.0
File Size Uploaded Provenance
signal_scanner-0.1.0.tar.gz 15.8 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for signal-scanner 0.1.0
File Interpreter ABI Platform
signal_scanner-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 31.4 kB

Release files / signal_scanner-0.1.0.tar.gz

Download URL signal_scanner-0.1.0.tar.gz
Size 15.8 kB
Tags Source
SHA-256 checksum
How to use checksums
2d630ce18cc53d033a98d04f2c6b21850ed85c167ea40dc2b9e27b74c8c81b3e
BLAKE2b-256 checksum
How to use checksums
f0944092d4bfe88218aeca567d7bbc34f1304460f56ff1ba2e8fecd34de76dd3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.4

Release files / signal_scanner-0.1.0-py3-none-any.whl

Download URL signal_scanner-0.1.0-py3-none-any.whl
Size 15.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
02d5f9402a8aabc195faf97704626de5b9cba25ba221d088793b7cdc6d41c1e7
BLAKE2b-256 checksum
How to use checksums
139609e861e51aa93d91a4aaa32b2de14af0452f165ff1e82b883008a559ddf1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.4

Security for signal-scanner 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page