thndr-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| THNDR_LANGUAGE | No | `en` or `ar` for localized fields | en |
| THNDR_LOG_LEVEL | No | `debug`, `info`, `warn`, `error`, `silent` (logs go to stderr) | info |
| THNDR_USER_AGENT | No | User agent of HTTP requests to Thndr | Chrome-like |
| THNDR_DEVICE_NAME | No | Device name in the login approval link (shown as a QR code; keep it short) | thndr-mcp |
| THNDR_API_BASE_URL | No | API endpoint | https://prod.thndr.app |
| THNDR_SESSION_FILE | No | Where credentials are stored | ~/.config/thndr-mcp/session.json |
| THNDR_WEB_BASE_URL | No | API endpoint | https://x.thndr.app/api |
| THNDR_RUNTIME_VERSION | No | Override the `x-thndrx-runtime-version` header | bundled |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| auth_statusA | Shows whether the server is logged in to Thndr, when the session expires, and which login step is pending. Call this first if another tool returns NOT_AUTHENTICATED or SESSION_EXPIRED. |
| login_startA | Step 1 of 3. Sends a 6-digit verification code to the email address of the Thndr account. Ask the user for their Thndr email if you do not know it. Next: login_verify_code. |
| login_verify_codeA | Step 2 of 3. Verifies the emailed code and creates a login request that the user must approve in the Thndr mobile app. Show the user the returned message (and deep link). Next: login_complete. |
| login_request_approvalA | Creates a new login request for an already identified user (no email code needed). Use it when the session expired (SESSION_EXPIRED). The user approves it in the Thndr mobile app. Next: login_complete. |
| login_completeA | Step 3 of 3. Waits (up to timeoutSeconds) for the user to approve the login in the Thndr mobile app, then stores the session. If it returns authenticated=false with status pending, call it again after the user approves. |
| login_import_sessionA | Fallback login for accounts that use Google/Apple sign-in: the user logs in at https://x.thndr.app in a browser and pastes the Cookie request header of any x.thndr.app/api request (DevTools → Network). |
| logoutA | Ends the Thndr session and deletes stored tokens. With forgetIdentity=true also signs out of Firebase. |
| search_instrumentsA | All markets: search stocks, ETFs, funds and indices by ticker or company name (English or Arabic). Returns tickers and Thndr asset ids. Call this first when you only know a company name. |
| get_instrument_detailsA | All markets: company profile and listing details for one instrument — name, sector (industry), board, currency, tradability, suspension, description and Thndr's tags (e.g. sector, "EGX30 Index", "Same Day Tradable", "Tech"). Egypt only: the indices it belongs to (EGX30, SHARIAH…); |
| get_price_snapshotA | All markets: current quote for up to 50 instruments. Egypt: last price, change, open/high/low, bid/ask, volume, value, daily price limits, 52-week range, P/E, EPS, dividend yield and market cap. US, UAE and other instruments: last, open, previous close, change, change %, bid/ask when known and the price time; other fields null. Asset ids of different markets may be mixed. |
| get_price_historyA | All markets. Egypt: historical OHLCV candles ( |
| get_market_depthB | Egypt only: order book (bids and asks aggregated by price level with order counts) and the bid/ask spread. |
| get_recent_tradesA | Egypt only: latest executed trades for an instrument. Use |
| get_market_statusA | Egypt, US and UAE (not the simulator): whether the market is open now, today's session open/close times and the market's main indices and benchmarks as Thndr shows them (Egypt: EGX30, EGX70…; US: SPY, QQQ, DIA…; UAE: FADGI…). Regular sessions: EGX Sunday–Thursday 10:00–14:30 Africa/Cairo; US 09:30–16:00 America/New_York. |
| screen_marketA | Egypt only: filter and rank every instrument of the market using the live snapshot — e.g. top gainers (sortBy=changePercent), top losers (order=asc), most active (sortBy=value), unusual volume (minRelativeVolume=200), value stocks (maxPeRatio, minDividendYield), a sector, the members of an index (index=EGX30), one of ThndrX's built-in screeners (preset=momentum-movers, breakout-radar, value-yield, steady-performers, reversal-watch) or one of the user's saved screeners (screenerId, see get_screeners). All given filters apply together. Index rows are never returned. |
| get_screenersA | Egypt (screen_market runs only on Egypt's snapshot): the user's saved Thndr screeners and ThndrX's built-in presets, each with its id, name and filters in plain words. Run one with screen_market (screenerId or preset). |
| get_index_constituentsA | Egypt only. Without |
| get_peersA | All markets: Thndr's "similar stocks" for one stock, each with last price and change %. Egypt also gives the largest other instruments of the same sector (by market cap) and, for every peer, traded value, market cap, P/E and dividend yield; elsewhere |
| get_price_performanceA | All markets: trailing performance of one instrument — returns over 1W, 1M, 3M, 6M, YTD, 1Y, 3Y and 5Y, annualised historical volatility (30-day, 90-day, 1-year), the 52-week high/low, the 1-year maximum drawdown, and Thndr’s own one-year return. Egypt: from daily candles. US, UAE and others: from Thndr’s closing prices (daily recent closes, weekly older ones; the 52-week range is of closes) — see |
| get_financialsA | Egypt only: financial statements and ratios of a listed company from Thndr (balance sheet, income statement, cash flow, profitability, leverage, growth, per-share data) by period, with each metric’s latest value. |
| get_newsA | All markets: news and exchange disclosures from Thndr’s feed, newest first, for one instrument (UAE instruments may have none). Without |
| get_economic_indicatorsA | Egypt only: macroeconomic data as Thndr shows it: headline readings (inflation, CBE deposit/lending rates, 12-month T-bill yield, unemployment, GDP) and the latest points of the inflation (monthly and yearly), CBE overnight rates, treasury-bill returns and quarterly unemployment series, with Thndr’s source descriptions. |
| get_marketsA | The Thndr markets this account can use (egypt, us, uae, simulator), the default one and any restriction, with each market’s exchange, currency and time zone and which thndr-mcp features work there (e.g. order book, candles and financials are Egypt-only; movers are Egypt and US). Call it to learn where a tool applies. |
| get_market_moversA | Thndr’s top gainers and/or losers of a market over a period (1D, 1W, 1M, 6M, 1Y), ranked by return, with each instrument’s price and today’s change. Egypt and US only. US lists can include instruments Thndr does not let you trade ( |
| get_trendingA | The instruments trending on Thndr in a market (Egypt, US or UAE), most trending first, as the app’s Explore tab shows them: ticker, name, asset class and sector. Use get_price_snapshot for their prices. |
| get_tagsA | Thndr’s tags (the app calls them themes) for a market: curated groups such as "Sharia", "Gold Funds" or "Dividend Players", with what each is about and how many instruments it has. List a tag’s instruments with get_tag_instruments; get_instrument_details shows the tags of one instrument. Egypt and US. |
| get_tag_instrumentsA | The instruments of one Thndr tag (theme) in a market — e.g. every Sharia-compliant EGX stock or Thndr’s gold funds — with price and today’s change, paged. Give the tag’s id, slug or name (see get_tags). Egypt and US. |
| get_dividendsA | An instrument’s dividends as Thndr records them, newest first: cash (amount per share) or stock (bonus shares per share), record date, payment dates, currency and status (upcoming, ongoing, past). Any market; an empty list means Thndr records none for it. |
| get_account_summaryA | Cash and value of the Thndr account: buying power, blocked cash (reserved by open buy orders), unsettled cash, available cash, portfolio market value, total return and total account value. |
| get_account_positionsC | All holdings with quantity, average cost, market price and value, unrealized P/L, portfolio weight and allocation by asset class. |
| get_positionA | The holding in one instrument (or held=false). With includeSellable=true also returns how many shares can be sold now per settlement cycle (T0, T1, T+2). |
| get_account_ordersB | Order history and status (open, completed, cancelled, closed): side, type, quantity, filled quantity, price, validity, brackets. Read-only — this server cannot place, change or cancel orders. |
| get_realized_returnsB | Thndr's cumulative return to date (its "realized returns": account value minus net deposits, unrealized gains included) plus a series of account value, net deposits and returns over 1M, 6M, 1Y or 2Y. |
| get_closed_tradesB | Trading journal of round trips: entry/exit dates and prices, volume, net P/L and holding period. |
| get_sell_journalC | Each sell execution with exit price, volume, average entry price and net P/L. |
| get_trading_metricsC | Performance statistics: total return, win rate, profit factor, expectancy, average win/loss, risk/reward, average holding period, and per-instrument stats. |
| get_account_activityA | Cash ledger: deposits, withdrawals, order settlements, dividends, fees and transfers. Without a date range it returns one page; with from/to or a period preset it returns every entry in the range (newest first, up to 2000 scanned; truncated=true when the cap was hit). |
| get_portfolio_allocationB | All markets: holdings weighted by market value and grouped by asset class and by sector ("Unclassified" or "Funds (no sector)" when Thndr gives none). Egypt (and the simulator, through Egypt's data): sectors from the market snapshot and buckets by index membership (EGX30, EGX70 EWI, Shariah…; they overlap and do not sum to 100%). US and UAE: sectors from instrument details (at most 30 holdings, heaviest first) and no index buckets. |
| get_portfolio_performanceA | Portfolio performance for 1D, 7D, MTD, 1M, 6M, YTD, 1Y and 2Y from Thndr's returns chart: start/end value, value change, net deposits change, gain excluding deposits, time-weighted return %, change of Thndr’s total returns, the dates and series granularity (daily/weekly) used, and whether the period is only partly covered. |
| get_savingsA | Thndr savings ("Clouds"): total amount and gain, each savings bundle (type, amount, gains, withdrawable amount), amounts per product type, and the current yield of each product (currently earning %, nominal yields by frequency). Read-only — this server cannot move money into or out of savings. |
| get_watchlistsB | All custom watchlists of the Thndr account with their instruments (tickers and asset ids). |
| get_watchlistB | One watchlist by id with its instruments. |
| create_watchlistA | Creates a watchlist, optionally pre-filled with instruments (tickers or asset ids). Returns the new id; read the list with get_watchlist. |
| edit_watchlistA | Renames a watchlist and/or adds and removes instruments in one call. Returns what changed; read the list with get_watchlist. |
| delete_watchlistB | Deletes a watchlist permanently. |
| get_alertsB | Price alerts of the account, optionally only for one instrument. Paged. |
| get_alertC | One price alert by id. |
| create_alertA | Creates a price alert that notifies the user in the Thndr app when the instrument crosses |
| update_alertA | Changes an alert's price, direction or frequency. Thndr has no in-place edit, so the alert is replaced and gets a new id (returned together with previousId). |
| delete_alertC | Deletes a price alert. |
| get_notificationsB | In-app notifications from Thndr (order fills, rejections, triggered price alerts…), newest first. |
| mark_notifications_readA | Marks the given notification ids as read, or all of them with all=true. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 52 tools
Most tools target distinct resources, but several clusters overlap: get_watchlist vs get_watchlists, get_alert vs get_alerts, get_index_constituents vs screen_market's index filter, and get_market_movers vs screen_market's top-gainer mode. The detailed descriptions help an agent recover, but the set still requires careful reading to avoid misselection.
The set is predominantly snake_case with a predictable verb_noun or get_/create_/update_/delete_ prefix pattern. A few outliers like auth_status (noun-only) and logout (verb-only) are minor deviations rather than a broken convention.
With 52 tools this server is far beyond the typical well-scoped 3-15 range and exceeds even the '25+ too many' threshold. Although many tools serve real subdomains, the sheer surface size creates an extreme mismatch for an agent to navigate.
Read-side coverage is broad and CRUD is complete for watchlists and alerts, with full auth and account analysis. However, the surface has notable gaps for a trading integration: no order placement/change/cancel and no savings transfers, both explicitly excluded as read-only.