Stock Screener

io.github.xang1234Published by GitHub account xang1234v0.3.0Updated Nov 7, 2026

Daily stock screens, RS ratings, market breadth and group rankings for 12 markets. No API keys.

VerifiedSTDIODesktop onlyFinanceData & Analytics

Overview

AI-generated overview

Read-only daily stock screening data for 12 markets: preset screens, RS ratings, market breadth and industry group rankings, with no API keys.

What you can do
  • List markets and preset screens with their exact rules, and look up scan field meanings and per-market counts
  • Run preset screens or custom filters over a market's full daily scan, and get every scan field for one stock
  • Audit a watchlist or holdings against the screens, including near misses that fail one rule
  • Review market health and breadth, and rank IBD-style industry groups by relative strength
  • Check how stocks performed after newly entering a screen at a chosen holding period
When to use it
Useful when you want an assistant to screen stocks, review a watchlist against trend and growth rules, or judge market health and leading industry groups across US, Canadian, European and Asian markets. It suits end-of-day research, not intraday trading decisions.
Requirements
A local runtime with uv, which provides uvx; the package is stockscreen-mcp. No API keys or accounts. Network access is needed to download each market's published snapshot on first use (US is about 7 MB compressed). Optionally set STOCKSCREEN_DATA_URL to read from another publish.
Before you install
Data is an end-of-day snapshot published after each market's close, with nothing intraday and never fetched live from price providers; every result carries an as_of_date. It is educational screening data, not investment advice. Tools are read-only, but the command-line mode can write TradingView watchlist files to disk. Field names can mislead, so check field meanings before quoting numbers.

Installation

In SourceWeft

  1. Open Stock Screener in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

stockscreen-mcp

Daily stock screens, relative-strength ratings, market breadth and industry group rankings for 12 markets, available to Claude, Cursor, VS Code or any other MCP client.

  • No API keys and no server to run.
  • It reads the snapshot that the open-source stock-screener project publishes after every market close.
  • That's the same data as the live demo.
bash
uvx stockscreen-mcp

Markets: United States, Canada, Germany, Hong Kong, mainland China, Japan, Korea, Taiwan, India, Singapore, Malaysia and Australia.

Use it from the terminal

You don't need an AI assistant to read the screens. With uv installed:

bash
uvx stockscreen-mcp screen                                # list the screensuvx stockscreen-mcp screen minervini --market US          # today's list as a tableuvx stockscreen-mcp screen minervini --tradingview        # save a TradingView watchlist
  • --tradingview writes every match to a comma-separated file such as minervini-US-2026-11-04.txt, ignoring --limit. TradingView's watchlist import requires a comma-separated file. Pass a filename to choose the path, or - for stdout.
  • TradingView watchlists hold at most 1,000 symbols. A longer list is still written in full, with a warning on stderr.
  • Symbols are derived from the published listing data and not checked against TradingView, so a few may not import.
  • Malaysia and Beijing listings are skipped and listed on stderr, because they have no TradingView symbol this tool can derive.
  • --limit sets how many rows the table shows, and --json prints those rows as JSON.
  • The data date and any warnings go to stderr, as does the table's row count, so stdout stays clean for pipes. --json carries the count in its total field.

What you can ask

  • "Which stocks pass the Minervini trend template in the US today, and which of them are in top-20 industry groups?"
  • "Run the CANSLIM screen for Japan and show the five strongest by 3-month RS."
  • "How healthy is the US market right now? Exposure, distribution days, breadth."
  • "What are the leading industry groups this week, and which groups moved up the most?"
  • "Tell me everything the scan knows about NVDA, and which screens it passes."
  • "Find Hong Kong stocks with RS above 90, in stage 2, with quarterly EPS growth over 25%."
  • "Check my watchlist of NVDA, AMD and TSLA against the screens. Which rules does each one fail, and which are one rule away from passing?"
  • "How have stocks done 20 sessions after entering the US Minervini screen, and is the sample big enough to trust?"

Tools

All tools are read-only.

ToolWhat it returns
list_marketsMarkets in the current publish, with each one's data date, status and features
list_screensThe 28 preset screens and their exact rules: Minervini, CANSLIM, VCP, cup with handle, high tight flag, momentum, IPOs and more
describe_fieldsWhat each scan field means, its unit and any hard range, with exact counts from this market's rows: how many hold a value, how many are true on a flag, and how many hold each label. Filter with group or name fields, which also reveals internal bookkeeping fields
run_screenA preset and/or your own filters over every stock in a market's scan, sorted, with the match count. A preset returns exactly the stocks the website shows for it
get_stockOne stock: RS ratings (overall, 1M, 3M, 12M), stage, screener scores, growth, group rank, setup and pattern fields, and the screens it passes
audit_stocksA watchlist of up to 50 symbols against the preset screens: the screens each stock passes, and near misses that fail exactly one of several rules, as the field and how far short it is (the field alone when the rule is not numeric or the value is missing). detail also returns every failed rule per failing screen; responses over 80,000 characters are refused with a hint of how many symbols fit
screen_track_recordWhat happened after stocks newly entered each preset screen, for one holding period per call (5, 20 or 60 sessions): median return, median excess over the benchmark, positive rate and sample counts. Not every market publishes one
market_overviewExposure score and stance, distribution days, follow-through day, StockBee-style breadth (4% movers, 5/10-day ratios, T2108, 52-week highs/lows), key index moves, top groups
group_rankingsIBD-style industry groups ranked by relative strength, with 1W/1M/3M/6M rank changes and weekly movers. Pass a group for its rank history and strongest stocks

