Koskamo

TheStrat MCP

An official MCP server provided by TheStrat LLC that allows AI agents to perform quant price analysis. Agents send their own OHLC bars, and the server returns TheStrat facts including bar scenarios, timeframe continuity, signals with triggers and targets, and simultaneous breaks across baskets. It supports portfolio protection checks based on algorithmic participation evidence.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

TheStrat MCP logo, by TheStrat LLCVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by TheStrat LLC
You need:Free key (optional, email only): POST https://mcp.thestrat.ai/v1/keys
MCP endpoint (Streamable HTTP)
https://mcp.thestrat.ai/mcp
Vendor documentation

What you can do with it

  • Analyze price action scenarios (1, 2, 3) across multiple timeframes
  • Identify simultaneous breaks across a basket of assets
  • Check portfolio positions against algorithmic selling/buying evidence
  • Generate trading signals with trigger, target, and reclaim levels

Source and maintenance

Vendor evidenceRegistry 0.3.1

Protocol and capabilities

Server
thestrat 0.3.1
MCP protocol
2025-06-18
Tools
16 advertised
Resources
2 advertised
Resource templates
0 advertised
Prompts
2 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

TheStrat tools. You bring OHLC bars; the tools return checkable facts in TheStrat words. Do not read charts by eye: call these tools and quote their output. Framing: TheStrat does not backtest patterns. It gathers evidence of participation by price and time. Say facts ("SPY day: 2u, above the day open: buyers are more aggressive"), not opinions ("looks bullish"). Wording: distance from an open (and FTFC) is the level of aggression of buyers or sellers: who is more willing to buy at higher prices or sell at lower prices. Describe it only as aggression. Every signal carries a trigger, a target (magnitude) and a level of reclaim, plus source_url: cite it. Order of work: describe_price (whole picture) -> find_signals (one timeframe) -> exhaustion (time left) -> define_term / docs_search to explain a word. Many symbols at once (a sector ETF + holdings, or SPY QQQ DIA IWM): sim_setups (before the break) -> sim_breaks (the break, same bar, 2+ symbols) -> sector_analysis. Bars: oldest first, each {t, o, h, l, c} with t = bar start (ISO time, New York session 09:30-16:00). 60-minute bars start at 09:30. A user's portfolio ("protect my assets"): prompt protect_portfolio, then portfolio_check. Report conditions and evidence only, never an action ("buy", "sell", "hedge").

Tools

16 advertised

classify_bars
Advertised by the server during the last successful anonymous check.

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.

classify_bars input schema
{
  "type": "object",
  "title": "classify_barsArguments",
  "required": [
    "bars"
  ],
  "properties": {
    "bars": {
      "type": "array",
      "items": {},
      "title": "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."
    }
  }
}
timeframe_continuity
Advertised by the server during the last successful anonymous check.

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.

timeframe_continuity input schema
{
  "type": "object",
  "title": "timeframe_continuityArguments",
  "required": [
    "price",
    "opens"
  ],
  "properties": {
    "group": {
      "type": "string",
      "title": "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."
    },
    "opens": {
      "type": "object",
      "title": "Opens",
      "description": "Open price of the CURRENT bar per timeframe, e.g. {\"M\": 650.1, \"W\": 662.0, \"D\": 665.2, \"60\": 666.0}.",
      "additionalProperties": {
        "type": "number"
      }
    },
    "price": {
      "type": "number",
      "title": "Price",
      "description": "The last sale."
    }
  }
}
find_signals
Advertised by the server during the last successful anonymous check.

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.

find_signals input schema
{
  "type": "object",
  "title": "find_signalsArguments",
  "required": [
    "bars"
  ],
  "properties": {
    "now": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Now",
      "default": null,
      "description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock."
    },
    "bars": {
      "type": "array",
      "items": {},
      "title": "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."
    },
    "timeframe": {
      "type": "string",
      "title": "Timeframe",
      "default": "D",
      "description": "Timeframe of the bars: 5, 15, 30, 60, D, W, M, Q or Y."
    },
    "include_history": {
      "type": "boolean",
      "title": "Include History",
      "default": false,
      "description": "Also list older setups and what happened to them (evidence of participation)."
    }
  }
}
exhaustion
Advertised by the server during the last successful anonymous check.

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.

