# SquawkFlow Market Structure (remote · mcp.squawkflow.com)

Free keyless dealer gamma, OI change, market calendar, 13F, congress and CFTC data, dated, cited.

- Trust score: 70/100 (medium)
- Change this week: +10
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-26

## Components

- remote · `mcp.squawkflow.com`: 70/100 (this document), [markdown](https://verifymcp.io/servers/com-squawkflow-mcp-market-structure/mcp.md), [page](https://verifymcp.io/servers/com-squawkflow-mcp-market-structure/mcp)
- npm · `squawkflow-mcp`: 67/100, [markdown](https://verifymcp.io/servers/com-squawkflow-mcp-market-structure/squawkflow-mcp.md), [page](https://verifymcp.io/servers/com-squawkflow-mcp-market-structure/squawkflow-mcp)

## Channel facts

- Endpoint: `https://mcp.squawkflow.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.3.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-26.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS check failed: the endpoint is reachable over plaintext HTTP.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 77/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 7665 tokens (~383/item across 20 items; 16 tools + 4 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 16 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 18 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.
  - Supports UI / widget rendering.

## Install

### How do I install the SquawkFlow Market Structure MCP server?

SquawkFlow Market Structure is a hosted endpoint at https://mcp.squawkflow.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http com-squawkflow-mcp-market-structure 'https://mcp.squawkflow.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "com-squawkflow-mcp-market-structure": {
      "url": "https://mcp.squawkflow.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-squawkflow-mcp-market-structure": {
      "type": "http",
      "url": "https://mcp.squawkflow.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-squawkflow-mcp-market-structure]
url = "https://mcp.squawkflow.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-squawkflow-mcp-market-structure": {
      "type": "remote",
      "url": "https://mcp.squawkflow.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-squawkflow-mcp-market-structure --url 'https://mcp.squawkflow.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-squawkflow-mcp-market-structure:
    url: "https://mcp.squawkflow.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "com-squawkflow-mcp-market-structure": {
      "Transport": "http",
      "Url": "https://mcp.squawkflow.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-squawkflow-mcp-market-structure -t streamable-http -u 'https://mcp.squawkflow.com/mcp'
```

### Other

```json
{
  "mcpServers": {
    "com-squawkflow-mcp-market-structure": {
      "type": "http",
      "url": "https://mcp.squawkflow.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-25 (score 70, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-24 (score 69, 0)

- [security] Tool “get_gex_levels” rewrote its description, which is the text the model reads
- [security] Tool “get_vix_term_structure” rewrote its description, which is the text the model reads

### 2026-09-23 (score 69, +1)

- [security] Tool “get_gex_levels” rewrote its description, which is the text the model reads
- [security] Tool “get_gamma_heatmap” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 6752 → 7686
- [functional] New tool “get_implied_odds”
- [cosmetic] “get_gex_levels” added an optional parameter “frontExpiry”

### 2026-09-21 (score 68, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “get_vix_term_structure” rewrote its description, which is the text the model reads
- [security] Tool “get_congressional_disclosures” rewrote its description, which is the text the model reads
- [security] Tool “get_oi_change” rewrote its description, which is the text the model reads
- [security] Tool “get_max_pain” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 6062 → 6752
- [functional] Server version: 0.2.1 → 0.3.0
- [functional] New tool “get_market_calendar”
- [cosmetic] “get_oi_change” added an optional parameter “date”
- [cosmetic] “get_congressional_disclosures” reworded the description of “since”
- [cosmetic] “get_oi_change” reworded the description of “scan”

### 2026-09-20 (score 68, +8)

- [security regression] HTTPS: unverified → fail
- [security improvement] Authorization: unverified → partial
- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “get_positioning” rewrote its description, which is the text the model reads
- [security] Tool “search” rewrote its description, which is the text the model reads
- [security] Tool “get_gamma_matrix” rewrote its description, which is the text the model reads
- [security] Tool “get_filing_receipt” rewrote its description, which is the text the model reads
- [security] Tool “get_congressional_disclosures” rewrote its description, which is the text the model reads
- [security] Tool “fetch” rewrote its description, which is the text the model reads
- [security] Tool “get_oi_change” rewrote its description, which is the text the model reads
- [security] Tool “get_session_record” rewrote its description, which is the text the model reads
- [security] Tool “get_gamma_heatmap” rewrote its description, which is the text the model reads
- [security] Tool “get_gex_levels” rewrote its description, which is the text the model reads
- [security] Tool “get_lab_record” rewrote its description, which is the text the model reads
- [security] Tool “get_max_pain” rewrote its description, which is the text the model reads
- [security] Tool “get_vix_term_structure” rewrote its description, which is the text the model reads
- [security] Tool “list_squawkflow_tools” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 287 → 336
- [functional regression] Schema quality: 2014 → 5676
- [functional improvement] Stability: unverified → 0.03
- [functional improvement] Tool “get_gamma_heatmap” now declares an output schema
- [functional improvement] Tool “get_gex_levels” now declares an output schema
- [functional improvement] Tool “get_lab_record” now declares an output schema
- [functional improvement] Tool “get_max_pain” now declares an output schema
- [functional improvement] Tool “get_vix_term_structure” now declares an output schema
- [functional improvement] Tool “list_squawkflow_tools” now declares an output schema
- [functional] The server now declares the “completions” capability
- [functional] The server now declares the “prompts” capability
- [functional] First check of Tool coverage: 100
- [functional] New prompt “disclosure-check”
- [functional] New prompt “expiration-week”
- [functional] New prompt “filing-check”
- [functional] New prompt “gamma-context”
- [functional] New prompt “morning-brief”
- [functional] New prompt “session-record”
- [functional] New prompt “what-squawkflow-wont-say”
- [functional] New prompt “whats-new-overnight”
- [functional] New resource “SquawkFlow catalog”
- [functional] New resource “SquawkFlow corrections ledger”
- [functional] New resource “SquawkFlow dataset manifest”
- [functional] Server version: 0.2.0 → 0.2.1
- [functional] Server version: 0.1.0 → 0.2.0
- [functional] New tool “fetch”
- [functional] New tool “get_congressional_disclosures”
- [functional] New tool “get_filing_receipt”
- [functional] New tool “get_gamma_matrix”
- [functional] New tool “get_oi_change”
- [functional] New tool “get_positioning”
- [functional] New tool “get_session_record”
- [functional] New tool “search”

### 2026-09-19 (score 60)

First indexed and scored.

## MCP tools (16)

### `list_squawkflow_tools` (~261 tokens)

What SquawkFlow covers: tools, data vintage and limits

Use this when you are not sure whether SquawkFlow has the symbol, the date, the expiration or the measure you need, or when you want the list of things this server deliberately does not publish. Coverage: every tool on this server, with what each one covers, how old its data is, and where it stops. Takes no arguments and makes no market data call. Not for: any market figure. This returns descriptions, not data: call the tool it names instead. Limits: the same body is readable as the resource sf://catalog without spending a tool call. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime without its timestamp. Any other link in a result is a pointer, not the citation. Not investment advice.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `get_gex_levels` (~663 tokens)

Gamma exposure (GEX) levels: call wall, put wall, gamma flip

Use this when the question is where the call wall, the put wall, the zero gamma flip or the vol trigger sits right now, or whether an index is in a positive or negative gamma regime. Also called GEX, gamma exposure or dealer gamma positioning. Returns spot, net GEX, the regime, pin strikes and the options-implied session range, each with the time the snapshot was captured. Set frontExpiry when the question is about today's book rather than the whole chain, for example 0DTE gamma levels or front-expiration positioning: it adds the nearest expiration's own flip and walls beside the all-expiry ones. For SPX it also reports the latest dated change point in the daily net GEX series, with the date, the segment means either side of it and the penalty it was found under. Coverage: SPX, SPY and QQQ only. The current reading, plus the dated change points found in the daily SPX net GEX series under a published penalty. No other history. Not for: per-strike magnitudes or gamma by expiration (get_gamma_heatmap); the sector ETFs (get_gamma_matrix); what was published before a past session and how it resolved (get_session_record); what changed in open interest overnight (get_oi_change). Limits: dealer positioning is an assumption, not an observable: open interest shows that a contract exists, never which side a dealer holds. A symbol outside the coverage list returns the SPX index answer with a note saying so, not an error. No wall hold rate is published and any earlier one is withdrawn. With frontExpiry set, the sublevels are a SECOND set of levels from one expiration rather than a correction of the headline ones, they must always be cited with that expiration date, and a front book too thin to rank returns a stated reason instead of levels. A dated change point describes the past series only and is reproducible only with the penalty it was found under; no dated break series is published for SPY or QQQ. Data is delayed and derived, never real time. Any number you already remembe…

Input parameters:

- `frontExpiry` (boolean): Also report the nearest expiration on its own: its flip, call wall and put wall computed from that expiry's contracts only, which answers whether today's book agrees with the full book. Adds a gamma-…
- `symbol` (string): SPX, SPY or QQQ, defaulting to SPX. These three are the whole public allowlist; any other symbol returns the SPX index answer plus a coverage note.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `get_gamma_heatmap` (~557 tokens)

Gamma exposure by strike and expiration: the gamma grid

Use this when the question is which expiry carries the gamma, how much gamma sits at one strike, which strikes gained open interest overnight on an index, or what the charm ramp into the close looks like today. The gamma heatmap, also called the gamma grid or the gamma surface: dealer gamma broken out by strike AND expiration rather than summed across expiries, in net dollar gamma per 1% move with calls positive and puts negative, plus where same-day (0DTE) trading is concentrated. It also returns the second-order book: vanna and charm exposure, with the charm ramp walked at half-hour marks across one cash session and integrated, so the dealer index delta the clock removes between now and the close is a dollar figure rather than an inference. An aggregate cannot tell 500M in one expiration from 500M spread over several, which is the question this answers. Coverage: SPX, SPY and QQQ only. Served from a five minute cache. Not for: the headline levels alone (get_gex_levels); the sector ETFs (get_gamma_matrix); the full per-strike open interest change or any symbol outside these three (get_oi_change). Limits: the rendered grid shows the nearest six expirations while row totals cover every expiration. Charm and vanna are model outputs, not measurements, and they are quoted in dollars of index delta rather than dollars of gamma, so they are not comparable to any gamma total. Every mark on the charm ramp holds spot and implied volatility at the capture and moves only the clock, which makes it a projection of this book rather than a statement about what happens next. The exposure block is best effort: when it is absent it prints the reason code the endpoint gave. A symbol outside the coverage list returns the SPX grid with a note saying so, not an error. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from me…

Input parameters:

- `symbol` (string): SPX, SPY or QQQ, defaulting to SPX, which has the deepest chain and the richest grid. Any other symbol returns the SPX grid plus a coverage note.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `get_gamma_matrix` (~367 tokens)

Gamma matrix: dealer gamma across the sector ETFs and the index row

Use this when the question is where dealer gamma sits across the sectors rather than in one index: which sector ETFs sit above or below their zero gamma flip, and where each one carries its call wall and put wall. One grid, eleven SPDR sector ETFs plus the SPX, SPY and QQQ index row, every tile from the same build so the tiles share one capture clock. Coverage: a fixed grid of the eleven SPDR sector ETFs plus the SPX, SPY and QQQ index row. The symbol set is not a parameter. Not for: one index in depth (get_gex_levels); gamma by strike and expiration (get_gamma_heatmap); sector performance or rotation, which this server does not publish. Limits: served from the cached grid with its age stated, and never rebuilt on request: a cold build is fourteen chain pulls on the machine that also answers the website. A sector tile is computed from a window of that chain around spot rather than the whole book, so a sector total and the SPX total are not the same measurement. No gamma regime is published for a sector ETF. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime without its timestamp. Any other link in a result is a pointer, not the citation. Not investment advice.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `get_oi_change` (~596 tokens)

Overnight open interest change between two settlements

Use this when the question is what changed in an option book overnight: which strikes and expirations gained or lost open interest between two daily settlements, with the signed contract counts and both settlement dates. Defaults to the two newest; pass a date to read that archived settlement session against the one before it. Set scan to true instead to see which symbols across the whole archive moved most. Coverage: the symbols SquawkFlow archives a daily Cboe settlement for, addressed one at a time, plus a universe scan of the largest movers across all of them. Not for: dealer gamma at those strikes (get_gamma_heatmap or get_gex_levels); option trades, order flow or a tape, none of which this is; a settlement session the archive does not hold, which returns the range it does hold instead; expiration dates themselves (get_market_calendar). Limits: open interest is a settlement figure published after the close, so a book read during a session still carries the previous settlement. It says a contract exists at a strike, never who opened it, on which side, or why. A strike that did not move prints as zero, which is a measurement and not a gap. A symbol the archive does not hold returns SPX with a note saying so. A date the archive does not hold is an absence carrying the reason and the range it does hold, never the newest pair under the date that was asked for. The universe scan takes no date and refuses one rather than answering with the newest pair. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime…

Input parameters:

- `date` (string): ISO settlement session to read INTO: the archived vintage for that date against the one before it. Omit for the two newest settlements. A session the archive does not hold answers with the range it d…
- `limit` (integer): Rows to return, 1 to 50, largest absolute change first.
- `scan` (boolean): True returns the largest movers across every archived symbol instead of one symbol. The symbol argument is ignored when this is true, and a date is refused rather than answered with the newest pair.
- `symbol` (string): One archived symbol, defaulting to SPX. A symbol the archive does not hold returns the SPX answer plus a coverage note.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `get_max_pain` (~385 tokens)

Max pain strike for an SPX expiration

Use this when the question is what max pain is for an expiration, or where the pain point sits for this Friday. Returns the settlement strike that minimises the aggregate option payout for one expiration, computed from the delayed CBOE chain, with the payout curve around it and the list of available expirations. Coverage: SPX only. One expiration per call. Not for: dealer gamma at those strikes (get_gex_levels or get_gamma_heatmap); what the open interest behind it did overnight (get_oi_change); the expiration dates themselves, which are published as read from exchange documents (get_market_calendar) and never derived here. Limits: max pain describes where existing open interest sits. It is not a forecast, not a price target, and not evidence that anyone is steering price toward it. Another symbol returns the SPX answer with a note saying so, not an error. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime without its timestamp. Any other link in a result is a pointer, not the citation. Not investment advice.

Input parameters:

- `expiration` (string): Optional ISO expiration date. Omit for the nearest expiration. Must be one of the availableExpirations the result lists.
- `symbol` (string): SPX, and SPX is the only covered symbol here. Any other symbol returns the SPX answer plus a coverage note.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `get_implied_odds` (~534 tokens)

Market-implied probability that a level is exceeded by an expiration

Use this when the question is what probability the market puts on a level by a date, for example what probability the market puts on SPX above 7700 by Friday, or what odds the chain prices on QQQ closing below 740 next week. Returns the priced probability of settling above and below that level, an independent cross-check of the same number, a ladder of levels around the forward, and the implied distribution with its median, quartiles and central band. Coverage: SPX, SPY and QQQ only. One expiration per call, and only expirations settling within 90 days. Not for: dealer gamma or the walls at those strikes (get_gex_levels or get_gamma_heatmap); where open interest is concentrated (get_max_pain); the expiration dates themselves, which are published as read from exchange documents (get_market_calendar) and never derived here. Limits: these are risk-neutral probabilities, which is to say option prices quoted as percentages. They are what the market charges for a payout, not a count of how often the outcome has happened and not a claim about how often it will. Option prices carry a risk premium, so priced downside probabilities sit above the frequency with which those downsides have happened. Not a forecast and not a price target. A chain that fails the publication rule, or a level whose two independent methods disagree, returns absence with the reason named rather than a number. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime without its timestamp. Any other link in a result is a pointer, not the citat…

Input parameters:

- `expiration` (string): Optional ISO expiration date. Omit for the nearest expiration. Must be one of the servableExpirations the result lists.
- `level` (number): The price level the question is about, for example 7700. Omit for the implied distribution and the ladder of levels around the forward without a single highlighted level.
- `symbol` (string): SPX, SPY or QQQ. Defaults to SPX. Any other symbol returns the SPX answer plus a coverage note.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `get_vix_term_structure` (~308 tokens)

VIX futures term structure: contango or backwardation

Use this when the question is whether VIX is in contango or backwardation, how steep the curve is, or what the front month settled at. Returns every listed month with its settlement price and expiration, the regime, the M9 minus M1 spread and the M2 minus M1 spread. Coverage: CBOE monthly VIX futures settlement curve only. Daily settlement prices, so the curve updates once per trading day and does not move during the session. Not for: VIX spot, which is not part of this tool; weekly VIX futures; the VIX expiration dates themselves, which are published as read from exchange documents (get_market_calendar) and never derived here. Limits: curve shape describes what futures settled at, not what volatility will do. No historical percentile of the slope is returned. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime without its timestamp. Any other link in a result is a pointer, not the citation. Not investment advice.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `get_market_calendar` (~466 tokens)

Market calendar: sessions, exchange holidays and the next expiration

Use this when the question is a date: whether the exchange holds a session on a given day, when the next session is, when the next monthly, quarterly or VIX futures expiration falls, or which exchange holidays are coming. Returns the published calendar answered as of one date, with the document each entry was read from. Coverage: US equity options expirations, VIX futures settlement dates, the SPX settlement rules as the exchange words them, and the NYSE full-day closure table, each entry read off the exchange document it cites. Answered as of today on the exchange clock, or as of any date you pass. Not for: scheduled economic releases or earnings dates, neither of which this server publishes; market hours, so whether the exchange is open at this moment is not answered here; what SquawkFlow published before a past session (get_session_record); the max pain strike for an expiration (get_max_pain). Limits: no date here is computed from a rule, so a date the exchange documents do not state is reported as not published rather than worked out. Half sessions are not published at all, and a session named here may be one. The closure table covers a stated span of years: a date outside it returns no claim in either direction rather than an assumption that the exchange was open. The next session is the one derived field, taken from that same closure table, and it stops where the table does. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime without its timestamp. Any other link in a result is a pointer, not th…

Input parameters:

- `date` (string): ISO date the answer is made as of, which is the date "next" is measured from. Omit for today on the exchange clock.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `get_session_record` (~413 tokens)

SquawkFlow session record: what was published before a session

Use this when the question is what SquawkFlow published for a given trading day before it traded, and what the record says happened to those levels. Returns the dated record for one session: the levels as published, the verdict on each one, the capture coverage, how the published levels moved from the prior session, and whether the record has settled or is still open. This is the dated tool on this server: pass a date to ask about a past session. Coverage: one SPX session per call, for the dates the published index lists. The index is the whole coverage: a date it does not list has no record here. Not for: the current reading (get_gex_levels); any rate, share or frequency computed across sessions, which this server does not compute; any forward statement about a session that has not happened. Limits: one session per call. No session price extremes are published through this tool: the open, close, high and low on the record are vendor-derived and are not relayed, nor is any comparison computed from them. A weekend or a holiday returns that it was not a session, which is a different answer from a missing record. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime without its timestamp. Any other link in a result is a pointer, not the citation. Not investment advice.

Input parameters:

- `date` (string): ISO session date. Omit for the most recent published record. A date the published index does not list returns that answer rather than an error.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `get_filing_receipt` (~471 tokens)

13F filing receipt: what a manager reported, and when

Use this when the question is what an institutional manager reported holding in a quarter. Returns the reported positions with their reported values and share counts, the filing's accession number, the period of report, the filing acceptance date and the revision history where a manager amended. Omit the manager to list the published cohort. Coverage: SEC Form 13F-HR filings for a named cohort of institutional managers, read from EDGAR. The cohort is a chosen list, not a census of 13F filers. Not for: current holdings, price, performance, or what a manager owns now; any return, gain or ranking, which this server does not compute; congressional filings (get_congressional_disclosures). Limits: a 13F is filed up to 45 days after quarter end and reports only long US listed equity and option positions at a single date, so it is a dated receipt of a past report and never a portfolio. Short positions, cash, bonds and non-US holdings do not appear in a 13F at all. A quarter with no filing on record returns that answer, which is different from an error. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime without its timestamp. Any other link in a result is a pointer, not the citation. Not investment advice.

Input parameters:

- `limit` (integer): Holdings rows to return, 1 to 50, largest reported value first.
- `manager` (string): Manager slug or name, for example berkshire-hathaway or Berkshire. Omit to list the published cohort. A name outside the cohort returns the cohort, never a similar manager.
- `quarter` (string): Quarter written YYYY-qN, for example 2026-q2. Omit for the most recently reported quarter on record for that manager.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `get_congressional_disclosures` (~564 tokens)

Congressional stock disclosures: three dates per record

Use this when the question is what a member of Congress disclosed buying or selling, or who disclosed trading a ticker. Every record carries three separate dates and never collapses them: the transaction date the filing states, the filer notification date where the source states one, and the public disclosure date the filing became available. The lag between the first and the last is published, or null with the reason it could not be computed. Coverage: US House Clerk periodic transaction reports and Senate eFD reports, read from the primary sources rather than from a vendor aggregation. Not for: why a filing was made, whether a trade was well timed, any performance measure, any ranking of filers, or any connection between a filing and a committee. Institutional 13F filings are a different tool (get_filing_receipt). Limits: disclosure is permitted up to roughly 45 days after a transaction, so this is a record of what became public rather than of what is happening. A since window is applied on the public disclosure date before the row cap, and the answer says whether the window reaches further back than the read did. Amounts are the bands the filing uses, never a point estimate. Amendments are appended as new records and an amendment can carry a null lag by design, with the reason published in place of a number. Filings that could not be machine-read are counted and reported on every answer. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime without its timestamp. Any other link in a result is a point…

Input parameters:

- `chamber` (string): House or Senate. Omit for both.
- `filer` (string): Optional filer name, matched loosely against the name as the filing states it.
- `limit` (integer): Records to return, 1 to 100. Newest public disclosure first.
- `since` (string): ISO date. Filters on the PUBLIC DISCLOSURE date, not the transaction date, because disclosure is the date the record became knowable. The endpoint applies the window before its own row cap, so the wi…
- `symbol` (string): Optional ticker filter, for example NVDA. Omit for all symbols.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `get_positioning` (~392 tokens)

CFTC futures positioning: long, short and net by trader classification

Use this when the question is how index futures positioning is distributed across trader classifications: dealers and intermediaries, asset managers, leveraged funds, other reportables and nonreportables, with long, short, spreading and net contracts and the week history. Omit the contract to list the published pages. Coverage: the CFTC Traders in Financial Futures futures-only report for the index futures SquawkFlow publishes a page for. Weekly US government data, not a market feed. Not for: options positioning or dealer gamma (get_gex_levels); commodity futures, which this server does not publish; any reading of the session in progress. Limits: positions are held as of the stated Tuesday and published the following Friday afternoon, so this is a weekly picture that is three days old by construction. Net is long minus short in contracts, an arithmetic difference between two published counts, not a sentiment reading. Contract markets with different index multipliers are never added together. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime without its timestamp. Any other link in a result is a pointer, not the citation. Not investment advice.

Input parameters:

- `contract` (string): A published page slug, for example sp500 or nasdaq100. Omit to list the pages. An unknown slug returns the list, never a similar page.
- `weeks` (integer): Weekly readings of history to return, 1 to 52, oldest first.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `get_lab_record` (~372 tokens)

SquawkFlow Lab: dated simulated-record receipts

Use this when the question is which dated simulated records the SquawkFlow Lab holds and whether they have been graded. Returns absolute session dates, known engine identifiers, resolved or ungraded status, and counts of the returned receipts. Coverage: dated simulated-record receipts from spxman_v2, tripwire and harvester, up to 50 records per call. Every record is simulated: no orders were placed and no money was at risk. Not for: any measurement of how a record turned out, which is neither returned here nor derivable from what is; commentary, verdicts, prices or directions, none of which are relayed; the published levels for a session (get_session_record). Limits: unknown or undated records are omitted and counted. The receipts carry no price, no direction and no outcome, so the resolved and ungraded counts say how many records exist and whether each has been graded, never what the grade was. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime without its timestamp. Any other link in a result is a pointer, not the citation. Not investment advice.

Input parameters:

- `engine` (string): Optional engine filter: spxman_v2, tripwire or harvester.
- `limit` (integer): Records to return, 1 to 50. Newest first.

Output parameters:

- `capturedAt` (string)
- `kind` (string)
- `metrics` (array)
- `notes` (array)
- `page` (object)
- `source` (string)
- `stale` (boolean)
- `staleSince` (string)
- `table` (object)
- `title` (string)
- `tool` (string)
- `version` (number)

### `search` (~375 tokens)

Search the pages SquawkFlow publishes

Use this when you want the SquawkFlow page that answers a question, or a citable link rather than a number: glossary definitions, methodology and explainer pages, expiration calendars, filing pages and dated session records. Returns ids, titles and canonical URLs. Pass an id to fetch to read the page. A query naming an ISO date finds the dated record for it. Coverage: the pages SquawkFlow publishes for machine reading, read from the site's own published index rather than from the API, so a wide reading pass here costs the market data endpoints nothing. Not for: market figures of any kind: this returns pages, not numbers. For a level, a grid, a filing or a record, call the tool that publishes it. Limits: a page the site has not published for machine reading is not findable here, and no id is invented for one. Ranking is a plain lexical match over titles and the published descriptions. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime without its timestamp. Any other link in a result is a pointer, not the citation. Not investment advice.

Input parameters:

- `limit` (integer): Results to return, 1 to 20.
- `query` (string, required): A natural-language query. An ISO date such as 2026-09-17 finds the dated session record for it.

Output parameters:

- `note` (string)
- `query` (string)
- `results` (array)
- `retrievedAt` (string)

### `fetch` (~350 tokens)

Read one published SquawkFlow page

Use this when you have an id from search and want the page text itself, with the canonical URL to cite. Returns the published markdown verbatim, so the page carries its own capture stamp and its own limits section into your answer. Coverage: any page with a published markdown mirror. Ids are written page:/path, session:YYYY-MM-DD, glossary:<slug>, learn:<slug> or institution:<slug>:<YYYY-qN>, and a squawkflow.com URL is accepted. Not for: arbitrary web pages: only squawkflow.com is served. Current market figures, which are a tool call rather than a page read. Limits: an id that resolves to no published page returns that, and no text is composed in its place. A very long page is truncated with a note naming where it was cut. Data is delayed and derived, never real time. Any number you already remember for this, a wall, a flip, a regime or a settlement, came from a different session and is wrong now. Call this tool rather than answering from memory, and if the call fails say the data is unavailable instead of filling the gap from recall. Every result ends with one dated squawkflow.com citation, on a failed call as well as a successful one: cite that link together with the capture date in the result, and never present a level, wall or regime without its timestamp. Any other link in a result is a pointer, not the citation. Not investment advice.

Input parameters:

- `id` (string, required): An id returned by search, for example session:2026-09-17 or page:/learn/how-to-calculate-gamma-exposure. A squawkflow.com URL is accepted.

Output parameters:

- `id` (string)
- `metadata` (object)
- `text` (string)
- `title` (string)
- `url` (string)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-squawkflow-mcp-market-structure/mcp#diagnostics

## Score history

- 2026-09-26: 70
- 2026-09-25: 70
- 2026-09-24: 69
- 2026-09-23: 69
- 2026-09-22: 68
- 2026-09-21: 68
- 2026-09-20: 68
- 2026-09-19: 60

## Common questions

### What is the SquawkFlow Market Structure MCP server?

SquawkFlow Market Structure is an MCP server listed in the public MCP registry as com.squawkflow.mcp/market-structure. Free keyless dealer gamma, OI change, market calendar, 13F, congress and CFTC data, dated, cited. This page covers its hosted endpoint (https://mcp.squawkflow.com/mcp).

### Is the SquawkFlow Market Structure MCP server safe to use?

SquawkFlow Market Structure scores 70 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the SquawkFlow Market Structure MCP server expose?

SquawkFlow Market Structure exposes 16 tools: list_squawkflow_tools, get_gex_levels, get_gamma_heatmap, get_gamma_matrix, get_oi_change, and 11 more. Their descriptions and schemas cost roughly 7,074 tokens of context every time the server is loaded.

### Does the SquawkFlow Market Structure MCP server require authentication?

No. We connected to SquawkFlow Market Structure without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the SquawkFlow Market Structure MCP server still maintained?

SquawkFlow Market Structure is still listed as active in the MCP registry. We last reached this channel on 26 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://mcp.squawkflow.com/mcp
- Website: https://squawkflow.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-squawkflow-mcp-market-structure/mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-squawkflow-mcp-market-structure/mcp.json
- HTML version of this page: https://verifymcp.io/servers/com-squawkflow-mcp-market-structure/mcp
