{"server":{"name":"io.github.DevDizzle/gammarips","title":"GammaRips Options Intelligence","$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","remotes":[{"url":"https://mcp.gammarips.com/mcp","type":"streamable-http","headers":[{"name":"Authorization","isSecret":true,"description":"GammaRips API key (gr_live_...) sent as a Bearer token. Optional: 5 free-tier tools work without it; the 4 pro tools require an active subscription from https://gammarips.com/pricing."}]}],"version":"4.5.0","repository":{"url":"https://github.com/DevDizzle/gammarips-mcp","source":"github"},"websiteUrl":"https://gammarips.com/developers","description":"Anti-firehose options-flow data for AI agents: curated daily pool, features, realized outcomes."},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","isLatest":true,"updatedAt":"2026-09-01T22:07:19.959098Z","publishedAt":"2026-09-01T22:07:19.959098Z","statusChangedAt":"2026-09-01T22:07:19.959098Z"},"dev.protogrid/connectability":{"class":"R0","autonomous":true,"human_steps":[],"preferred":{"kind":"remote","idx":0},"remotes":[{"idx":0,"url":"https://mcp.gammarips.com/mcp","transport":"streamable-http","templated":false,"headers":[{"name":"Authorization","required":false,"secret":true,"value":null,"secret_names":["GAMMARIPS_TOKEN"]}],"auth":{"type":"none","location":null,"secret_name":null,"oauth":null},"protocol":{"supported_versions":["2025-11-25"],"stateless":false},"health":{"reachable":true,"uptime_30d":1,"latency_ms_p50":256,"consecutive_failures":0,"last_probe_at":"2026-10-20T07:31:46.733Z","last_ok_at":"2026-10-20T07:31:46.733Z"}}],"packages":[]},"dev.protogrid/tools":[{"name":"get_daily_report","title":"Daily Report","description":"\n    The daily intelligence report. Two `view`s:\n\n      * view=\"report\" (DEFAULT) — the full report (title, markdown content,\n        scan_date) for `date`, or the most recent report if `date` is omitted.\n      * view=\"list\" — recent reports, most recent first (scan_date, title,\n        created_at), titles deduped. Use `limit`.\n\n    Args:\n        date: report date YYYY-MM-DD (report view; default: most recent).\n        view: \"report\" (default) | \"list\".\n        limit: list view — how many reports (default 10, clamped 1-30).\n    ","annotations":{"title":"Daily Report","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:31:46.733Z"},{"name":"get_liquidity","title":"Contract Liquidity","description":"\n    FRESH (entry-day) liquidity — the read the pool's session-frozen\n    `recommended_oi`/`recommended_volume` cannot give you (the overnight sweep\n    only becomes OI the next morning). Two modes, chosen by whether you pass a\n    single `contract`:\n\n      * `contract` given — ONE contract's snapshot: open interest, session\n        volume, last trade, day range, underlying price, greeks. Cache-first\n        (the engine re-reads the pool every ~10 min in market hours); pass\n        live=true to force a fresh upstream fetch or read a contract NOT in\n        today's pool.\n      * `contract` omitted — the WHOLE current pool (or your `contracts`\n        shortlist, max 60) in ONE call — the batch companion for the ~10:00 ET\n        decision window. Most-recent read per contract with explicit `as_of`.\n\n    Deliberately serves NO bid/ask/mid/spread (not available on the current\n    data plan — absent, not NULL). Judge fill risk from open_interest (updates\n    once each morning), day_volume (live session), last_trade recency, and the\n    day range.\n\n    Args:\n        contract: OCC ticker for the single-contract mode (verbatim from the\n            pool's `recommended_contract`). Omit for the whole-pool batch.\n        scan_date: pool date YYYY-MM-DD (batch mode; default: latest pool).\n        contracts: optional shortlist filter for the batch mode (max 60).\n        live: single-contract mode — force a fresh upstream fetch.\n    ","annotations":{"title":"Contract Liquidity","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:31:46.733Z"},{"name":"get_market_calendar_status","title":"Market Calendar Status","description":"\n    Market-calendar reference. Three `view`s:\n\n      * view=\"status\" (DEFAULT) — is the US equity market open today, plus the\n        next open/close, holiday, and early-close flags (NYSE calendar,\n        deterministic — no \"is the market open?\" hallucination).\n      * view=\"scan_dates\" — which recent scan dates have GammaRips data, with\n        per-date signal counts (the raw scan's data-availability calendar).\n      * view=\"freshness\" — is the pool you are about to trade the right pool?\n        Returns schema \"pool-freshness/1\": expected_scan_date (the last NYSE\n        session before today), each pipeline stage (scan, enrichment,\n        liquidity) with its latest date, row count for the expected date,\n        and ok (true / false = overdue / null = could not check); the\n        enrichment stage also gives expected_rows (the rows the enrichment\n        filter must produce, so rows < expected_rows is a partial pool); the\n        scan_date get_pool(view=\"enriched\") serves by default\n        (pool_scan_date) and its row count (pool_rows), `fresh`, and machine\n        `reasons` (scan-stale, enrichment-stale, liquidity-stale, pool-stale,\n        pool-empty, unknown-<stage|pool>). Fail-closed: an unknown is never\n        fresh. A stage not yet due reports ok=true, due=false; before the\n        06:00 ET enrichment, fresh is false with reason pool-stale because\n        the next pool does not exist yet. No row floor is applied; apply\n        your own to pool_rows. Cached up to 60 s.\n\n    Args:\n        view: \"status\" (default) | \"scan_dates\" | \"freshness\".\n    ","annotations":{"title":"Market Calendar Status","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:31:46.733Z"},{"name":"get_playbook","title":"Methodology Playbook","description":"\n    Methodology + reference, versioned server-side (re-fetch rather than\n    caching long-term). Arg-driven:\n\n      * `field` given — the plain-English DEFINITION + role of a signal field\n        (deterministic lookup, no LLM). e.g. field=\"mom_60\". The response's\n        `available_fields` lists every documented field.\n      * `name` given — a methodology playbook (markdown) by name, OR two\n        special reference pages:\n          - name=\"schema\" (or \"data-contract\") -> the machine-readable\n            substrate DATA CONTRACT: every outcome/label column with its\n            leakage classification (feature|label|opportunity|\n            regime_telemetry|identity) and as-of boundary. Only `feature`\n            columns are safe as selection inputs.\n          - any other name -> the playbook markdown (start-here,\n            daily-workflow, run-your-own-tournament, exit-lab,\n            leakage-and-data-contract, changelog).\n      * neither — the CATALOG of published playbooks (name/title/summary),\n        plus a pointer to the field dict (`field=`) and schema page.\n\n    Args:\n        name: playbook name, or \"schema\"/\"data-contract\" for the data contract.\n        field: a signal field name to explain (overrides `name`).\n    ","annotations":{"title":"Methodology Playbook","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:31:46.733Z"},{"name":"get_pool","title":"Candidate Pool","description":"\n    The GammaRips candidate pool for a scan date. One tool, four `view`s:\n\n      * view=\"enriched\" (DEFAULT) — the AI-enriched pool: news, technicals,\n        catalyst, the recommended contract (an OTM call chosen on contract\n        liquidity), and the 60-day momentum feature `mom_60`. Funnel for\n        scan_date >= 2026-08-24 (liquid-universe era): the 100 most liquid\n        optionable names, BULLISH only, one call each, roughly 40-50 rows.\n        Liquidity decides membership, not unusual activity; the $500K UOA\n        floor is retired and `overnight_score>=1` is a cosmetic floor.\n        Earlier scan dates come from the prior UOA-gated funnel (UOA>$500K,\n        top-50 BULLISH); the two eras are not one population.\n        This is the daily candidate set your agent reasons over to its OWN\n        contract (see get_playbook(\"run-your-own-tournament\")). Served from a\n        leakage-safe view (forward-outcome columns physically stripped);\n        `summary=True` gives ~21 decision columns, `fields=[...]` a strict\n        projection, `summary=False` full rows, `offset` pages.\n      * view=\"raw\" — the wide overnight scan BEFORE the pool cut (the ranked\n        liquid universe for scan_date >= 2026-08-24; the market-wide\n        unusual-activity scan for earlier dates). Honors `direction`,\n        `min_score`, `ticker`, `limit`.\n      * view=\"features\" — point-in-time FEATURE VECTORS from the leakage-safe\n        allowlist view `enriched_features_v1` (identity + features + cohort\n        metadata only; no outcome/label/telemetry column can appear). The\n        quantitative substrate for joining against query_outcomes. Lags the\n        live pool by ~1-2 trading days.\n      * view=\"preview\" — a minimal public teaser (ticker, direction, score,\n        headline, directional UOA) for the most recent scan; no contract\n        specifics or thesis.\n\n    TIER: view=\"preview\" is FREE (no key). The enriched / raw / features views\n    are the paid product — they require an active pro subscription key; an anon\n    call to them returns `subscription_required` (get_pool(view='preview') is\n    named as the free entry point).\n\n    Liquidity caveat (all views): `recommended_oi`/`recommended_volume` are\n    scan-time snapshots, not live values; `recommended_spread_pct` is\n    permanently NULL on the current data plan — re-check with get_liquidity.\n\n    Args:\n        view: \"enriched\" (default) | \"raw\" | \"features\" | \"preview\".\n        scan_date: YYYY-MM-DD (default: latest available scan for the view).\n        direction: \"bull\"/\"bear\" prefix filter (enriched / raw).\n        ticker: exact ticker filter (enriched / raw / features).\n        min_score: overnight_score floor (raw view only; clamped 0-10).\n        limit: max rows (enriched/raw clamp 1-50, features 1-100, preview 1-20).\n        summary: enriched only — True=compact columns, False=full rows.\n        fields: enriched only — explicit strict column projection.\n        offset: enriched only — pagination offset.\n    ","annotations":{"title":"Candidate Pool","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:31:46.733Z"},{"name":"get_regime_context","title":"Market Regime Context","description":"\n    Point-in-time market-regime context for a scan date: VIX close, VIX3M,\n    SPY trend state, and the 5-day VIX delta — all as-of <= scan_date (the\n    selection point, leakage-safe), plus the engine's regime safety rail\n    evaluated on those values.\n\n    The rail: the engine fail-closes (no trade) when spot VIX > VIX3M\n    (backwardation — the market pricing imminent volatility is an adverse\n    regime for short-dated directional longs).\n\n    Served from the labeled substrate, which lags the live pool by ~1-2\n    trading days. Values are constant per scan_date.\n\n    Args:\n        scan_date: YYYY-MM-DD. Defaults to the latest scan date carrying\n            regime features.\n\n    Returns:\n        {scan_date, vix_at_scan, vix3m_at_enrich, spy_trend_at_scan,\n         vix_5d_delta_at_scan, regime_rail_pass, rail_definition}\n    ","annotations":{"title":"Market Regime Context","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:31:46.733Z"},{"name":"get_signal","title":"Signal Detail","description":"\n    Deep dive on a single ticker/contract. Two `view`s:\n\n      * view=\"detail\" (DEFAULT) — the full enriched signal for one ticker:\n        thesis, catalyst, the recommended contract, and point-in-time\n        features (leakage-safe view). `full=true` includes the long narrative\n        (news_summary, flow_intent_reasoning). If the ticker isn't in the\n        pool for the date, the error lists the dates on which it does appear.\n      * view=\"earnings\" — the doctrine earnings-window check (RM-003): the\n        next scheduled earnings date and whether it lands ON OR BEFORE the\n        contract expiration (`earnings_in_window`). The engine applies this\n        rail only at its own pick time, NOT in the pool, so pool rows CAN\n        carry earnings-window names — check every candidate yourself. Pass\n        the pool's `recommended_contract` and both ticker and expiration are\n        derived. FAIL-CLOSED: unknown date -> earnings_in_window=null, treat\n        as in-window.\n\n    Args:\n        ticker: underlying symbol (required for detail; optional for earnings\n            if `contract` is given).\n        view: \"detail\" (default) | \"earnings\".\n        scan_date: detail only — YYYY-MM-DD (default: latest for the ticker).\n        full: detail only — include the long narrative fields.\n        expiration: earnings only — option expiration YYYY-MM-DD to test.\n        contract: earnings only — OCC ticker supplying ticker+expiration.\n    ","annotations":{"title":"Signal Detail","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:31:46.733Z"},{"name":"query_outcomes","title":"Realized Outcomes","description":"\n    The realized-outcome history behind the pool: use it to set a target and\n    a stop from what past pool contracts actually did. One tool, nine\n    `view`s. A pool-wide result under one fixed exit describes that one rule,\n    not a forecast for the plan you build.\n\n      * view=\"labels\" (DEFAULT) — row-level realized bracket LABELS joined to\n        point-in-time features. horizon \"same_day\" (live V7.1 GIGO +40/-30) or\n        \"3d\" (legacy +80/-60) — never pooled. NULL-label and illiquid rows\n        excluded (counts in meta). `aggregate_only=True` returns summary stats\n        instead of rows. Filters: scan_date_from/to, ticker, delta_min/max,\n        min_overnight_score, exit_reason.\n      * view=\"summary\" — grouped aggregates over the labeled pool. `group_by`\n        one of none|delta_bucket|overnight_score|premium_score|exit_reason|\n        day_of_week|moneyness_bucket.\n      * view=\"surface\" — the OPPORTUNITY SURFACE: per-contract realized MFE/MAE\n        excursions with NO exit applied (profit potential, exit free). Uses\n        scan_date OR a `days` lookback, `ticker`, `delta_min/max`,\n        `include_open`. `aggregate_only=True` returns MFE/MAE quantiles over\n        the FULL filtered set — use it for exit design. The row mode is capped\n        at 200 and truncates oldest-first WITHIN a scan_date, so its oldest\n        date is a highest-MFE-only slice; it reports `truncated`,\n        `matched_rows`, and `partial_scan_date` so you can see that happen.\n      * view=\"harvest\" — the touch-probability curve: P(premium touched +X%)\n        with CIs, day-of-peak buckets, stop-touch rates. `targets`, `stops`,\n        date range, delta band.\n      * view=\"exit_rule\" — RESEARCH-ONLY \"bring your exit, we score it\":\n        rule=\"bracket\" (target_pct/stop_pct) or rule=\"trailing\" (trail_pct,\n        activation_pct) scored against the surface / minute tape.\n      * view=\"signal_performance\" — UNDERLYING-STOCK direction outcomes for\n        the broad pool (NOT option PnL). Filters scan_date, ticker, direction,\n        outcome.\n      * view=\"win_rate\" — aggregate UNDERLYING-direction win rate over `days`\n        (NOT option PnL; headline key carries its universe).\n      * view=\"positions\" — history of a RETIRED engine test: closed paper\n        trades from the engine's former one-pick-a-day tournament under one\n        fixed exit (retired 2026-09-28). Not the product and not the pool; do\n        not use it to judge the pool. Row-level, over `days`, `limit`.\n      * view=\"performance\" — aggregate of that retired test over `days`\n        (`direction`, `min_premium_score`, `policy_version`). Same caveat:\n        history of one retired rule, not a GammaRips result. When it has no\n        closed trades, every aggregate is `null` and `total_trades` is 0.\n\n    All returns are FRACTIONS (0.40 = +40%). Realized data serves closed\n    windows only. Paper-traded research data; not investment advice.\n\n    Args:\n        view: which surface (see above). Default \"labels\".\n        horizon: \"same_day\" | \"3d\" (labels/summary/exit_rule). If omitted, the\n            native default per view is used: labels/summary => \"same_day\" (the\n            live GIGO policy), exit_rule => \"3d\" (its excursion window).\n        group_by: summary grouping dimension.\n        scan_date / scan_date_from / scan_date_to: date filters (per view).\n        ticker / direction / delta_min / delta_max / min_overnight_score /\n            exit_reason / outcome: row/aggregate filters (per view).\n        days: lookback window (surface/win_rate/positions/performance).\n        limit: max rows (labels 1-200, signal_performance 1-50, positions 1-200).\n        aggregate_only: labels/surface views — summary stats instead of rows.\n            On `surface` this is also the only mode immune to the 200-row cap.\n        include_open: surface view — include not-yet-closed windows.\n        targets / stops: harvest view — PERCENT grids.\n        target_pct / stop_pct / rule / trail_pct / activation_pct: exit_rule view.\n        policy_version: positions/performance cohort filter. The live default\n            is the PAIR (policy label + cohort start date) — the label alone\n            does not define the cohort, since disowned cohorts remain in the\n            ledger under the same label. Responses carry `cohort_start`; a zero\n            row_count under the live cohort means it has not accrued closed\n            trades yet, not that there is no track record, and the aggregates\n            come back `null` rather than 0.0. Pass \"all\" for every era, but\n            note that \"all\" returns cohorts the engine has REPUDIATED — not\n            merely older exit mechanics — so it is not a track record and must\n            not be aggregated into one. Read the response `note` before\n            quoting any number from it.\n        min_premium_score: performance view floor.\n    ","annotations":{"title":"Realized Outcomes","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:31:46.733Z"},{"name":"replay_contract","title":"Contract Price Replay","description":"\n    Raw option price data for YOUR OWN entry/exit rule. This server does NOT\n    simulate or validate exits — it returns bars (the RM-002/RM-004 boundary).\n    Two `granularity` modes:\n\n      * granularity=\"minute\" (DEFAULT) — the intraday minute path for one\n        session (`date` required). Optionally pass a bracket (target_pct/\n        stop_pct, PERCENT of the 10:00 ET anchor) and the response also reports\n        the exact FIRST-CROSSING sequence measured from the tape. Pool\n        excursion windows are served from the engine's minute-path table;\n        anything else falls back to an upstream minute fetch.\n      * granularity=\"day\" — the DAILY mark series (OHLCV) over a date range,\n        to mark a live paper position day by day or replay a closed one. Uses\n        `from_date`/`to_date` (span capped at 120 days); `date` is ignored.\n\n    Option tape is THIN — minutes/days with no prints have no bar; treat\n    touch times as evidence, not tick-perfect truth. Paper-trade research\n    data; not investment advice.\n\n    Args:\n        contract: OCC option ticker (e.g. \"O:UNIT260717C00030000\").\n        date: minute mode — ET session date YYYY-MM-DD (required).\n        granularity: \"minute\" (default) | \"day\".\n        target_pct: minute mode — optional +X% level for first-crossing.\n        stop_pct: minute mode — optional -Y% level for first-crossing.\n        from_date: day mode — start YYYY-MM-DD (default: 30d before to_date).\n        to_date: day mode — end YYYY-MM-DD inclusive (default: today ET).\n    ","annotations":{"title":"Contract Price Replay","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:31:46.733Z"}],"dev.protogrid/trust":{"score":94,"components":{"hygiene":100,"liveness":100,"freshness":85,"provenance":90},"drivers":["+repository","+namespace-matches-repo","+website","+reachable","+uptime-100%","~updated-48d-ago"],"flags":[],"blocked":false,"computed_at":"2026-10-20T08:47:06.002Z","disclaimer":"Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed."},"dev.protogrid/quality":{"score":77,"label":"good","components":{"auth":null,"hygiene":93,"protocol":75,"stability":50,"dependencies":null},"checks":[{"id":"protocol.modern","detail":"newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28","status":"warn","category":"protocol"},{"id":"protocol.stateless","detail":"only applies to 2026-07-28 servers","status":"na","category":"protocol"},{"id":"protocol.transport","detail":"streamable HTTP","status":"pass","category":"protocol"},{"id":"protocol.list_ttl","detail":"only applies to 2026-07-28 servers","status":"na","category":"protocol"},{"id":"auth.prm","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.as_metadata","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.cimd","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.secret_in_url","detail":"no templated URL","status":"na","category":"auth"},{"id":"tools.descriptions","detail":"every tool has a description","status":"pass","category":"hygiene"},{"id":"tools.description_length","detail":"7 tools have descriptions over 1,024 characters, which crowds the context","status":"warn","category":"hygiene"},{"id":"tools.schemas","detail":"every tool has an object input schema","status":"pass","category":"hygiene"},{"id":"tools.annotations","detail":"9 of 9 tools declare readOnlyHint or destructiveHint","status":"pass","category":"hygiene"},{"id":"tools.directory_hints","detail":"every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint","status":"pass","category":"hygiene"},{"id":"tools.token_cost","detail":"about 5,802 tokens to load every tool","status":"pass","category":"hygiene"},{"id":"tools.api_dump","detail":"tools are not a one-to-one API dump","status":"pass","category":"hygiene"},{"id":"stability.changes","detail":"4 tool changes in 30 days","status":"pass","category":"stability"},{"id":"stability.rug_pull","detail":"1 tools kept their name but changed most of their description in 30 days; review before trusting them","status":"fail","category":"stability"},{"id":"deps.known_vulns","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.mcp_sdk_version","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.resolvable","detail":"no npm or PyPI package","status":"na","category":"dependencies"}],"drivers":["-stability.rug_pull","~protocol.modern","~tools.description_length"],"flags":[],"tool_count":9,"token_estimate":5802,"tools_hash":"1cb46d996cff72f10b488b34df3e9c7a","tools_changed_at":"2026-10-03T20:14:42.765Z","computed_at":"2026-10-20T08:58:21.337Z","disclaimer":"Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed."},"dev.protogrid/identity":{"canonical_id":"io.github.DevDizzle/gammarips","aliases":[],"alias_count":0,"repository_key":"github:devdizzle/gammarips-mcp","owner":{"verified":false,"method":null,"since":null}}},"next_actions":[{"action":"list_tools","description":"Every current tool with input schemas","href":"/v1/servers/io.github.DevDizzle%2Fgammarips/tools","arguments":{"name":"io.github.DevDizzle/gammarips"}},{"action":"get_connection","description":"Minimal connection block for the preferred remote or package","href":"/v1/servers/io.github.DevDizzle%2Fgammarips/connection?target=mcpServers","arguments":{"name":"io.github.DevDizzle/gammarips","target":"mcpServers"}},{"action":"search","description":"Find other servers by intent","href":"/v1/search?q={query}","arguments":{"q":"{query}"}}]}