Reading the data

  • RS ratings (rs_rating, rs_rating_1m/3m/12m) are percentiles from 1 to 99 within the stock's own market, where 99 is the strongest.
  • Group rank 1 is the strongest group.
  • Track records have one row per screen definition and origin. Compare the rows separately and don't rank thin ones. Each result's how_to_read note explains the numbers.
  • Every result has an as_of_date: the last completed session the publish covers. This is end-of-day data with nothing intraday, and it is never fetched live from price providers.

For agents

  • Skill: the stockscreen://skill resource is an Agent Skills file teaching the tool sequence and the reading rules that prevent wrong answers.
  • Prompts: review_watchlist and find_candidates start that sequence.
  • Field dictionary: the stockscreen://fields resource holds every scan field's meaning, unit and hard range. describe_fields adds per-market counts. Without the server, read fields.json and llms.txt.

Setup

The server needs uv, which provides uvx.

Claude Code

bash
claude mcp add stockscreen -- uvx stockscreen-mcp

Claude Desktop: add to claude_desktop_config.json.

json
{  "mcpServers": {    "stockscreen": { "command": "uvx", "args": ["stockscreen-mcp"] }  }}

Cursor: add the same mcpServers entry to ~/.cursor/mcp.json.

VS Code: add to .vscode/mcp.json.

json
{  "servers": {    "stockscreen": { "type": "stdio", "command": "uvx", "args": ["stockscreen-mcp"] }  }}

Codex CLI: add to ~/.codex/config.toml.

toml
[mcp_servers.stockscreen]command = "uvx"args = ["stockscreen-mcp"]

To run the newest version from main rather than the latest release, replace stockscreen-mcp in args with --from, git+https://github.com/xang1234/stock-screener#subdirectory=stockscreen-mcp, stockscreen-mcp.

How it works

  • Data source: the server reads the JSON that the static site publishes to GitHub Pages. The root manifest.json points at the current publish.
  • Download and caching: each market's scan is downloaded once, on first use (US is about 7 MB compressed), and kept in memory. The two most recently used markets stay cached, and the cache refreshes when a new publish appears.
  • Data URL: set STOCKSCREEN_DATA_URL to read from another publish, such as a fork's GitHub Pages site.

Development

bash
cd stockscreen-mcpuv run pytest                                      # unit tests, no networkSTOCKSCREEN_LIVE=1 uv run pytest -m live           # against the real publish

Releasing

  1. Bump __version__ in src/stockscreen_mcp/__init__.py. Bump the same version in server.json (both version fields) and in mcpb/manifest.json and mcpb/pyproject.toml. tests/test_packaging.py fails if they drift.
  2. Push a stockscreen-mcp-v<version> tag. .github/workflows/stockscreen-mcp-release.yml publishes to PyPI and then to the MCP registry, through stockscreen-mcp-registry.yml with GitHub OIDC.
  3. Bundles (needs Node 20+, which the Smithery CLI requires; smithery_bundle.py checks it), built from mcpb/:
    • Claude Desktop: npx @anthropic-ai/mcpb pack . stockscreen-mcp.mcpb builds an MCPB uv bundle.
    • Smithery: its CLI can't read the uv type yet (smithery-cli#801). python smithery_bundle.py packs a copy typed python as stockscreen-mcp-smithery.mcpb.
    • Publish to Smithery: smithery mcp publish stockscreen-mcp-smithery.mcpb -n davidten7/stockscreen-mcp, using the maintainer's Smithery namespace.

License and disclaimer

Apache-2.0. This is screening data for education and research, not investment advice.

Source: stockscreen-mcp/README.md at commit 6d9b7e3

Tools

9

list_markets

List the markets that have published data, so you know which market codes the other tools accept and how fresh each one is. Call this first when the user names a country or exchange, or asks how current the data is. For one market's health, breadth and leading groups, use market_overview instead. Each market returns its code (pass it as `market` to the other tools), name, as_of_date (the trading day the data covers), status ("current"; "late" if it is behind its latest completed session or its next update is over a day overdue; or "unknown"), and features: which of "scan" (run_screen, get_stock, list_screens, audit_stocks), "breadth" (market_overview breadth), "groups" (group_rankings) and "track_record" (screen_track_record) are published for it. unavailable_markets lists markets that failed this publish. Takes no arguments. Results are cached for up to 10 minutes; markets are published after their close by two scheduled runs, one for Asia and one for US/Europe.

