Public log

@edgedepth/research-mcp

Search recorded crypto microstructure through the EdgeDepth Research API as deterministic MCP tools.

npm · fingerprint e64dd5e30a88944bfa554ae1 · repository · RSS

23tools
3recorded versions
46dtracked
last checked 12 Oct

What changed

Changed 2026-10-07 13:31 UTC

3 descriptions rewritten, 2 schema or annotation changes with the description left byte-identical, 5 tools added.

+ tool added: get_hypothesis

+ tool added: get_investigation_assessment

--- pinned/list_instruments
+++ observed/list_instruments
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Use this when you need to verify supported symbols, recorded coverage, data availability, or whether an instrument is a session-bound TradFi perpetual before running or describing research. Use symbols for selected full records; use full only when canonical whole-universe bytes are required. Do not use this to support live-price, personalized buy/sell or trade-execution requests, even to check whether a market is supported. It does not return historical outcomes. This is a free deterministic read.",
+   "description": "Use this when you need to verify supported symbols, recorded coverage, data availability, or whether an instrument remains available before running or describing research. Use symbols for selected full records; use full only when canonical whole-universe bytes are required. Do not use this to support live-price, personalized buy/sell or trade-execution requests, even to check whether a market is supported. It does not return historical outcomes. This is a free deterministic read.",
    "execution": {
      "taskSupport": "forbidden"
    },
