TheStrat for agents
Quant price analysis for agents: TheStrat price action, multi-timeframe signals, simultaneous breaks
使うべきか
品質と安全性
検出事項(2)
- HIGH
- MEDIUMdocs_search 内
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"thestrat": {
"url": "https://mcp.thestrat.ai/mcp"
}
}
}リモートエンドポイント
https://mcp.thestrat.ai/mcpstreamable-httpできること
ツール一覧
ツール(16)
⚪classify_bars(bars)
Label every bar as TheStrat scenario 1, 2u, 2d or 3 (Truth #1). Rule: compare each bar with the bar before it. Took the prior high only = 2u. Took the prior low only = 2d. Took both = 3. Took neither = 1 (inside bar). Equal to the prior high/low is NOT a take-out (still a 1). The first bar has no scenario (null). Also returns color, hammer/shooter shape, failed-2 flags (2u red / 2d green = potential 3) and 3u/3d when the bar has first_side data. Use this instead of reading a chart.
入力スキーマ
{
"type": "object",
"properties": {
"bars": {
"description": "OHLC bars, oldest first. Each bar is an object {t, o, h, l, c, v?} (also accepts open/high/low/close/time) or a row [t, o, h, l, c, v?]. t = bar START time, ISO 8601 (New York time if no offset). Daily bars may use a date only.",
"items": {},
"title": "Bars",
"type": "array"
}
},
"required": [
"bars"
],
"title": "classify_barsArguments"
}⚪timeframe_continuity(price, opens, group)
Full timeframe continuity (FTFC, Truth #2): is the last sale above (up) or below (down) the open of every timeframe in the group, or mixed (conflict)? Returns per-timeframe side, color and aggression (above an open: buyers more aggressive, willing to buy at higher prices; below: sellers more aggressive), state up/down/mixed, override (day and 60 agree against the week/month) and the profit-taking note (only the 60 red). FTFC is a state, not a signal.
入力スキーマ
{
"type": "object",
"properties": {
"price": {
"description": "The last sale.",
"title": "Price",
"type": "number"
},
"opens": {
"additionalProperties": {
"type": "number"
},
"description": "Open price of the CURRENT bar per timeframe, e.g. {\"M\": 650.1, \"W\": 662.0, \"D\": 665.2, \"60\": 666.0}.",
"title": "Opens",
"type": "object"
},
"group": {
"default": "standard",
"description": "standard = M W D 60 (default), intraday = 60 30 15 5, investing = Y Q M W, all = Y Q M W D 60 30 15 5.",
"title": "Group",
"type": "string"
}
},
"required": [
"price",
"opens"
],
"title": "timeframe_continuityArguments"
}🟢find_signals(bars, timeframe, now, include_history)
Find TheStrat actionable signals on one timeframe. Patterns: 2-2 reversal, 1-2-2 rev strat, 3-2-2, 2-1-2, 3-1-2, 3-2, hammer, shooter, momo hammer/shooter, inside bar, outside bar reversal (2d-3u / 2u-3d), 1-3 rev strat, 1-3-2, I-O-I. Each signal has: trigger, target (magnitude, null if the pattern has none), level_of_reclaim, invalidation, status, sequence, kind (reversal/continuation) and source_url (the docs page for the rule). Status: setup (trigger not taken), in_force (taken, target not hit, still active), triggered (taken, bar closed, no target), hit_target, failed. Timing: a signal is in force only while its bar is open; D fires stay active until the next session open; the W is closed from Friday close to Monday open.
入力スキーマ
{
"type": "object",
"properties": {
"bars": {
"description": "OHLC bars, oldest first. Each bar is an object {t, o, h, l, c, v?} (also accepts open/high/low/close/time) or a row [t, o, h, l, c, v?]. t = bar START time, ISO 8601 (New York time if no offset). Daily bars may use a date only.",
"items": {},
"title": "Bars",
"type": "array"
},
"timeframe": {
"default": "D",
"description": "Timeframe of the bars: 5, 15, 30, 60, D, W, M, Q or Y.",
"title": "Timeframe",
"type": "string"
},
"now": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock.",
"title": "Now"
},
"include_history": {
"default": false,
"description": "Also list older setups and what happened to them (evidence of participation).",
"title": "Include History",
"type": "boolean"
}
},
"required": [
"bars"
],
"title": "find_signalsArguments"
}⚪exhaustion(signal, now)
Exhaustion risk: how much time is left in the signal's bar (session minutes, wall-clock minutes, sessions left, fraction left), and until when the fire stays active. Docs example: a 60-minute hammer that triggers at 9:32 has 58 minutes; at 10:25 it has 5. Once the bar closes, the signal is gone. The tool reports time; it does not grade it.
入力スキーマ
{
"type": "object",
"properties": {
"signal": {
"additionalProperties": true,
"description": "A signal from find_signals, or {\"timeframe\": \"60\", \"trigger_bar_t\": \"2026-10-23T09:30:00-04:00\"}.",
"title": "Signal",
"type": "object"
},
"now": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock.",
"title": "Now"
}
},
"required": [
"signal"
],
"title": "exhaustionArguments"
}🟢describe_price(symbol, bars_by_timeframe, now)
Multi-timeframe price analysis in plain language for one symbol (quant price action, technical signals, timeframe continuity) from your own bars. Returns `text` (one short line per timeframe, e.g. "SPY day: 2u, above the day open (green). Last 3 bars: 2d 1 2u. In force: bullish 2-1-2 ...") and the same facts as JSON: scenario, color, last 3 bars, signals in force, setups, and FTFC (M W D 60). Start here, then quote the text to the user. On the hosted server a free key has a short cooldown per call; credits skip it (the reply says how many seconds to wait).
入力スキーマ
{
"type": "object",
"properties": {
"symbol": {
"description": "Ticker, e.g. SPY.",
"title": "Symbol",
"type": "string"
},
"bars_by_timeframe": {
"additionalProperties": {
"items": {},
"type": "array"
},
"description": "Bars per timeframe, e.g. {\"M\": [...], \"W\": [...], \"D\": [...], \"60\": [...]}. Give at least 3 bars per timeframe; more gives more signals.",
"title": "Bars By Timeframe",
"type": "object"
},
"now": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock.",
"title": "Now"
}
},
"required": [
"symbol",
"bars_by_timeframe"
],
"title": "describe_priceArguments"
}⚪resample_bars(bars, to_timeframe, from_timeframe)
Build higher-timeframe bars from smaller bars (US equities session 09:30-16:00 New York; 60-minute bars start at 09:30; extended hours are dropped; a partial first period is dropped). Each bar gets first_side (which prior side it took first) for 3u/3d.
入力スキーマ
{
"type": "object",
"properties": {
"bars": {
"description": "OHLC bars, oldest first. Each bar is an object {t, o, h, l, c, v?} (also accepts open/high/low/close/time) or a row [t, o, h, l, c, v?]. t = bar START time, ISO 8601 (New York time if no offset). Daily bars may use a date only.",
"items": {},
"title": "Bars",
"type": "array"
},
"to_timeframe": {
"description": "60, 30, 15, D, W, M, Q or Y.",
"title": "To Timeframe",
"type": "string"
},
"from_timeframe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Input timeframe: 1, 5, 15, 30, 60 or D.",
"title": "From Timeframe"
}
},
"required": [
"bars",
"to_timeframe"
],
"title": "resample_barsArguments"
}🟢define_term(term)
Define a TheStrat term with a quote from the docs and its source_url (67-term glossary: definition, machine_rule where the docs state one, status "needs Alex" where the docs conflict). If the term is not in the glossary, returns the best docs_search hits.
入力スキーマ
{
"type": "object",
"properties": {
"term": {
"description": "A TheStrat word, e.g. 'FTFC', 'rev strat', 'level of reclaim'.",
"title": "Term",
"type": "string"
}
},
"required": [
"term"
],
"title": "define_termArguments"
}🟢docs_search(query, limit)
Search TheStrat docs (titles and descriptions from https://thestrat.ai/llms.txt, cached 24 h). Returns title, URL, section and description. Read the URL for detail.
入力スキーマ
{
"type": "object",
"properties": {
"query": {
"description": "Words to find, e.g. 'shooter trigger' or 'full timeframe continuity'.",
"title": "Query",
"type": "string"
},
"limit": {
"default": 5,
"description": "Max results.",
"title": "Limit",
"type": "integer"
}
},
"required": [
"query"
],
"title": "docs_searchArguments"
}🟢sim_breaks(basket, timeframe, now, as_of, strict_setup_bar)
Simultaneous breaks: find which symbols in a basket broke their setup bar in the same direction in the same bar (2d-2u, 1-2u, 3-1-2u up / 2u-2d, 1-2d down). Quant price action and sector rotation from your own OHLC data, no third-party feed. Docs: "A simultaneous break is multiple correlated assets breaking 2 in the same direction at the same time." No threshold: the count and the % of the basket, ranked. At 80%+ the group gets the label "80%+ concentration: evidence of algorithmic buying (selling) in this group". Returns a ranked list per direction with count, % of basket, symbols, and per symbol the trigger, target and level of reclaim, plus the as-of time and a `text` line to quote.
入力スキーマ
{
"type": "object",
"properties": {
"basket": {
"additionalProperties": {
"items": {},
"type": "array"
},
"description": "Bars per symbol on ONE timeframe, oldest first: {\"XLE\": [...], \"XOM\": [...], ...}. Same bar format as find_signals. Limits: 60 symbols, 500 bars per symbol (10 to 50 are enough). Swing: a sector ETF + its holdings on W. Intraday: SPY QQQ DIA IWM on 30 or 60.",
"title": "Basket",
"type": "object"
},
"timeframe": {
"default": "W",
"description": "Timeframe of the bars: 5, 15, 30, 60, D, W, M, Q or Y.",
"title": "Timeframe",
"type": "string"
},
"now": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock.",
"title": "Now"
},
"as_of": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar).",
"title": "As Of"
},
"strict_setup_bar": {
"default": true,
"description": "True (default): count only the setup bars on the owner list (2d green / 2d hammer for longs, 2u red / 2u shooter for shorts, inside bars both ways). False: any docs reversal setup.",
"title": "Strict Setup Bar",
"type": "boolean"
}
},
"required": [
"basket"
],
"title": "sim_breaksArguments"
}🟢sim_setups(basket, timeframe, now, as_of, strict_setup_bar)
Simultaneous setups (before the break): a concentration of setup bars in one direction across a basket of symbols. A technical signals screener on your own data, any timeframe. Docs: "A concentration of signals in the same sector or index identifies a potential simultaneous break: it fires if all of the signals go in force." Returns a ranked list per direction: count, % of basket, symbols, each with trigger, target and level of reclaim.
入力スキーマ
{
"type": "object",
"properties": {
"basket": {
"additionalProperties": {
"items": {},
"type": "array"
},
"description": "Bars per symbol on ONE timeframe, oldest first: {\"XLE\": [...], \"XOM\": [...], ...}. Same bar format as find_signals. Limits: 60 symbols, 500 bars per symbol (10 to 50 are enough). Swing: a sector ETF + its holdings on W. Intraday: SPY QQQ DIA IWM on 30 or 60.",
"title": "Basket",
"type": "object"
},
"timeframe": {
"default": "W",
"description": "Timeframe of the bars: 5, 15, 30, 60, D, W, M, Q or Y.",
"title": "Timeframe",
"type": "string"
},
"now": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock.",
"title": "Now"
},
"as_of": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar).",
"title": "As Of"
},
"strict_setup_bar": {
"default": true,
"description": "True (default): count only the setup bars on the owner list (2d green / 2d hammer for longs, 2u red / 2u shooter for shorts, inside bars both ways). False: any docs reversal setup.",
"title": "Strict Setup Bar",
"type": "boolean"
}
},
"required": [
"basket"
],
"title": "sim_setupsArguments"
}⚪sector_analysis(etf, basket, timeframe, now, as_of)
Sector rotation by participation: a sector ETF + its holdings on one timeframe. Returns the ETF's own state (scenario, color, last 3 bars, signals in force), the most-2s split of the holdings (1 / 2u / 2d / 3, 2u red, 2d green), simultaneous breaks and simultaneous setups across ETF + holdings with majority flags, and a `text` summary.
入力スキーマ
{
"type": "object",
"properties": {
"etf": {
"description": "The sector ETF ticker, e.g. XLE. Include its bars in the basket.",
"title": "Etf",
"type": "string"
},
"basket": {
"additionalProperties": {
"items": {},
"type": "array"
},
"description": "Bars per symbol on ONE timeframe, oldest first: {\"XLE\": [...], \"XOM\": [...], ...}. Same bar format as find_signals. Limits: 60 symbols, 500 bars per symbol (10 to 50 are enough). Swing: a sector ETF + its holdings on W. Intraday: SPY QQQ DIA IWM on 30 or 60.",
"title": "Basket",
"type": "object"
},
"timeframe": {
"default": "W",
"description": "Timeframe of the bars: 5, 15, 30, 60, D, W, M, Q or Y.",
"title": "Timeframe",
"type": "string"
},
"now": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock.",
"title": "Now"
},
"as_of": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar).",
"title": "As Of"
}
},
"required": [
"etf",
"basket"
],
"title": "sector_analysisArguments"
}⚪signals_in_force(basket, timeframe, now, as_of)
Technical signals in force across a basket: every TheStrat actionable signal whose trigger is taken while its bar is open, grouped by direction and pattern, with % of basket and the trigger, target and level of reclaim per symbol.
入力スキーマ
{
"type": "object",
"properties": {
"basket": {
"additionalProperties": {
"items": {},
"type": "array"
},
"description": "Bars per symbol on ONE timeframe, oldest first: {\"XLE\": [...], \"XOM\": [...], ...}. Same bar format as find_signals. Limits: 60 symbols, 500 bars per symbol (10 to 50 are enough). Swing: a sector ETF + its holdings on W. Intraday: SPY QQQ DIA IWM on 30 or 60.",
"title": "Basket",
"type": "object"
},
"timeframe": {
"default": "D",
"description": "Timeframe of the bars: 5, 15, 30, 60, D, W, M, Q or Y.",
"title": "Timeframe",
"type": "string"
},
"now": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock.",
"title": "Now"
},
"as_of": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar).",
"title": "As Of"
}
},
"required": [
"basket"
],
"title": "signals_in_forceArguments"
}⚪potential_signals_next_bar(basket, timeframe, now, as_of)
Potential signals for the next bar across a basket: every setup whose trigger the next bar (or the open bar) can take, grouped by direction and pattern, with trigger, target and level of reclaim per symbol. A price action watchlist for agents.
入力スキーマ
{
"type": "object",
"properties": {
"basket": {
"additionalProperties": {
"items": {},
"type": "array"
},
"description": "Bars per symbol on ONE timeframe, oldest first: {\"XLE\": [...], \"XOM\": [...], ...}. Same bar format as find_signals. Limits: 60 symbols, 500 bars per symbol (10 to 50 are enough). Swing: a sector ETF + its holdings on W. Intraday: SPY QQQ DIA IWM on 30 or 60.",
"title": "Basket",
"type": "object"
},
"timeframe": {
"default": "D",
"description": "Timeframe of the bars: 5, 15, 30, 60, D, W, M, Q or Y.",
"title": "Timeframe",
"type": "string"
},
"now": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock.",
"title": "Now"
},
"as_of": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar).",
"title": "As Of"
}
},
"required": [
"basket"
],
"title": "potential_signals_next_barArguments"
}🟢buy_sell_list(basket_by_timeframe, now, as_of)
Buy list and sell list: reversal signals in force across timeframes (technical signals screener on your own data). Buy: hammer, 2d-2u, 3-2u, 1-2u in force. Sell: shooter, 2u-2d, 3-2d, 1-2d in force. Continuations (2u-2u, 2d-2d) do not count. Per timeframe: symbols, count, % of basket, trigger, target and level of reclaim; plus which timeframes each symbol is on.
入力スキーマ
{
"type": "object",
"properties": {
"basket_by_timeframe": {
"additionalProperties": {
"additionalProperties": {
"items": {},
"type": "array"
},
"type": "object"
},
"description": "Bars per timeframe, then per symbol: {\"M\": {\"AAPL\": [...], ...}, \"W\": {...}}. Up to 4 timeframes; 60 symbols and 500 bars per symbol each.",
"title": "Basket By Timeframe",
"type": "object"
},
"now": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock.",
"title": "Now"
},
"as_of": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar).",
"title": "As Of"
}
},
"required": [
"basket_by_timeframe"
],
"title": "buy_sell_listArguments"
}🟢open_decisions
Rules the docs do not state exactly, with the default this server uses. Read this before you present a borderline result as a rule.
入力スキーマ
{
"type": "object",
"properties": {},
"title": "open_decisionsArguments"
}🟢portfolio_check(positions, bars_by_timeframe, etf_baskets, etf_timeframe, vix_curve, ...)
Protect-your-assets check for one portfolio, from your own bars: measurable conditions on the losing side of the user's positions, with the evidence. Read the playbook first: MCP resource thestrat://playbooks/protect-portfolio (or the prompt protect_portfolio). Returns (1) the market condition: "Algorithmic buying identified in VIX while algorithmic selling in 4 major indexes" (VIX symbol over its M W D 60 opens, SPY QQQ IWM DIA each under all 4), confirmed or not at a 60-minute close, plus the VIX futures curve state if given; (2) per position, the opens on the holder's losing side (long: under the open = buyers on that timeframe are losing; short: over the open = sellers are losing), reversals in force against the position (buy/sell list rule) and setups against it (trigger not taken), with trigger, target and level of reclaim; (3) concentration: the % of the user's basket (and of each ETF basket) whose current bar took the prior bar's low or high, labelled at 80%+. Each part has `text` to quote and source URLs. Conditions only: not a buy or sell signal. Quote `footer` at the end.
入力スキーマ
{
"type": "object",
"properties": {
"positions": {
"anyOf": [
{
"additionalProperties": {
"type": "string"
},
"type": "object"
},
{
"items": {},
"type": "array"
}
],
"description": "The user's positions: {\"NVDA\": \"long\", \"TSLA\": \"short\"} or [{\"symbol\": \"NVDA\", \"side\": \"long\"}]. Up to 25. Sizes are not needed.",
"title": "Positions"
},
"bars_by_timeframe": {
"additionalProperties": {
"additionalProperties": {
"items": {},
"type": "array"
},
"type": "object"
},
"description": "Bars per timeframe, then per symbol: {\"M\": {\"NVDA\": [...], \"VIXY\": [...], \"SPY\": [...]}, \"W\": {...}, \"D\": {...}, \"60\": {...}}. Each position on the user's timeframes (investor Y; position trader Q M; swing or day trader W D 60). VIX or a VIX ETN (VIXY, VXX, UVXY) and SPY QQQ IWM DIA on M W D 60 for the market condition. The last bar of each timeframe must be the current bar (its open is the open). 60 symbols and 500 bars per symbol per timeframe; 10 to 50 bars are enough.",
"title": "Bars By Timeframe",
"type": "object"
},
"etf_baskets": {
"anyOf": [
{
"additionalProperties": {
"additionalProperties": {
"items": {},
"type": "array"
},
"type": "object"
},
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional, up to 3: the holdings of an ETF the user owns, {\"WGMI\": {\"IREN\": [...], ...}}, on etf_timeframe. For the concentration check.",
"title": "Etf Baskets"
},
"etf_timeframe": {
"default": "D",
"description": "Timeframe of the etf_baskets bars: D (default) or W.",
"title": "Etf Timeframe",
"type": "string"
},
"vix_curve": {
"anyOf": [
{
"additionalProperties": {
"type": "number"
},
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional VIX futures prices {\"front\": 18.2, \"second\": 19.0}. Front over second = backwardation. Leave out if you have no curve data (the reply then says: no data).",
"title": "Vix Curve"
},
"position_timeframes": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "The user's timeframes for the positions: [\"Y\"] investor, [\"Q\", \"M\"] position trader, [\"W\", \"D\", \"60\"] swing or day trader. Positions are checked only on these. Ask the user.",
"title": "Position Timeframes"
},
"now": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock.",
"title": "Now"
},
"as_of": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar).",
"title": "As Of"
}
},
"required": [
"positions",
"bars_by_timeframe"
],
"title": "portfolio_checkArguments"
}コミュニティ
エビデンス