Takes no parameters.

list_screens

Preset screens (Minervini, CANSLIM, VCP, chart patterns, momentum...) with their exact rules. Pass a screen's id to run_screen or audit_stocks.

Parametersmarket

describe_fields

Define scan fields and count what a market's rows hold for them. Call it before quoting or filtering on a field you have not used, because names mislead: volume is traded value rather than shares, and pct_day is a percentile rank rather than a percent change. Each field returns its group, type, unit and meaning. note says what a reader would otherwise get wrong, range appears only where the code guarantees a hard bound, and alias_of names the row field this name reads. rows_with_value counts this market's rows with a non-null, non-empty value. At 0 the field supports no claim here. It is null for fields the tools drop, which exist only in the published JSON. true_rows appears on boolean fields and counts the rows that are true. values appears on text and list label fields as {label: rows}, most common first, unless the market has more than 15 distinct labels. Filters can test only the text ones. These counts say what this publish holds and not why. They cannot separate a field that cannot be computed from a result where nothing qualified. Internal fields, which are bookkeeping fields and rule names, appear only when named in `fields`. `fields` and `group` together keep the named fields that are in the group.

Parametersgroupfieldsmarket

run_screen

Run a preset screen and/or custom filters over a market's full daily scan (every listed stock). A preset matches exactly the stocks the project's website shows for it. Filters are combined with AND, including with the preset.

Parameterslimitmarketscreenfilterssort_bydescending

get_stock

Everything the daily scan knows about one stock: RS ratings, stage, scores, growth, group rank, setup/pattern fields, and which preset screens it currently passes.

Parametersmarketsymbolrequired

audit_stocks

Check a watchlist or holdings against the preset screens in one call: which screens each stock passes, and which it nearly passes. Use it to review a list of stocks, find near misses, or see what a position fails today. Use get_stock for every field on one symbol, and run_screen to discover new candidates. A long list over every screen returns a lot of text, so pass a `screens` list when you only need some. Each stock returns a snapshot, `passes` (screen ids in list_screens order, matching the website and get_stock's passes_screens), near_misses, and notes when there are any. The top-level `screens` list minus `passes` gives the failing ids. near_misses maps each screen the stock fails on exactly one of at least two rules to "field short_by N", or to the field alone when short_by is absent. It ignores how far short the stock is, so check short_by before calling one close. short_by is the positive distance between a failed numeric rule's bound and the stock's value (rs_rating 60 against a min of 70 is short_by 10); on a max rule it is how far the value is above the bound (ibd_group_rank 154 against a max of 40 is short_by 114); it is absent when the value is missing and on non-numeric rules. notes maps a screen to the reason when its rules alone don't explain the result: a failing optional rule group, or a disabled required group. detail=True adds failed_rules: every failed rule for each failing screen. Any response over 80,000 characters of JSON is refused with an error that says how many symbols fit, so for detail pass fewer symbols or a shorter `screens` list. Symbols absent from the market's scan are listed in not_found rather than raising an error.

Parametersdetailmarketscreenssymbolsrequired

screen_track_record

What happened after stocks newly entered each preset screen, at one holding period. Use it to judge how much weight a screen's output deserves, or to see whether a screen has a record yet. Use run_screen for today's matches. Each call reports one horizon; call again with horizon=5 or horizon=60 for the others. Rows in `cohorts` keep the published order, which is not a ranking. how_to_read in each result defines the fields; read it before quoting a number. Any response over 80,000 characters of JSON is refused with an error; pass `screen` for one screen's rows. A market with no published record returns an error naming the markets that have one. In list_markets those markets show the track_record feature.

Parametersmarketscreenhorizon

market_overview

Market health in one call: exposure score and stance (distribution days, follow-through day, trend), StockBee-style breadth (4% movers, 5/10-day ratios, T2108, 52-week highs/lows), key index/asset moves, and the strongest industry groups.

Parametersmarket

group_rankings

Rank a market's IBD-style industry groups by their stocks' relative strength (1 = strongest), with 1W/1M/3M/6M rank changes and this week's biggest movers. Use it to find leading or improving industries. Pass `group` (full name, or any part of it that matches only one group) for that group's rank history and its stocks, strongest RS first. For a quick top-5 alongside breadth, market_overview is enough; to filter stocks by group rank, use run_screen with ibd_group_rank. Rankings are end-of-day and update once a day.

Parametersgrouplimitmarket

Version history

4
  1. v0.3.0LatestNov 7, 2026
  2. v0.2.0Nov 5, 2026
  3. v0.1.1Oct 16, 2026
  4. v0.1.0Oct 12, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts