unclestock-mcp
The UncleStock MCP server lets AI assistants query Uncle Stock's fundamental stock screener directly in conversation.
От сообщества: Добавлен пользователем или импортирован; проверьте владельца перед подключениемРаботаетБез входаГлобальныйБесплатноТолько чтение
Что умеет
- Find Metric: Search for UncleStock financial metrics by keyword. Returns matching metrics with their technical IDs (e.g. 'id_391-4'), names, descriptions, and scale data (min/max/good/bad thresholds,
- Search Stocks: Screen stocks using the UncleStock fundamental screener. Returns stocks matching the filters, sorted by the given criteria. IMPORTANT: Before constructing custom filters, review these r
- Get Universes: Get valid enum values for geography and industry filters used in search_stocks. Returns objects with 'class' (filter type), 'label' (human-readable name), and 'enumValue' (use this valu
Какие данные видит
Нужен ли аккаунт
Не нужен: сервер работает без входа
The UncleStock MCP server lets AI assistants query Uncle Stock's fundamental stock screener directly in conversation. Ask an AI to find undervalued stocks, compare quality scores, or screen by any of Uncle Stock's 1,800+ metrics without leaving your chat.
Список инструментов сервера (3)
Технические названия из tools/list. Нужны только разработчикам.
| find_metric | Search for UncleStock financial metrics by keyword. Returns matching metrics with their technical IDs (e.g. 'id_391-4'), names, descriptions, and scale data (min/max/good/bad thresholds, whether smaller values are better). Always call this tool FIRST before search_stocks whenever you need a specific metric — you must know the metric ID before you can filter, sort, or request it. Each metric may have multiple submetric variants (e.g. current value, averages, CAGR). The field 'isPrimary: true' marks the main current-value submetric — use this one for filters and sorting unless you specifically need a derived stat. QUERY TIPS: use a single term or short phrase — either the abbreviation ('ROIC') or the full name ('return on invested capital'), not both combined. Submetric labels (e.g. 'CAGR', 'growth', '5y') are also searched, so 'revenue cagr' works. Avoid descriptive filler words like 'long term' or 'ratio' that do not appear in metric or submetric names. Example: query='eps yield' returns EPS Yield metrics. IMPORTANT: Never share the technical metric ID (e.g. 'id_391-4') with the user — use only the metric name in your response. |
| search_stocks | Screen stocks using the UncleStock fundamental screener. Returns stocks matching the filters, sorted by the given criteria. IMPORTANT: Before constructing custom filters, review these recommended strategies. UncleStock has proprietary composite scores — ALWAYS prefer these over building your own metric combinations. For quality screens, ALWAYS use 'Quality score' (id_76-27). For value screens, ALWAYS use 'Value score' (id_71-27). For combined quality+value screens, use both. Only build custom metric combinations when these scores don't cover the user's specific needs. Use find_metric to look up metric IDs by the names below, then apply as filters. Combine multiple strategies for better results. VALUE: Undervalued stocks (not a value trap) — 'Is undervalued.boolean' (id_497-245) >= 1 and 'Trap score.Numerical score' (id_496-35) < 6. Discount to intrinsic value — 'P/ IV.P/val' (id_46-20) < 1. Discount to book value — 'P/BV.P/val' (id_208-20) < 1. Good earnings yield — 'Earnings yield' (id_61-22) > '10%'. Cash generation for the shareholder — 'OE Yield' (id_431-22) > '10%'. Cash generation relative to market value — 'FCFF yield' (id_67-22) > '10%'. High income relative to market value — 'OI yield' (id_154-22) > '16%'. Good dividends or buybacks — 'Net Payout Yield' (id_331-22) > '5%'. Good dividend yield ≥ 4% — 'Dividend yield' (id_63-22) > '4%'. QUALITY: Quality companies — 'Quality score' (id_76-27) > 0.65 (0-1 scale). Growth — 'Revenue.15y rCAGR' (id_25-16) > '10%'. Good historical return of value — 'Net Owner return.5y CAGR' (id_316-94) > '5%'. Good return on investment — 'CROIC' (id_58-52) > '15%'. Good operating margin — 'EBIT margin' (id_113-51) > '15%'. Low bankruptcy probability — 'Ohlson O-Score.prob %' (id_175-93) < '10%'. Not too much debt — 'Debt ratio' (id_43-51) < 0.7. Can pay short-term obligations — 'Current ratio.ratio' (id_42-25) > 3. Improving financials — 'Piotroski score.Numerical score' (id_75-35) > 5. Cash rich — 'Net cash.amount' (id_168-4) > 0. RISK: Less volatile than market — 'Beta.Beta' (id_390-60) < 1. Low volatility — 'Price.SD 252d ann' (id_3-283) < '32%'. Enough volume — 'Dollar volume.dollar volume' (id_376-87) >= 1000000 (use 'must' for US; 'should' or lower threshold for Europe/other markets). MANIPULATION / INSIDER RISK: Earnings manipulation check — 'Beneish M-Score' (id_174-X): find via find_metric. IMPORTANT: Beneish M-Score is a sparse metric (not computed for all stocks). NEVER use it as a 'must' filter — it will eliminate most stocks even if they are clean. Instead, use it ONLY as extra_metric to inspect after filtering, or as a soft 'should' clause. M-Score < -1.78 suggests low manipulation risk. Insider ownership and insider buying signals are better manipulation proxies — use find_metric to locate them. MOMENTUM: Strong momentum — 'Price.12-1 change' (id_3-284) > '20%'. Good historical return — 'Ann. Total Return.1y growth' (id_307-15) > '10%'. Near one year bottom — 'Change vs bottom.diff vs 52 wk low' (id_388-72) < '10%'. FILTER STRATEGY — READ CAREFULLY: Use 'must' only for the 2-3 most critical filters. Use 'should' for desirable but non-essential criteria — stocks still appear but rank higher when they match. IMPORTANT: 'should' only works as intended when there are at least 3 'should' clauses. With fewer than 3, 'should' behaves like 'must' and will eliminate stocks that don't match. So either use 3+ 'should' filters together, or move secondary criteria to extra_metrics for manual review instead. Stacking more than 3 strict 'must' filters together with geography AND industry constraints often produces zero results. The Quality score (id_76-27) already encapsulates profitability, balance sheet strength, and consistency — do NOT also add Piotroski as a 'must' filter alongside it; they are redundant and together too restrictive. Choose one or use one as 'should' (only if you have 3+ 'should' filters total). When results are 0 or very few: relax the most specific filter first (lower score thresholds, widen geography, or change 'must' to 'should'). Do NOT retry with the same filters. TOOL USAGE: NEVER mention technical metric IDs (e.g. id_25-16, id_391-4) to the user in any message — they are internal implementation details and meaningless to the user. Always refer to metrics by their human-readable name (e.g. 'Market cap', 'Dividend yield'). This applies even when confirming which metric you found or are using. UNITS: Percentage metrics (yield, margin, ratio) appear in results as '8%' strings — copy them directly into filter values (the backend auto-converts '8%' to 0.08). Examples: result shows '4%' dividend yield → filter value '4%' or 0.04; result shows '10%' earnings yield → filter value '10%' or 0.10. Integer scores like Piotroski use the integer directly. Money metrics are full USD for ALL stocks regardless of home currency or listing exchange — non-US stocks are converted to USD. Filter accepts '200M', '10B', '1K' shortcuts or the full number (preferred — avoids mental conversion). Scale reference: $200M small-cap = 200000000, $500M mid-cap = 500000000, $5B large-cap = 5000000000, Apple ~$3.78T = 3780000000000. Results include 'market_cap_usd' and 'enterprise_value_usd' fields (the _usd suffix confirms the unit — values are NOT in thousands or local currency). A market_cap_usd of 1524 means $1,524 (zombie stock) — use the dollar volume filter to exclude them. ALWAYS add a 'Dollar volume' filter (id_376-87) to every screen. For US use >= 1000000 (must). For Europe/other use >= 100000 (must) or >= 1000000 (should). Never omit it. Always call find_metric first to get the metric ID before using it in filters/sort/extra_metrics. When the user asks for 'highest' or 'lowest' of a metric, include that metric in 'sort' (desc for highest, asc for lowest). Metrics used in 'filters' or 'sort' are automatically included as columns in the results — no need to repeat them in 'extra_metrics'. ONE SEARCH PER FILTER VARIANT: Never split a screen into multiple parallel searches just to cover multiple countries or sectors. A single search_stocks call handles all of them at once via 'in' lists. Example: user wants USA, Canada, Australia, England → ONE call: country in=['USA','CANADA','AUSTRALIA','UNITEDKINGDOM']. Sector or industry_group lists work the same way. The only valid reason to run a second search is when a fundamentally different filter set is required (e.g. Europe needs a dividend filter that other regions do not). If 0 results, relax one filter and retry; if still 0, report to the user. The response always includes total_matches — the number of stocks that passed all filters before the result limit was applied. Always show this to the user. FOLLOW-UP REQUESTS: If the user asks for 'more results', 'show me more', 'next 10', or similar, re-run the exact same search_stocks call with a higher max_results value (add 10 to the previous max_results). Never ask the user to repeat their criteria — you have the full conversation history. If the user asks to 'refine' or 'narrow down', adjust the filters instead of increasing max_results. GEOGRAPHY & FOREIGN STOCKS: The geography filter (country/continent) refers to the stock's trading market, not the company's home country. When screening by region (e.g. 'find stocks in Europe'), ALWAYS set is_foreign=false to exclude foreign companies cross-listed on local exchanges. This ensures results match the requested market. When searching for a specific stock by name or ticker, omit the is_foreign field entirely — this allows the search to return the stock regardless of whether it's domestic or cross-listed. To find stocks from a specific country (e.g. French stocks), use geography with country filter (e.g. country in=['FRANCE']). To exclude countries or continents, use 'not_in' instead of 'in' (e.g. continent not_in=['ASIA','AFRICA']). To filter by country or continent, always use the 'geography' filter (not free text) — it is precise and reliable. Continent and country enum values are listed in the geography schema; use get_universes for exchanges, industry groups, and industries. IMPORTANT: If an enum value is not recognised (wrong spelling or case), it is silently ignored — always check the 'warnings' array in the response. INDUSTRY FILTERING: Always call get_universes first to find the correct industry or industry_group enum value before using the industry filter. IMPORTANT: The sector, industry_group, and industry fields in results are human-readable labels (e.g. 'Construction and Materials'), NOT enum values. Do not derive filter enum values from result labels — always use get_universes. Exception: results include 'sector_enum' and 'industry_group_enum' fields with the ready-to-use enum values (e.g. 'INDUSTRIALGOODS', 'CONSTRUCTIONMATERIALS') — you can reuse these directly in filters without calling get_universes. Use 'not_in' to exclude sectors (e.g. sector not_in=['FINANCIAL','REALESTATE']). Never guess industry enum values — they must match exactly. If the industry is not found in get_universes (e.g. 'quantum computing'), use text='summary:quantum computing' instead to search business descriptions. TOTAL MATCHES: The response includes a 'total_matches' field showing the total number of stocks that matched all filters before the max_results limit was applied. ALWAYS mention this number to the user in your response. Format: 'Screened [total_matches] stocks — showing top [n] results.' Example: 'Screened 4,865 stocks globally — showing top 10 results.' This communicates the depth of the database to the user. |
| get_universes | Get valid enum values for geography and industry filters used in search_stocks. Returns objects with 'class' (filter type), 'label' (human-readable name), and 'enumValue' (use this value in search_stocks geography/industry 'in'/'not_in' arrays). Filter by 'type' parameter to reduce output size. |