exhaustion input schema
{
  "type": "object",
  "title": "exhaustionArguments",
  "required": [
    "signal"
  ],
  "properties": {
    "now": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Now",
      "default": null,
      "description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock."
    },
    "signal": {
      "type": "object",
      "title": "Signal",
      "description": "A signal from find_signals, or {\"timeframe\": \"60\", \"trigger_bar_t\": \"2026-10-23T09:30:00-04:00\"}.",
      "additionalProperties": true
    }
  }
}
describe_price
Advertised by the server during the last successful anonymous check.

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. Hosted server: free, no cooldown. Fair-use limit: 60 calls per minute.

describe_price input schema
{
  "type": "object",
  "title": "describe_priceArguments",
  "required": [
    "symbol",
    "bars_by_timeframe"
  ],
  "properties": {
    "now": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Now",
      "default": null,
      "description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock."
    },
    "symbol": {
      "type": "string",
      "title": "Symbol",
      "description": "Ticker, e.g. SPY."
    },
    "bars_by_timeframe": {
      "type": "object",
      "title": "Bars By Timeframe",
      "description": "Bars per timeframe, e.g. {\"M\": [...], \"W\": [...], \"D\": [...], \"60\": [...]}. Give at least 3 bars per timeframe; more gives more signals.",
      "additionalProperties": {
        "type": "array",
        "items": {}
      }
    }
  }
}
resample_bars
Advertised by the server during the last successful anonymous check.

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.

resample_bars input schema
{
  "type": "object",
  "title": "resample_barsArguments",
  "required": [
    "bars",
    "to_timeframe"
  ],
  "properties": {
    "bars": {
      "type": "array",
      "items": {},
      "title": "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."
    },
    "to_timeframe": {
      "type": "string",
      "title": "To Timeframe",
      "description": "60, 30, 15, D, W, M, Q or Y."
    },
    "from_timeframe": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "From Timeframe",
      "default": null,
      "description": "Input timeframe: 1, 5, 15, 30, 60 or D."
    }
  }
}
define_term
Advertised by the server during the last successful anonymous check.

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.

define_term input schema
{
  "type": "object",
  "title": "define_termArguments",
  "required": [
    "term"
  ],
  "properties": {
    "term": {
      "type": "string",
      "title": "Term",
      "description": "A TheStrat word, e.g. 'FTFC', 'rev strat', 'level of reclaim'."
    }
  }
}
docs_search
Advertised by the server during the last successful anonymous check.

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.

docs_search input schema
{
  "type": "object",
  "title": "docs_searchArguments",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 5,
      "description": "Max results."
    },
    "query": {
      "type": "string",
      "title": "Query",
      "description": "Words to find, e.g. 'shooter trigger' or 'full timeframe continuity'."
    }
  }
}
sim_breaks
Advertised by the server during the last successful anonymous check.

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.

sim_breaks input schema
{
  "type": "object",
  "title": "sim_breaksArguments",
  "required": [
    "basket"
  ],
  "properties": {
    "now": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Now",
      "default": null,
      "description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock."
    },
    "as_of": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "As Of",
      "default": null,
      "description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar)."
    },
    "basket": {
      "type": "object",
      "title": "Basket",
      "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.",
      "additionalProperties": {
        "type": "array",
        "items": {}
      }
    },
    "timeframe": {
      "type": "string",
      "title": "Timeframe",
      "default": "W",
      "description": "Timeframe of the bars: 5, 15, 30, 60, D, W, M, Q or Y."
    },
    "strict_setup_bar": {
      "type": "boolean",
      "title": "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."
    }
  }
}
sim_setups
Advertised by the server during the last successful anonymous check.

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.

