Stock Screener

io.github.xang1234由 GitHub 帳號 xang1234 發布v0.4.0更新於 Nov 8, 2026

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

已驗證STDIO僅桌面金融資料與分析

概覽

AI 產生的概覽

涵蓋 12 個市場的唯讀每日選股資料:預設篩選、相對強度評級、市場寬度與產業族群排名,無需 API 金鑰。

可以做什麼
  • 列出市場與預設篩選及其確切規則,並查詢掃描欄位含義和各市場的取值統計
  • 在某個市場的完整每日掃描上執行預設篩選或自訂條件,並取得單一股票的所有掃描欄位
  • 用預設篩選稽核自選清單或持股,包括只差一條規則的接近通過項目
  • 檢視市場健康度與寬度,並依相對強度為 IBD 風格產業族群排名
  • 查看股票新進入某項篩選後在指定持有期間的表現
適用情境
適合讓助理篩選股票、依趨勢與成長規則稽核自選清單,或評估美國、加拿大、歐洲及亞洲市場的健康度與領先產業族群。適用於收盤後的研究,而非盤中交易決策。
執行需求
需要在本機安裝 uv(提供 uvx),套件為 stockscreen-mcp。無需 API 金鑰或帳號。首次使用需連網下載各市場發布的快照(美國約 7 MB 壓縮後)。可選擇設定 STOCKSCREEN_DATA_URL 以讀取其他發布來源。
安裝前請注意
資料為各市場收盤後發布的日終快照,不含盤中資料,也從不從行情供應商即時取得;每個結果都帶有 as_of_date。這是教學用途的篩選資料,不構成投資建議。工具為唯讀,但命令列模式會將 TradingView 自選清單檔案寫入磁碟。欄位名稱可能造成誤解,引用數字前請先確認欄位含義。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Stock Screener,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

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.

來源:stockscreen-mcp/README.md,提交 6d9b7e3

工具

10

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.

無需輸入參數。

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.

輸入參數market

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.

輸入參數groupfieldsmarket

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.

輸入參數limitmarketscreenfilterssort_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.

輸入參數marketsymbol必填

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.

輸入參數detailmarketscreenssymbols必填

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.

輸入參數marketscreenhorizon

what_changed

What changed in a market between two archived sessions. It lists the stocks that entered and left each preset screen, and for named symbols the screens they moved into and out of, the tracked fields that changed, and the tracked fields null in both sessions. Use it for "what changed since yesterday" or since a date. Use run_screen and get_stock for the newest publish, and screen_track_record for how entries did afterwards. With no dates it compares the two newest archived sessions. Moves where a field the screen's rules read went from null to a value, or back, are listed apart as entered_with_new_data and left_with_lost_data, since data coverage may have moved them. Moves where a growth field the rules read changed across a change of growth_metric_basis are listed apart as entered_with_basis_change and left_with_basis_change, since the comparison may have moved them. Read `warnings` before attributing a move to a stock, because a rule change, an RS universe or formula change, the stage fix or a session read from a retained build can move a stock that did nothing. how_to_read in each result defines the fields. The archive holds each session as first published, from when recording started. A date before the first archived session is an error that names it. Any response over 80,000 characters of JSON is refused; pass `screen`, a lower `limit` or fewer `symbols`.

輸入參數limitsinceuntilmarketscreensymbols

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.

輸入參數market

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.

輸入參數grouplimitmarket

版本歷史

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

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分