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 分