+       "exchange": {
+         "description": "Recorded venue. Defaults to binancef. Use hl for Hyperliquid; run studies separately per venue, with explicit overlapping dates and missing-feature checks.",
+         "enum": [
+           "binancef",
+           "hl"
+         ],
+         "type": "string"
+       },
        "full": {
          "description": "True for the verbatim ~360 KB canonical universe bytes.",
          "type": "boolean"
--- pinned/outcome_first
+++ observed/outcome_first
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Use this when the user starts from an OUTCOME (a move of a stated size, in a stated direction, inside a stated horizon) and wants to know what the record was doing in the minutes before every move like it. It returns the outcome population with its denominators, a feasibility verdict, and one row per reading per lead-up offset carrying TWO counted shares: how often that reading sat outside its usual band before these moves, and how often it did so across every eligible minute in the same scope. Every row is labelled selected on the outcome. A row is NOT a rule, a candidate, a finding or a predictor, and the row order is the gap between those two shares, which is display order and not a ranking: never present a row as something that works. The setup-first rerun each row carries lets run_scan count how often the original move followed the condition across all eligible minutes. You may describe both row shares immediately; do not claim a forward rate until that rerun returns. The same-period rerun remains exploratory, not independent validation. Keep its original target, using full_outcomes if the projection omits that rung. Do not use this to filter outcomes, to mine for a strategy, or to recommend a trade. A scope with too few realised moves is REFUSED with the counts and four honest adjustments rather than answered underpowered, and a refusal spends no allowance. Require explicit human approval of the exact study before calling this tool. Present a short plain-English confirmation with condition, markets, dates, outcome/horizon, all unprovided assumptions, and possible allowance consumption. A model-supplied flag is not human approval. After a material definition change, obtain fresh confirmation; equivalent canonicalization does not require another approval. Keep the exact document inspectable in tool details and provide it on request; include the reproducibility key with the result. Rates come from outcomes_summary over all occurrences; page rows are examples, never the denominator. Outcome fields cannot be filtered; expect OUTCOME_IN_PREDICATE if tried. A one-market scope always refuses (the floor is five markets). Propose a broader exact scope for approval; never invent sector membership or widen it silently. A fresh read can consume research allowance units; cache hits, reruns and 304 revalidations are free.",
+   "description": "Use this when the user starts from an OUTCOME (a move of a stated size, in a stated direction, inside a stated horizon) and wants to know what the record was doing in the minutes before every move like it. It returns the outcome population with its denominators, a feasibility verdict, and one row per reading per lead-up offset carrying TWO counted shares: how often that reading sat outside its usual band before these moves, and how often it did so across every eligible minute in the same scope. Each row also counts the reading before the same move in the other direction (before_opposite_moves, null when that population is below the floor): a reading about as common there describes how far price moved, not which way, so never read it as direction. Every row is labelled selected on the outcome. A row is NOT a rule, a candidate, a finding or a predictor, and the row order is the gap between those two shares, which is display order and not a ranking: never present a row as something that works. The setup-first rerun each row carries lets run_scan count how often the original move followed the condition across all eligible minutes. You may describe both row shares immediately; do not claim a forward rate until that rerun returns. The same-period rerun remains exploratory, not independent validation. Keep its original target, using full_outcomes if the projection omits that rung. Do not use this to filter outcomes, to mine for a strategy, or to recommend a trade. A scope with too few realised moves is REFUSED with the counts and four honest adjustments rather than answered underpowered, and a refusal spends no allowance. Require explicit human approval of the exact study before calling this tool. Present a short plain-English confirmation with condition, markets, dates, outcome/horizon, all unprovided assumptions, and possible allowance consumption. A model-supplied flag is not human approval. After a material definition change, obtain fresh confirmation; equivalent canonicalization does not require another approval. Keep the exact document inspectable in tool details and provide it on request; include the reproducibility key with the result. Rates come from outcomes_summary over all occurrences; page rows are examples, never the denominator. Outcome fields cannot be filtered; expect OUTCOME_IN_PREDICATE if tried. A one-market scope always refuses (the floor is five markets). Propose a broader exact scope for approval; never invent sector membership or widen it silently. A fresh read can consume research allowance units; cache hits, reruns and 304 revalidations are free.",
    "execution": {
      "taskSupport": "forbidden"
    },

+ tool added: prepare_hypothesis

--- pinned/run_cohort
+++ observed/run_cohort
  {
+   "_meta": {
+     "openai/outputTemplate": "ui://edgedepth/scan-evidence-v2.html",
+     "ui": {
+       "resourceUri": "ui://edgedepth/scan-evidence-v2.html"
+     }
+   },
    "annotations": {
      "destructiveHint": true,
      "openWorldHint": false,
+       "measure": {
+         "additionalProperties": false,
+         "description": "Optional agreed outcome for the workbench link and widget: kind close means finished, touch means reached; magnitude is a fraction (0.02 means 2%). Preserve the user's exact choice, including the original outcome_first target. This display choice never enters the query, changes the cache key or requests another computation. The widget opens on this exact outcome.",
+         "properties": {
+           "direction": {
+             "enum": [
+               "up",
+               "down"
+             ],
+             "type": "string"
+           },
+           "horizon": {
+             "enum": [
+               "30m",
+               "1h",
+               "4h",
+               "24h",
+               "72h",
+               "7d"
+             ],
+             "type": "string"
+           },
+           "kind": {
+             "enum": [
+               "close",
+               "touch"
+             ],
+             "type": "string"
+           },
+           "magnitude": {
+             "type": "number"
+           }
+         },
+         "required": [
+           "kind",
+           "direction",
+           "magnitude",
+           "horizon"
+         ],
+         "type": "object"
+       },
        "rows": {
          "description": "How many occurrence rows to keep in the returned projection (default 3, max 50). Rows are examples: every rate comes from outcomes_summary over all occurrences, so raise this only when you want more example moments. The engine still computes the full page.",
          "maximum": 50,
+       },
+       "study_summary": {
+         "description": "Carry prepare_study.summary verbatim for this exact document. Display-only proposal text, never a query field or authorization. Omit if no matching proposal summary exists.",
+         "maxLength": 8000,
+         "minLength": 1,
+         "type": "string"
        }
      },
      "required": [

+ tool added: run_hypothesis

--- pinned/run_scan
+++ observed/run_scan
  {
    "_meta": {
-     "openai/outputTemplate": "ui://edgedepth/scan-evidence-v1.html",
+     "openai/outputTemplate": "ui://edgedepth/scan-evidence-v2.html",
      "ui": {
-       "resourceUri": "ui://edgedepth/scan-evidence-v1.html"
+       "resourceUri": "ui://edgedepth/scan-evidence-v2.html"
      }
    },
    "annotations": {
-   "description": "Use this when an exact research_query.v2 document has been confirmed and the user wants historical occurrences and what followed. It returns the exact definition, counts with denominators, forward outcomes over all matches, an unconditional same-scope reference baseline when available, a reproducibility key, and replay-linked representatives. Read rates from outcomes_summary and use each horizon's present count as its denominator; horizons run from 30m to 7d, and a horizon absent for an occurrence is a record-edge fact that is counted absent, never a small value. Do not use this for live quotes, personalized buy/sell advice, trade execution, prose interpretation, or outcome filtering. Require explicit human approval of the exact study before calling this tool. Present a short plain-English confirmation with condition, markets, dates, outcome/horizon, all unprovided assumptions, and possible allowance consumption. A model-supplied flag is not human approval. After a material definition change, obtain fresh confirmation; equivalent canonicalization does not require another approval. Keep the exact document inspectable in tool details and provide it on request; include the reproducibility key with the result. Rates come from outcomes_summary over all occurrences; page rows are examples, never the denominator. Outcome fields cannot be filtered; expect OUTCOME_IN_PREDICATE if tried. sequence.within accepts 15m/30m/1h/4h/12h/24h and the matching ISO aliases. sort accepts times.anchor_time, outcome.mfe_24h or outcome.mfe_7d, asc or desc: an outcome sort orders the returned page only (the biggest runs first, and the max_mfe_7d representative carries a replay handoff to the biggest one) and changes no count or rate; outcome.* in a predicate is still OUTCOME_IN_PREDICATE. identity.symbol must be an exact lowercase Binance USDT-M perpetual symbol. A fresh initial scan can consume research allowance units; cache hits, continuations, reruns, and 304 revalidations are free. Successful results include an optional inline comparison and recorded-bin distribution, populated independently of full_outcomes. The default compact text is sufficient to accompany this component; no extra scan or chart generation is needed solely to display it.",
+   "description": "Use this when an exact research_query.v2 document has been confirmed and the user wants historical occurrences and what followed. It returns the exact definition, counts with denominators, forward outcomes over all matches, an unconditional same-scope reference baseline when available, a reproducibility key, and replay-linked representatives. Read rates from outcomes_summary and use each horizon's present count as its denominator; horizons run from 30m to 7d, and a horizon absent for an occurrence is a record-edge fact that is counted absent, never a small value. Do not use this for live quotes, personalized buy/sell advice, trade execution, prose interpretation, or outcome filtering. Require explicit human approval of the exact study before calling this tool. Present a short plain-English confirmation with condition, markets, dates, outcome/horizon, all unprovided assumptions, and possible allowance consumption. A model-supplied flag is not human approval. After a material definition change, obtain fresh confirmation; equivalent canonicalization does not require another approval. Keep the exact document inspectable in tool details and provide it on request; include the reproducibility key with the result. Rates come from outcomes_summary over all occurrences; page rows are examples, never the denominator. Outcome fields cannot be filtered; expect OUTCOME_IN_PREDICATE if tried. sequence.within accepts 15m/30m/1h/4h/12h/24h and the matching ISO aliases. sort accepts times.anchor_time, outcome.mfe_24h or outcome.mfe_7d, asc or desc: an outcome sort orders the returned page only (the biggest runs first, and the max_mfe_7d representative carries a replay handoff to the biggest one) and changes no count or rate; outcome.* in a predicate is still OUTCOME_IN_PREDICATE. identity.symbol must be an exact lowercase Binance USDT-M perpetual symbol. A fresh initial scan can consume research allowance units; cache hits, continuations, reruns, and 304 revalidations are free. Successful results include an optional inline comparison and recorded-bin distribution, populated independently of full_outcomes. The default compact text is sufficient to accompany this component; no extra scan or chart generation is needed solely to display it. Compact text leads with the agreed outcome, counts and limitations. Long query lists become labelled non-executable previews; oversized definition links are omitted. full_counts restores the exact query, daily counts and handoff.",
    "execution": {
      "taskSupport": "forbidden"
    },
-         "description": "True returns the engine's verbatim canonical bytes with no projection at all: every zero-count instrument, every page row with its whole setup vector, the per-occurrence outcomes map and every empty ladder rung. Universe scans are hundreds of KB this way and can exceed a client tool-result limit. Default returns a projection that only ever REMOVES, and states each removal.",
+         "description": "True returns the engine's verbatim canonical bytes with no projection at all: every zero-count instrument, every page row with its whole setup vector, the per-occurrence outcomes map and every empty ladder rung. Universe scans are hundreds of KB this way and can exceed a client tool-result limit. Default returns a stated display projection with list receipts and a monthly match calendar; the exact request is never rewritten.",
          "type": "boolean"
        },
        "full_outcomes": {
-         "description": "Optional agreed outcome for the workbench link only: kind close means finished, touch means reached; magnitude is a fraction (0.02 means 2%). Preserve the user's exact choice, including the original outcome_first target. This display choice never enters the query, changes the cache key, requests another computation, or changes the inline closing-return chart.",
+         "description": "Optional agreed outcome for the workbench link and widget: kind close means finished, touch means reached; magnitude is a fraction (0.02 means 2%). Preserve the user's exact choice, including the original outcome_first target. This display choice never enters the query, changes the cache key or requests another computation. The widget opens on this exact outcome.",
          "properties": {
            "direction": {
              "enum": [
-         "description": "How many occurrence rows to keep in the returned projection (default 3, max 50). Rows are examples: every rate comes from outcomes_summary over all occurrences, so raise this only when you want more example moments. The engine still computes the full page.",
+         "description": "Example rows to retain: default 1 in compact text, 3 with full_outcomes; max 50. Rows are examples, never the denominator. full_counts restores all canonical page rows.",
          "maximum": 50,
          "minimum": 0,
          "type": "integer"
+       },
+       "study_summary": {
+         "description": "Carry prepare_study.summary verbatim for this exact document. Display-only proposal text, never a query field or authorization. Omit if no matching proposal summary exists.",
+         "maxLength": 8000,
+         "minLength": 1,
+         "type": "string"
        }
      },
      "required": [
--- pinned/run_stratified
+++ observed/run_stratified
  {
+   "_meta": {
+     "openai/outputTemplate": "ui://edgedepth/scan-evidence-v2.html",
+     "ui": {
+       "resourceUri": "ui://edgedepth/scan-evidence-v2.html"
+     }
+   },
    "annotations": {
      "destructiveHint": true,
      "openWorldHint": false,
+       },
+       "measure": {
+         "additionalProperties": false,
+         "description": "Optional agreed outcome for the workbench link and widget: kind close means finished, touch means reached; magnitude is a fraction (0.02 means 2%). Preserve the user's exact choice, including the original outcome_first target. This display choice never enters the query, changes the cache key or requests another computation. The widget opens on this exact outcome.",
+         "properties": {
+           "direction": {
+             "enum": [
+               "up",
+               "down"
+             ],
+             "type": "string"
+           },
+           "horizon": {
+             "enum": [
+               "30m",
+               "1h",
+               "4h",
+               "24h",
+               "72h",
+               "7d"
+             ],
+             "type": "string"
+           },
+           "kind": {
+             "enum": [
+               "close",
+               "touch"
+             ],
+             "type": "string"
+           },
+           "magnitude": {
+             "type": "number"
+           }
+         },
+         "required": [
+           "kind",
+           "direction",
+           "magnitude",
+           "horizon"
+         ],
+         "type": "object"
+       },
+       "study_summary": {
+         "description": "Carry prepare_study.summary verbatim for this exact document. Display-only proposal text, never a query field or authorization. Omit if no matching proposal summary exists.",
+         "maxLength": 8000,
+         "minLength": 1,
+         "type": "string"
        }
      },
      "required": [

+ tool added: save_hypothesis

Changed 2026-10-05 14:37 UTC

7 descriptions rewritten, 1 schema or annotation change with the description left byte-identical, 7 tools added.

+ tool added: get_investigation_bundle

--- pinned/get_report
+++ observed/get_report
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Use this when the user wants to list citable public EdgeDepth reports or retrieve one by its 8-character canonical hash. A fetched report includes its exact definition, pinned result, revision, and integrity status. Do not use this to present invalid or withdrawn reports as healthy, and do not use this for unpublished user research. This is a free read.",
+   "description": "Use this when the user wants to list citable public EdgeDepth reports or retrieve one by its 8-character canonical hash. Default is a compact 1h overview with counts and stored integrity status; full:true returns the exact definition and pinned result. Do not use this to present invalid or withdrawn reports as healthy, and do not use this for unpublished user research. This is a free read.",
    "execution": {
      "taskSupport": "forbidden"
    },
+       "full": {
+         "description": "Return complete pinned API bytes only when exact evidence is needed.",
+         "type": "boolean"
+       },
        "hash8": {
          "description": "Optional 8 lowercase hex canonical id. Omit to list public reports.",
          "pattern": "^[0-9a-f]{8}$",

+ tool added: ground_screenshots

--- pinned/interpret_prose
+++ observed/interpret_prose
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Use this when the user asks a historical market-microstructure question in prose and no exact query document exists. It returns a proposed research_query.v2 document, unsupported fragments, and clarification notices; it never runs the scan. Show the exact proposal, then call run_scan only after confirmation. Do not use this for live quotes, trading advice, trade execution, or when the caller already supplied an exact document. This free proposal step uses the configured external language interpreter.",
+   "description": "Use this when raw-prose clients need fallback interpretation or the host cannot construct structured intent. Prefer prepare_study for capable AI hosts; this tool adds an external interpreter call. Pass the user question unchanged, without filling in unstated thresholds, dates, markets or outcomes. It returns a proposed research_query.v2 document, chip provenance, unsupported fragments, and clarification notices; it never runs the scan. Show one short plain-English proposal with condition, markets, dates, outcome/horizon and metering. Label inferred or unprovided values as assumptions needing approval. Keep JSON and diagnostics in tool details, available on request. Resolve unsupported fragments and ask only material questions. Call run_scan only after explicit human confirmation, submitting the same document. Do not use this for live quotes, trading advice, trade execution, or when the caller already supplied an exact document. This free proposal step uses the configured external language interpreter.",
    "execution": {
      "taskSupport": "forbidden"
    },
-         "description": "The market question in plain language, e.g. \"vpin above 0.7 then a liquidation surge within 30m on majors last week\".",
+         "description": "The user question verbatim. Do not expand it with thresholds, dates, markets or outcome definitions the user did not supply. For example: \"vpin above 0.7 then a liquidation surge within 30m on majors last week\".",
          "maxLength": 500,
          "minLength": 1,
          "type": "string"

+ tool added: investigate_move

--- pinned/list_features
+++ observed/list_features
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Use this when you need the valid EdgeDepth query grammar, supported feature ids, operators, windows, limits, or machine-actionable error codes before constructing or repairing a query document. Do not use this to answer a market question; it returns capabilities, not historical evidence. This is a free deterministic read.",
+   "description": "Use this when you need the valid EdgeDepth query grammar, supported feature ids, operators, windows, limits, or machine-actionable error codes before constructing or repairing a query document. For a natural-language question, construct structured intent and use prepare_study; it already uses the registry-backed interpreter. Do not use this to answer a market question; it returns capabilities, not historical evidence. Do not invoke even this capability lookup for live prices, personalized buy/sell advice or trade execution. The whole registry is large: pass search or feature_ids to read one family, and compact to drop the per-feature prose. This is a free deterministic read.",
    "execution": {
      "taskSupport": "forbidden"
    },
-     "properties": {},
+     "$schema": "http://json-schema.org/draft-07/schema#",
+     "additionalProperties": false,
+     "properties": {
+       "compact": {
+         "description": "True drops each feature's prose description and the instrument examples, keeping dtype, range, unit, observation_scope and implemented. Use it once you know what a feature measures and only need the shape.",
+         "type": "boolean"
+       },
+       "feature_ids": {
+         "description": "Exact feature ids to return, e.g. [\"feature.vpin\",\"feature.funding_rate\"]. A bare name is also matched against feature.<name>. Ids with no match are named back.",
+         "items": {
+           "type": "string"
+         },
+         "maxItems": 64,
+         "type": "array"
+       },
+       "search": {
+         "description": "Case-insensitive substring over feature ids and descriptions, e.g. \"liquidation\", \"funding\", \"candle\". Returns the matching features with the closed grammar (operators, windows, sequence rules, limits, error codes) intact.",
+         "maxLength": 64,
+         "minLength": 1,
+         "type": "string"
+       }
+     },
      "type": "object"
    },
    "name": "list_features",
--- pinned/list_instruments
+++ observed/list_instruments
  {
    "annotations": {
      "destructiveHint": false,
-   "description": "Use this when you need to verify supported symbols, recorded coverage, data availability, or whether an instrument is a session-bound TradFi perpetual before running or describing research. Use symbols for selected full records; use full only when canonical whole-universe bytes are required. Do not use this for live prices or historical outcomes. This is a free deterministic read.",
+   "description": "Use this when you need to verify supported symbols, recorded coverage, data availability, or whether an instrument is a session-bound TradFi perpetual before running or describing research. Use symbols for selected full records; use full only when canonical whole-universe bytes are required. Do not use this to support live-price, personalized buy/sell or trade-execution requests, even to check whether a market is supported. It does not return historical outcomes. This is a free deterministic read.",
    "execution": {
      "taskSupport": "forbidden"
    },
--- pinned/next_page
+++ observed/next_page
  {
    "annotations": {
      "destructiveHint": false,
-         "description": "True returns the engine's verbatim canonical bytes, including every zero-count instrument in counts_by_symbol. Default omits zero-count entries.",
+         "description": "True returns the engine's verbatim canonical bytes with no projection at all. Default returns a projection that only ever REMOVES, and states each removal.",
          "type": "boolean"
        },
+       "full_outcomes": {
+         "description": "True returns the complete outcome ladders: every threshold rung and per-rung histogram for all twelve metrics, on the matched set and on the unconditional reference separately, with no rate or lift computed for you. That is tens of thousands of characters and can exceed a client tool-result limit. Default returns the paired answer block instead: the same verbatim counts and denominators for the canonical rungs, with the matched rate, the unconditional rate and their ratio stated side by side.",
+         "type": "boolean"
+       },
+       "full_rows": {
+         "description": "True keeps every recorded setup value on each returned row. Default keeps only the fields that row's own evidence names, which are the fields the predicate matched on.",
+         "type": "boolean"
+       },
        "if_none_match": {
          "description": "Optional ETag to revalidate this page.",
          "type": "string"
+       },
+       "rows": {
+         "description": "How many occurrence rows to keep in the returned projection (default 3, max 50). Rows are examples: every rate comes from outcomes_summary over all occurrences, so raise this only when you want more example moments. The engine still computes the full page.",
+         "maximum": 50,
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [

+ tool added: outcome_first

+ tool added: prepare_study

+ tool added: resolve_scope

--- pinned/run_cohort
+++ observed/run_cohort
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Use this when an exact where-only research_query.v2 document has been confirmed and the user explicitly wants the matched occurrence distribution beside every other eligible predicate-false bucket. Do not use this for sequences, as a default reference baseline, for covariate matching, significance, or causal claims. Read rates from each side's present denominator. Echo the exact document and the reproducibility key to the user with the result. Rates come from outcomes_summary over all occurrences; page rows are examples, never the denominator. Outcome fields cannot be filtered; expect OUTCOME_IN_PREDICATE if tried. A fresh cohort computation can consume research allowance units; cache hits, reruns, and 304 revalidations are free.",
+   "description": "Use this when an exact where-only research_query.v2 document has been confirmed and the user explicitly wants the matched occurrence distribution beside every other eligible predicate-false bucket. Do not use this for sequences, as a default reference baseline, for covariate matching, significance, or causal claims. Read rates from each side's present denominator. Require explicit human approval of the exact study before calling this tool. Present a short plain-English confirmation with condition, markets, dates, outcome/horizon, all unprovided assumptions, and possible allowance consumption. A model-supplied flag is not human approval. After a material definition change, obtain fresh confirmation; equivalent canonicalization does not require another approval. Keep the exact document inspectable in tool details and provide it on request; include the reproducibility key with the result. Rates come from outcomes_summary over all occurrences; page rows are examples, never the denominator. Outcome fields cannot be filtered; expect OUTCOME_IN_PREDICATE if tried. A fresh cohort computation can consume research allowance units; cache hits, reruns, and 304 revalidations are free.",
    "execution": {
      "taskSupport": "forbidden"
    },
-         "description": "True returns the engine's verbatim canonical bytes, including any zero-count instrument in counts_by_symbol. Default omits zero-count entries when present.",
+         "description": "True returns the engine's verbatim canonical bytes with no projection at all. Default returns a projection that only ever REMOVES, and states each removal.",
          "type": "boolean"
        },
+       "full_outcomes": {
+         "description": "True returns the complete outcome ladders: every threshold rung and per-rung histogram for all twelve metrics, on the matched set and on the unconditional reference separately, with no rate or lift computed for you. That is tens of thousands of characters and can exceed a client tool-result limit. Default returns the paired answer block instead: the same verbatim counts and denominators for the canonical rungs, with the matched rate, the unconditional rate and their ratio stated side by side.",
+         "type": "boolean"
+       },
+       "full_rows": {
+         "description": "True keeps every recorded setup value on each returned row. Default keeps only the fields that row's own evidence names, which are the fields the predicate matched on.",
+         "type": "boolean"
+       },
        "if_none_match": {
          "description": "An ETag from a previous cohort run to revalidate: identical data answers 304 and spends nothing. Pass it back verbatim (it may be weak, W/\"...\").",
          "type": "string"
+       },
+       "rows": {
+         "description": "How many occurrence rows to keep in the returned projection (default 3, max 50). Rows are examples: every rate comes from outcomes_summary over all occurrences, so raise this only when you want more example moments. The engine still computes the full page.",
+         "maximum": 50,
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/run_scan
+++ observed/run_scan
  {
+   "_meta": {
+     "openai/outputTemplate": "ui://edgedepth/scan-evidence-v1.html",
+     "ui": {
+       "resourceUri": "ui://edgedepth/scan-evidence-v1.html"
+     }
+   },
    "annotations": {
      "destructiveHint": true,
      "openWorldHint": false,
-   "description": "Use this when an exact research_query.v2 document has been confirmed and the user wants historical occurrences and what followed. It returns the exact definition, counts with denominators, forward outcomes over all matches, an unconditional same-scope reference baseline when available, a reproducibility key, and replay-linked representatives. Read rates from outcomes_summary and use each horizon's present count as its denominator. Do not use this for live quotes, personalized buy/sell advice, trade execution, prose interpretation, or outcome filtering. Echo the exact document and the reproducibility key to the user with the result. Rates come from outcomes_summary over all occurrences; page rows are examples, never the denominator. Outcome fields cannot be filtered; expect OUTCOME_IN_PREDICATE if tried. sequence.within accepts 15m/30m/1h/4h/12h/24h and the matching ISO aliases. identity.symbol must be an exact lowercase Binance USDT-M perpetual symbol. A fresh initial scan can consume research allowance units; cache hits, continuations, reruns, and 304 revalidations are free.",
+   "description": "Use this when an exact research_query.v2 document has been confirmed and the user wants historical occurrences and what followed. It returns the exact definition, counts with denominators, forward outcomes over all matches, an unconditional same-scope reference baseline when available, a reproducibility key, and replay-linked representatives. Read rates from outcomes_summary and use each horizon's present count as its denominator; horizons run from 30m to 7d, and a horizon absent for an occurrence is a record-edge fact that is counted absent, never a small value. Do not use this for live quotes, personalized buy/sell advice, trade execution, prose interpretation, or outcome filtering. Require explicit human approval of the exact study before calling this tool. Present a short plain-English confirmation with condition, markets, dates, outcome/horizon, all unprovided assumptions, and possible allowance consumption. A model-supplied flag is not human approval. After a material definition change, obtain fresh confirmation; equivalent canonicalization does not require another approval. Keep the exact document inspectable in tool details and provide it on request; include the reproducibility key with the result. Rates come from outcomes_summary over all occurrences; page rows are examples, never the denominator. Outcome fields cannot be filtered; expect OUTCOME_IN_PREDICATE if tried. sequence.within accepts 15m/30m/1h/4h/12h/24h and the matching ISO aliases. sort accepts times.anchor_time, outcome.mfe_24h or outcome.mfe_7d, asc or desc: an outcome sort orders the returned page only (the biggest runs first, and the max_mfe_7d representative carries a replay handoff to the biggest one) and changes no count or rate; outcome.* in a predicate is still OUTCOME_IN_PREDICATE. identity.symbol must be an exact lowercase Binance USDT-M perpetual symbol. A fresh initial scan can consume research allowance units; cache hits, continuations, reruns, and 304 revalidations are free. Successful results include an optional inline comparison and recorded-bin distribution, populated independently of full_outcomes. The default compact text is sufficient to accompany this component; no extra scan or chart generation is needed solely to display it.",
    "execution": {
      "taskSupport": "forbidden"
    },
-         "description": "True returns the engine's verbatim canonical bytes, including every zero-count instrument in counts_by_symbol (~150 KB+ for universe scans). Default omits zero-count entries and states how many were omitted.",
+         "description": "True returns the engine's verbatim canonical bytes with no projection at all: every zero-count instrument, every page row with its whole setup vector, the per-occurrence outcomes map and every empty ladder rung. Universe scans are hundreds of KB this way and can exceed a client tool-result limit. Default returns a projection that only ever REMOVES, and states each removal.",
          "type": "boolean"
        },
+       "full_outcomes": {
+         "description": "True returns the complete outcome ladders: every threshold rung and per-rung histogram for all twelve metrics, on the matched set and on the unconditional reference separately, with no rate or lift computed for you. That is tens of thousands of characters and can exceed a client tool-result limit. Default returns the paired answer block instead: the same verbatim counts and denominators for the canonical rungs, with the matched rate, the unconditional rate and their ratio stated side by side.",
+         "type": "boolean"
+       },
+       "full_rows": {
+         "description": "True keeps every recorded setup value on each returned row. Default keeps only the fields that row's own evidence names, which are the fields the predicate matched on.",
+         "type": "boolean"
+       },
        "if_none_match": {
          "description": "An ETag from a previous run to revalidate: identical data answers 304 and spends nothing. Pass it back verbatim (it may be weak, W/\"...\").",
          "type": "string"
+       },
+       "measure": {
+         "additionalProperties": false,
+         "description": "Optional agreed outcome for the workbench link only: kind close means finished, touch means reached; magnitude is a fraction (0.02 means 2%). Preserve the user's exact choice, including the original outcome_first target. This display choice never enters the query, changes the cache key, requests another computation, or changes the inline closing-return chart.",
+         "properties": {
+           "direction": {
+             "enum": [
+               "up",
+               "down"
+             ],
+             "type": "string"
+           },
+           "horizon": {
+             "enum": [
+               "30m",
+               "1h",
+               "4h",
+               "24h",
+               "72h",
+               "7d"
+             ],
+             "type": "string"
+           },
+           "kind": {
+             "enum": [
+               "close",
+               "touch"
+             ],
+             "type": "string"
+           },
+           "magnitude": {
+             "type": "number"
+           }
+         },
+         "required": [
+           "kind",
+           "direction",
+           "magnitude",
+           "horizon"
+         ],
+         "type": "object"
+       },
+       "rows": {
+         "description": "How many occurrence rows to keep in the returned projection (default 3, max 50). Rows are examples: every rate comes from outcomes_summary over all occurrences, so raise this only when you want more example moments. The engine still computes the full page.",
+         "maximum": 50,
+         "minimum": 0,
+         "type": "integer"
        }
      },
      "required": [
--- pinned/run_stratified
+++ observed/run_stratified
  {
    "annotations": {
      "destructiveHint": true,
-   "description": "Use this when the user wants to test whether the outcome distribution of one confirmed population changes when its existing anchors are partitioned by one setup-time condition. It returns split_true, split_false, and split_absent denominators and outcomes without moving or creating anchors. Do not use this for sequences in the split, cursor populations, causal claims, or two independently selected scans. Echo the exact document and the reproducibility key to the user with the result. Rates come from outcomes_summary over all occurrences; page rows are examples, never the denominator. Outcome fields cannot be filtered; expect OUTCOME_IN_PREDICATE if tried. A fresh stratified computation can consume research allowance units; cache hits, reruns, and 304 revalidations are free.",
+   "description": "Use this when the user wants to test whether the outcome distribution of one confirmed population changes when its existing anchors are partitioned by one setup-time condition. It returns split_true, split_false, and split_absent denominators and outcomes without moving or creating anchors. Do not use this for sequences in the split, cursor populations, causal claims, or two independently selected scans. Require explicit human approval of the exact study before calling this tool. Present a short plain-English confirmation with condition, markets, dates, outcome/horizon, all unprovided assumptions, and possible allowance consumption. A model-supplied flag is not human approval. After a material definition change, obtain fresh confirmation; equivalent canonicalization does not require another approval. Keep the exact document inspectable in tool details and provide it on request; include the reproducibility key with the result. Rates come from outcomes_summary over all occurrences; page rows are examples, never the denominator. Outcome fields cannot be filtered; expect OUTCOME_IN_PREDICATE if tried. A fresh stratified computation can consume research allowance units; cache hits, reruns, and 304 revalidations are free.",
    "execution": {
      "taskSupport": "forbidden"
    },

+ tool added: run_trade_test

Current tools

Show all 23 tool fingerprints
base_rate
030beaffe7793d50
commonality
d50df75b281f7ea7
get_hypothesis
206216c39358ca15
get_investigation_assessment
bf1f8d47eae49558
get_investigation_bundle
f87155da1510ac02
get_report
babdcecabf7eed7d
ground_screenshots
6f4412f3846c4406
interpret_prose
df6f20986dfe50ef
investigate_move
4549a7edb586c371
list_features
7fb2d0f3b3b416b0
list_instruments
c51277f45ad2c900
next_page
0b9a05006983ea2c
outcome_first
ed7b8756968d781d
prepare_hypothesis
aa85fb28fe57ba0e
prepare_study
598684b17a2bfb2b
resolve_scope
0785ad052df862c2
run_cohort
c17dc45143ec5f6e
run_hypothesis
7a3cef2d42d348d7
run_scan
bc4cb175b8d17e18
run_stratified
c9d117a67c45054e
run_trade_test
a0e60ada385ade00
save_hypothesis
c4fbe471b4146705
snapshot_at
2e111d2f1f60e9af

Watch this server yourself

If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.

npx -y mcp-pin@0.2.3 -- <your @edgedepth/research-mcp command>

Or subscribe to this page's RSS feed to be told when it changes.

Badge

mcp-pin status badge for @edgedepth/research-mcp

The badge states one fact about time and nothing else. It never claims a server is safe.

[![mcp-pin](https://mcp-pin.gautamkhosla.com/badge/22db54927477eeaa.svg)](https://mcp-pin.gautamkhosla.com/servers/22db54927477eeaa.html)