Screen stocks using EODHD screener based on these criteria: $ARGUMENTS
Translate the user's criteria into EODHD screener filters.
Filter format (critical): filters is a JSON array of [field, operation, value] triples, NOT
dot-notation and NOT a JSON object. A JSON object is rejected with HTTP 422 ("must be an array").
Operations: =, !=, >, >=, <, <=, match.
Sort format: --sort field.direction, e.g. market_capitalization.desc or pe.asc. A bare field name
(or a separate order flag) is rejected with HTTP 422 ("sort.0.direction is required").
Currency caveat (important): absolute-money fields — market_capitalization, revenue, ebitda — are
reported in each listing's local currency, not normalized to USD. So a raw threshold leaks huge non-USD
companies (e.g. a Vietnam-listed firm shows "3.88T" ₫ ≈ $150M but passes a >= 10B filter). Each result row
carries a currency_symbol field telling you the currency. Therefore:
- When filtering/sorting by an absolute-money field, scope to one market — add
["exchange","=","us"]
(or the user's intended exchange) so the threshold is currency-consistent.
- For multi-market screens, you cannot compare raw caps across rows — group/label by
currency_symbol.
- Ratio/percent fields (
pe, pb, ps, peg, roe, roa, beta, dividend_yield) are currency-independent and safe to compare across markets.
Instrument-type noise (important — the screener has NO type filter): there is no field to restrict
results to common stock. Passing ["type", ...] is rejected with HTTP 422 (filters.0.field is invalid).
Two kinds of junk leak into unscoped screens, especially dividend screens:
- OTC / foreign cross-listings — the combined
["exchange","=","us"] virtual exchange includes OTC
grey-market listings (codes ending in F/Y, e.g. TCANF, RNECF) with broken dividend_yield
(55–110%). Scope to a real venue instead — ["exchange","=","nyse"] or ["exchange","=","nasdaq"]
— to drop them. (us is still fine when you only need currency consistency, not clean common stock.)
- Preferred shares / baby bonds — these list on NYSE/NASDAQ too, carry a
- in code
(e.g. JPM-PD, DLR-PJ) and a coupon rate in name, and dominate high-yield screens. The API can't
filter them, so post-filter the results: for a common-stock screen, drop rows whose code contains -.
- Sanity-cap broken yields — for any dividend screen add
["dividend_yield","<=",0.25] (no real common
stock yields >25%) to discard rows with corrupt data.
Common mappings (note: dividend_yield is a fraction — 0.03 = 3%):
- "large cap" →
["market_capitalization",">=",10000000000]
- "mid cap" →
["market_capitalization",">=",2000000000],["market_capitalization","<=",10000000000]
- "small cap" →
["market_capitalization","<=",2000000000]
- "high dividend" →
["dividend_yield",">=",0.03],["dividend_yield","<=",0.25] (upper cap drops broken-data OTC/preferred rows)
- "low P/E" or "cheap" →
["pe",">",0],["pe","<",15] + --sort pe.asc
- "tech" →
["sector","=","Technology"]
- "healthcare" →
["sector","=","Healthcare"]
- US stocks →
["exchange","=","nyse"] or ["exchange","=","nasdaq"] for clean common stock (avoids OTC junk); use ["exchange","=","us"] only when you need currency consistency, not a clean instrument set
- Sector names, industry names, exchange codes as additional
[field,"=",value] triples
Example: "high dividend large cap (US)" →
--filters '[["dividend_yield",">=",0.03],["dividend_yield","<=",0.25],["market_capitalization",">=",10000000000],["exchange","=","nyse"]]' --sort dividend_yield.desc
(then drop result rows whose code contains - — those are preferred shares, not common stock)
Use the stock-screener skill workflow:
- Run screener with translated filters (limit 20)
- Unless the user explicitly wants preferred shares/ETFs, drop result rows whose
code contains -
(preferred shares) before presenting — the API has no instrument-type filter to do this server-side
- For top 5-10 results, fetch fundamentals for deeper detail
- Fetch recent price data for performance context
Present:
- Filters Applied — show the JSON filter used
- Results Table — ticker, name, sector, market cap (with its
currency_symbol), P/E, dividend yield, price, 30d change. Show the currency next to any cap/revenue figure; never present a non-USD cap as if it were USD.
- Top 5 Deep Dive — expanded valuation and growth metrics for best matches
- Summary — key themes and patterns in results
If criteria are vague, ask for clarification or suggest reasonable defaults.
Include disclaimer: "This is not financial advice. Data is for informational purposes only."
1---2name: eodhd-screen3description: Screen stocks by fundamental and technical criteria using the EODHD screener — market cap, P/E, dividend yield, sector, exchange, and signals, with currency- aware thresholds. Invoke as /eodhd-screen <criteria>.4---56Screen stocks using EODHD screener based on these criteria: $ARGUMENTS78Translate the user's criteria into EODHD screener filters.910**Filter format (critical):** `filters` is a **JSON array of `[field, operation, value]` triples**, NOT11dot-notation and NOT a JSON object. A JSON object is rejected with HTTP 422 ("must be an array").12Operations: `=`, `!=`, `>`, `>=`, `<`, `<=`, `match`.1314**Sort format:** `--sort field.direction`, e.g. `market_capitalization.desc` or `pe.asc`. A bare field name15(or a separate order flag) is rejected with HTTP 422 ("sort.0.direction is required").1617**Currency caveat (important):** absolute-money fields — `market_capitalization`, `revenue`, `ebitda` — are18reported in each listing's **local currency**, not normalized to USD. So a raw threshold leaks huge non-USD19companies (e.g. a Vietnam-listed firm shows "3.88T" ₫ ≈ $150M but passes a `>= 10B` filter). Each result row20carries a `currency_symbol` field telling you the currency. Therefore:21- When filtering/sorting by an absolute-money field, **scope to one market** — add `["exchange","=","us"]`22 (or the user's intended exchange) so the threshold is currency-consistent.23- For multi-market screens, you cannot compare raw caps across rows — group/label by `currency_symbol`.24- Ratio/percent fields (`pe`, `pb`, `ps`, `peg`, `roe`, `roa`, `beta`, `dividend_yield`) are currency-independent and safe to compare across markets.2526**Instrument-type noise (important — the screener has NO `type` filter):** there is no field to restrict27results to common stock. Passing `["type", ...]` is rejected with HTTP 422 (`filters.0.field is invalid`).28Two kinds of junk leak into unscoped screens, especially dividend screens:29- **OTC / foreign cross-listings** — the combined `["exchange","=","us"]` virtual exchange *includes* OTC30 grey-market listings (codes ending in `F`/`Y`, e.g. `TCANF`, `RNECF`) with broken `dividend_yield`31 (55–110%). **Scope to a real venue instead** — `["exchange","=","nyse"]` or `["exchange","=","nasdaq"]`32 — to drop them. (`us` is still fine when you only need currency consistency, not clean common stock.)33- **Preferred shares / baby bonds** — these list on NYSE/NASDAQ too, carry a `-` in `code`34 (e.g. `JPM-PD`, `DLR-PJ`) and a coupon rate in `name`, and dominate high-yield screens. The API can't35 filter them, so **post-filter the results**: for a common-stock screen, drop rows whose `code` contains `-`.36- **Sanity-cap broken yields** — for any dividend screen add `["dividend_yield","<=",0.25]` (no real common37 stock yields >25%) to discard rows with corrupt data.3839Common mappings (note: `dividend_yield` is a **fraction** — 0.03 = 3%):40- "large cap" → `["market_capitalization",">=",10000000000]`41- "mid cap" → `["market_capitalization",">=",2000000000],["market_capitalization","<=",10000000000]`42- "small cap" → `["market_capitalization","<=",2000000000]`43- "high dividend" → `["dividend_yield",">=",0.03],["dividend_yield","<=",0.25]` (upper cap drops broken-data OTC/preferred rows)44- "low P/E" or "cheap" → `["pe",">",0],["pe","<",15]` + `--sort pe.asc`45- "tech" → `["sector","=","Technology"]`46- "healthcare" → `["sector","=","Healthcare"]`47- US stocks → `["exchange","=","nyse"]` or `["exchange","=","nasdaq"]` for clean common stock (avoids OTC junk); use `["exchange","=","us"]` only when you need currency consistency, not a clean instrument set48- Sector names, industry names, exchange codes as additional `[field,"=",value]` triples4950Example: "high dividend large cap (US)" →51`--filters '[["dividend_yield",">=",0.03],["dividend_yield","<=",0.25],["market_capitalization",">=",10000000000],["exchange","=","nyse"]]' --sort dividend_yield.desc`52(then drop result rows whose `code` contains `-` — those are preferred shares, not common stock)5354Use the `stock-screener` skill workflow:551. Run screener with translated filters (limit 20)562. Unless the user explicitly wants preferred shares/ETFs, drop result rows whose `code` contains `-`57 (preferred shares) before presenting — the API has no instrument-type filter to do this server-side583. For top 5-10 results, fetch fundamentals for deeper detail594. Fetch recent price data for performance context6061Present:62- **Filters Applied** — show the JSON filter used63- **Results Table** — ticker, name, sector, market cap (with its `currency_symbol`), P/E, dividend yield, price, 30d change. Show the currency next to any cap/revenue figure; never present a non-USD cap as if it were USD.64- **Top 5 Deep Dive** — expanded valuation and growth metrics for best matches65- **Summary** — key themes and patterns in results6667If criteria are vague, ask for clarification or suggest reasonable defaults.6869Include disclaimer: "This is not financial advice. Data is for informational purposes only."