sim_setups input schema
{
  "type": "object",
  "title": "sim_setupsArguments",
  "required": [
    "basket"
  ],
  "properties": {
    "now": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Now",
      "default": null,
      "description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock."
    },
    "as_of": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "As Of",
      "default": null,
      "description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar)."
    },
    "basket": {
      "type": "object",
      "title": "Basket",
      "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.",
      "additionalProperties": {
        "type": "array",
        "items": {}
      }
    },
    "timeframe": {
      "type": "string",
      "title": "Timeframe",
      "default": "W",
      "description": "Timeframe of the bars: 5, 15, 30, 60, D, W, M, Q or Y."
    },
    "strict_setup_bar": {
      "type": "boolean",
      "title": "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."
    }
  }
}
sector_analysis
Advertised by the server during the last successful anonymous check.

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.

sector_analysis input schema
{
  "type": "object",
  "title": "sector_analysisArguments",
  "required": [
    "etf",
    "basket"
  ],
  "properties": {
    "etf": {
      "type": "string",
      "title": "Etf",
      "description": "The sector ETF ticker, e.g. XLE. Include its bars in the basket."
    },
    "now": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Now",
      "default": null,
      "description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock."
    },
    "as_of": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "As Of",
      "default": null,
      "description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar)."
    },
    "basket": {
      "type": "object",
      "title": "Basket",
      "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.",
      "additionalProperties": {
        "type": "array",
        "items": {}
      }
    },
    "timeframe": {
      "type": "string",
      "title": "Timeframe",
      "default": "W",
      "description": "Timeframe of the bars: 5, 15, 30, 60, D, W, M, Q or Y."
    }
  }
}
signals_in_force
Advertised by the server during the last successful anonymous check.

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.

signals_in_force input schema
{
  "type": "object",
  "title": "signals_in_forceArguments",
  "required": [
    "basket"
  ],
  "properties": {
    "now": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Now",
      "default": null,
      "description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock."
    },
    "as_of": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "As Of",
      "default": null,
      "description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar)."
    },
    "basket": {
      "type": "object",
      "title": "Basket",
      "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.",
      "additionalProperties": {
        "type": "array",
        "items": {}
      }
    },
    "timeframe": {
      "type": "string",
      "title": "Timeframe",
      "default": "D",
      "description": "Timeframe of the bars: 5, 15, 30, 60, D, W, M, Q or Y."
    }
  }
}
potential_signals_next_bar
Advertised by the server during the last successful anonymous check.

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.

potential_signals_next_bar input schema
{
  "type": "object",
  "title": "potential_signals_next_barArguments",
  "required": [
    "basket"
  ],
  "properties": {
    "now": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Now",
      "default": null,
      "description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock."
    },
    "as_of": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "As Of",
      "default": null,
      "description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar)."
    },
    "basket": {
      "type": "object",
      "title": "Basket",
      "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.",
      "additionalProperties": {
        "type": "array",
        "items": {}
      }
    },
    "timeframe": {
      "type": "string",
      "title": "Timeframe",
      "default": "D",
      "description": "Timeframe of the bars: 5, 15, 30, 60, D, W, M, Q or Y."
    }
  }
}
buy_sell_list
Advertised by the server during the last successful anonymous check.

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.

buy_sell_list input schema
{
  "type": "object",
  "title": "buy_sell_listArguments",
  "required": [
    "basket_by_timeframe"
  ],
  "properties": {
    "now": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Now",
      "default": null,
      "description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock."
    },
    "as_of": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "As Of",
      "default": null,
      "description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar)."
    },
    "basket_by_timeframe": {
      "type": "object",
      "title": "Basket By Timeframe",
      "description": "Bars per timeframe, then per symbol: {\"M\": {\"AAPL\": [...], ...}, \"W\": {...}}. Up to 4 timeframes; 60 symbols and 500 bars per symbol each.",
      "additionalProperties": {
        "type": "object",
        "additionalProperties": {
          "type": "array",
          "items": {}
        }
      }
    }
  }
}
open_decisions
Advertised by the server during the last successful anonymous check.

Rules the docs do not state exactly, with the default this server uses. Read this before you present a borderline result as a rule.

open_decisions input schema
{
  "type": "object",
  "title": "open_decisionsArguments",
  "properties": {}
}
portfolio_check
Advertised by the server during the last successful anonymous check.

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.

portfolio_check input schema
{
  "type": "object",
  "title": "portfolio_checkArguments",
  "required": [
    "positions",
    "bars_by_timeframe"
  ],
  "properties": {
    "now": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Now",
      "default": null,
      "description": "Current time, ISO 8601. Decides if the last bar is still open. Default: the server clock."
    },
    "as_of": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "As Of",
      "default": null,
      "description": "Optional ISO time. Use only bars that start at or before this time (replay a past bar)."
    },
    "positions": {
      "anyOf": [
        {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        {
          "type": "array",
          "items": {}
        }
      ],
      "title": "Positions",
      "description": "The user's positions: {\"NVDA\": \"long\", \"TSLA\": \"short\"} or [{\"symbol\": \"NVDA\", \"side\": \"long\"}]. Up to 25. Sizes are not needed."
    },
    "vix_curve": {
      "anyOf": [
        {
          "type": "object",
          "additionalProperties": {
            "type": "number"
          }
        },
        {
          "type": "null"
        }
      ],
      "title": "Vix Curve",
      "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)."
    },
    "etf_baskets": {
      "anyOf": [
        {
          "type": "object",
          "additionalProperties": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {}
            }
          }
        },
        {
          "type": "null"
        }
      ],
      "title": "Etf Baskets",
      "default": null,
      "description": "Optional, up to 3: the holdings of an ETF the user owns, {\"WGMI\": {\"IREN\": [...], ...}}, on etf_timeframe. For the concentration check."
    },
    "etf_timeframe": {
      "type": "string",
      "title": "Etf Timeframe",
      "default": "D",
      "description": "Timeframe of the etf_baskets bars: D (default) or W."
    },
    "bars_by_timeframe": {
      "type": "object",
      "title": "Bars By Timeframe",
      "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.",
      "additionalProperties": {
        "type": "object",
        "additionalProperties": {
          "type": "array",
          "items": {}
        }
      }
    },
    "position_timeframes": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "title": "Position Timeframes",
      "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."
    }
  }
}

Prompts

2 advertised

how_thestrat_thinks — How TheStrat thinks

Advertised by the server during the last successful anonymous check.

Load TheStrat's way of reading price (Alex Sopa) before you analyze bars with these tools.

No arguments advertised.

protect_portfolio — Protect your assets

Advertised by the server during the last successful anonymous check.

Step-by-step playbook: check a user's positions with TheStrat and report the measurable conditions on the losing side, with evidence. Conditions only, no advice.

positions
Optional, e.g. 'NVDA long, TSLA short, WGMI long'.

Resources

2 advertised

how-we-think — How TheStrat thinks

Advertised by the server during the last successful anonymous check.

How TheStrat reads price, in Alex Sopa's words: participation groups, 80%+ algorithms, trapped traders, stops in previous ranges, timed reversals, and a worked QQQ example with real bars. Read it before you explain a TheStrat result.

how-we-think URI
thestrat://how-we-think

MIME type: text/markdown

protect-portfolio — Protect your assets (playbook)

Advertised by the server during the last successful anonymous check.

Playbook for an agent that watches a user's portfolio with TheStrat: which bars to send, which tools to call, the conditions (VIX vs. the 4 major indexes, the opens on the losing side of each position, signals against it, concentration 80%+), and how to report them as facts, not advice.

protect-portfolio URI
thestrat://playbooks/protect-portfolio

MIME type: text/markdown

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
644 ms
95th percentile latency
644 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 644 ms · metadata changed · 16 tool(s), 2 resource(s), 0 resource template(s), 2 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http thestrat-mcp https://mcp.thestrat.ai/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add thestrat-mcp --url https://mcp.thestrat.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable thestrat-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "thestrat-mcp": {
      "url": "https://mcp.thestrat.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "thestrat-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.thestrat.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start thestrat-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "thestrat-mcp": {
      "type": "http",
      "url": "https://mcp.thestrat.ai/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http thestrat-mcp https://mcp.thestrat.ai/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "thestrat-mcp": {
      "url": "https://mcp.thestrat.ai/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "thestrat-mcp": {
      "serverUrl": "https://mcp.thestrat.ai/mcp"
    }
  }
}

Let your agent find its tools

Find servers like TheStrat MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run TheStrat MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing