signal-scanner
Sends alerts with matched signals to a Telegram chat via a bot, when a bot token and chat ID are configured.
signal-scanner — rule-based stock/crypto screener with alerts

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 MCPscantool.
Related MCP server: StockScreen MCP Server
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.
Available Tools
1 toolscanARead-onlyIdempotent
Screen symbols against the ruleset and return which rules fired per symbol.
Examples: - "Run my scanner" -> symbols=[] - "Scan AAPL, MSFT and NVDA" -> symbols=['AAPL','MSFT','NVDA'] - "Any signals on bitcoin?" -> symbols=['BTC-USD']
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds that output is per-symbol rule firing, but does not disclose rate limits, auth requirements, or other behavioral traits beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in one sentence, followed by three targeted examples that each illustrate a distinct input pattern. There is no wasted text, and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description is nearly complete for a read-only scan tool. It omits any mention of the response_format option, though the schema enum makes that omission low-risk.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The examples add meaningful semantic guidance for populating the symbols parameter from natural language, including empty input mapping to the configured watchlist and mapping 'bitcoin' to 'BTC-USD'. The response_format parameter is not mentioned, but its enum is present in the schema, so the main semantic gap is minor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: screen symbols against a ruleset and return which rules fired per symbol. It clearly distinguishes the operation from a generic data fetch. There are no siblings to differentiate against, so 4 is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The examples demonstrate concrete usage contexts, including an empty-symbols call to use the configured watchlist and mapping a natural-language query about bitcoin to the BTC-USD symbol. They provide clear context for invocation, though they do not state when not to use the tool or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.1.0- First observed
scan
TDQS
Scored across 1 tool
There is only one tool, so there is no possibility of misselection or overlap with another operation. An agent cannot confuse 'scan' with anything else on this server.
With a single tool there is no internal inconsistency to violate, which is inherently predictable. However, 'scan' is a bare verb with no noun component, so it doesn't model the conventional verb_noun pattern.
One monolithic tool carries the entire server's surface, which is too thin for a domain that implies ruleset management and result inspection. Everything must funnel through a single overloaded entry point.
Scanning symbols is covered, but there is no way to list, create, edit, or validate the ruleset the scanner runs against, nor to retrieve or persist prior results. The core action exists, but the lifecycle around it is a dead end.
Maintenance
Related MCP Connectors
Portfolio-aware finance tools: drift, risk, earnings, benchmarks, news, tax harvesting
Screen 11,000+ stocks using natural language and detect chart patterns via MCP.
Stocks, crypto, FX, and portfolio math in one tool — no per-source API juggling.
Real-time market data, screeners, technical analysis & backtesting for stocks, crypto and forex.
Related MCP Servers
- AlicenseBqualityCmaintenanceProvides comprehensive stock screening capabilities through Yahoo Finance. Enables LLMs to screen stocks based on technical, fundamental, and options criteria, with support for watchlist management and result storage.449MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server providing comprehensive stock screening capabilities through Yahoo Finance. Enables LLMs to screen stocks based on technical, fundamental, and options criteria, with support for watchlist management and result storage.MIT
- AlicenseNot gradedqualityDmaintenanceProvides TradingView-style market analysis with OHLCV candles, 19 technical indicators, a screener, and a backtester using public Yahoo Finance data without API keys.MIT
- AlicenseAqualityBmaintenanceMCP server for TradingView's market screener API, enabling stock, forex, crypto, and ETF screening, technical analysis, and investor workflows via Claude or CLI.12335 npm53MIT