An alert pipeline fails silently by nature: the scan matched but the alert was suppressed, or the alert fired but one destination rejected it, and both look identical from the outside, which is no notification. Here the suppression has its own explanation call, and a relay event carries a per-route status with a stored payload and a single-route replay. That is a system built by someone who has debugged one of these at two in the morning. describe_indicators is the other considered piece — a scan is a CEL expression, and exposing the variables, guards and ranges as a tool means the agent can write a valid one instead of guessing at syntax and getting an empty result set that reads like a market with no matches.
A market-scanning and alert-routing client with two halves: scans that evaluate indicator expressions against tracked symbols, and a TradingView relay that takes inbound webhooks and fans them out to Telegram, Discord, email or a webhook of your own.
- Scans as saved objects — list, fetch, create, replace — plus run_scan to execute one now and return matching symbols with their indicator values.
- run_ad_hoc_scan executes a one-off without creating or touching a saved scan, so experimenting does not leave residue.
- describe_indicators returns the CEL variables, guards, ranges and example expressions a scan can be written against, which is what makes the expression language usable without leaving the client.
- Alert events list and open individually, and explain_alert_event says why one triggered or was suppressed — the suppression case being the one that is otherwise invisible.
- get_market_data returns live price, indicators and metadata for one or more symbols, and list_symbols filters by exchange, contract type or search.
- The relay: create a source and get back its webhook URL, secret and TradingView-ready configuration; add destinations for Telegram, webhook, Discord or email; and list inbound events with per-route status.
- get_relay_trace returns one event's full lifecycle including the stored payload, and replay_relay_event re-sends a single failed route rather than the whole event.
TICKORY_API_BASE_URL and TICKORY_API_KEY. Scans and alert events are scoped to the key's owner, so what is visible depends on which key is loaded.
One command plus a key — npx @tickory/mcp, then supply credentials
