stockscreen-mcp
GitHub提供股票筛选、市场状态分析及持仓审计功能,支持多种选股模型。用于查询候选股、检查市场健康度及对比持仓表现,不投资建议。
Trigger Scenarios
Install
npx skills add xang1234/stock-screener --skill stockscreen-mcp -g -y
SKILL.md
Frontmatter
{
"name": "stockscreen-mcp",
"description": "Screen stocks and review watchlists with the stockscreen-mcp tools without misreading the data. Use when asked for stock candidates, market health, leading industry groups, or a check of holdings against Minervini, CANSLIM, VCP and other preset screens, in any of its 12 markets."
}
Stock screening with stockscreen-mcp
This is end-of-day screening data, not investment advice. Report what the screens show. Do not give price targets, position sizes or buy and sell calls.
Workflow
Work from the market down, and skip steps the question does not need.
- Pick the market. Call
list_marketswhen the user names a country or asks how fresh the data is. A status of late means the market is behind, so say so. Its features show which tools have data for that market. - Read the regime. Call
market_overviewand report the stance, exposure score, distribution days and breadth before naming any stock. If exposure or breadth comes back absent, say so and check the market's features inlist_markets. Do not infer a regime from what is left. - Choose screens. Call
list_screensfor each screen's exact rules. Callscreen_track_recordto judge how much weight a screen deserves, and follow its how_to_read note. Do not rank a row marked thin. A market with no record returns an error, which says nothing about how its screens performed. - Find candidates. Call
run_screenwith a screen, your own filters, or both. total_matches counts every match, even when the rows stop at the limit. - Confirm leadership. Call
group_rankingsfor strong and improving groups, then check each candidate'sibd_group_rank. Rank 1 is strongest. Some markets publish no groups. - Review positions. Call
audit_stockswith a watchlist or holdings. It returns the screens each stock passes and its near_misses. Check short_by before calling a miss close. - Look up one name. Call
get_stockfor every field on one symbol. - Define before quoting. Call
describe_fieldsbefore quoting or filtering on a field you have not used. Pass group or fields to keep the answer short. It also counts this market's rows: rows_with_value, true_rows on flags, and values on text and list labels. The stockscreen://fields resource holds the same definitions without the counts.
Reading rules
Units.
volumeis average daily traded value in the listing currency, not shares, so it cannot be compared across currencies.adv_usdis the only USD liquidity figure, but it prices the shares at market cap over shares outstanding, so it can differ widely fromvolume, even for a US stock, and it can be 0. Look at both on a name before quoting liquidity.market_cap_usdcompares size across markets.pct_day,pct_weekandpct_monthare percentile ranks. The percent changes areprice_change_1d,perf_weekandperf_month.week_52_high_distanceis positive below the high,week_52_low_distanceis positive above the low, andse_distance_to_pivot_pctis positive above the pivot.current_price,se_pivot_priceandvcp_pivotare in the row'scurrency.beta_adj_rsis capped at 100 and is not a percentile.
Growth. growth_metric_basis on the row is the only authority for what eps_growth_qq and sales_growth_qq compare. quarterly_qoq compares with the prior quarter, and comparable_period_yoy with the same period a year earlier. With unavailable or null the comparison is unknown, so do not name one. get_stock returns the basis, and run_screen rows show it only if you filter or sort on it. For year over year, use eps_growth_yy and sales_growth_yy.
Dates. Every result has an as_of_date, the session the publish covers. It is end of day and never live. Quote it with the numbers, and do not call a close a live price. A row's last bar can be newer or older than the result's as_of_date. run_screen rows lack opportunity_state, so call get_stock and read its opportunity_state.as_of_date before dating one row's price. Markets can have different dates, so do not line them up as one day. ipo_date can be a provider floor date or the first stored bar in any market, so do not quote it as a listing date.
Coverage. A null is missing data, not a bad score. rs_rating needs a row in the market's RS universe with an adjusted close at every anchor back 252 sessions, so younger listings and anything outside that universe are null. The StockUniverse.is_common_stock flag on each listing, filtered by market, sets the universe, and some markets' universes include ETFs, so percentiles there are not stock-only. A rule that requires a value never matches a null, so a stock missing from a screen may only lack the data. When describe_fields reports rows_with_value 0, say the market has no values for that field. Do not reason from its absence.
RS is per market. rs_rating, rs_rating_1m, rs_rating_3m and rs_rating_12m are percentiles from 1 to 99 within the stock's own market, and ibd_group_rank ranks within one market. A 90 in one market does not compare with a 90 in another, so never rank across markets with them.
Outliers. Summarise with medians, not averages. eps_growth_qq and eps_growth_yy are uncapped. se_up_down_volume_ratio_10d gets huge when 10 sessions had no down day, because its denominator floors at 1e-9. Question an extreme value before repeating it.
Labels. rating, minervini_rating, canslim_rating, volume_breakthrough_rating and action_state are screening output. Strong Buy describes a score and is not a recommendation. se_pattern_primary names the best candidate even below the confidence floor, and se_pattern_confidence and se_setup_score do not read stage, so declining stocks can score high. Do not call a pattern name or a score alone a setup. A preset match means only that its rules passed. Before calling anything a setup, check stage, se_in_early_zone, se_pivot_date and action_state with get_stock, because a pivot can be years old. In action_state, exit_risk, event_risk and extended are cautions to report, and data_limited is usually a data gap and not a verdict on the stock. setup_ready depends on se_setup_ready, so read values in describe_fields: when setup_ready is absent, that says nothing about the stocks, so do not conclude there are no setups. se_setup_ready requires every detector's checks to pass, so a detector that found nothing makes it false. correction_survivor is false when a gate failed and also when evidence is missing. failed_checks in opportunity_state names which, so read it with get_stock before saying why a row is false.
Empty screens. Report zero matches as zero matches, not as proof that no such stocks exist, and do not name a cause. You can report describe_fields counts as facts, such as "no row has this label". They show what this publish holds, not why the screen is empty, because another rule may exclude the same rows. Do not call the screen broken or the stocks weak.
Thresholds. Use only numbers from the screen rules or tool output. If asked what counts as strong, read the rules from list_screens instead of supplying your own cut-off.
Finishing
Name the market, the as_of_date, the screens you used and any data gaps. Close by saying this is screening data, not investment advice.
Version History
- f91e4a2 Current 2026-11-07 12:52


