# EdgeDepth Research (npm · @edgedepth/research-mcp)

Search recorded crypto and TradFi microstructure through deterministic, reproducible agent tools.

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

## Components

- remote · `mcp.edgedepth.com`: 38/100, [markdown](https://verifymcp.io/servers/com-edgedepth-research/mcp.md), [page](https://verifymcp.io/servers/com-edgedepth-research/mcp)
- npm · `@edgedepth/research-mcp`: 62/100 (this document), [markdown](https://verifymcp.io/servers/com-edgedepth-research/edgedepth-research-mcp.md), [page](https://verifymcp.io/servers/com-edgedepth-research/edgedepth-research-mcp)

## Channel facts

- Registry: `npm`
- Package: `@edgedepth/research-mcp`
- Version: `0.2.5`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, 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-08-04.

- **Supply Chain Security**: 83/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known medium-severity CVE affects hono 4.12.33, reached via @modelcontextprotocol/sdk > hono. A fixed version is available.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (95 of 96), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 3 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 49/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 2660 tokens (~266/item across 10 items; 10 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 25/100
  - Stability check failed: the tool surface changed between 0.2.1 and 0.2.5: 0 tool removals, 1 breaking changes, 0 additions.
- **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.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add com-edgedepth-research -- npx -y @edgedepth/research-mcp
```

### Codex

```bash
codex mcp add com-edgedepth-research -- npx -y @edgedepth/research-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-edgedepth-research": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@edgedepth/research-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-edgedepth-research --command npx --arg -y --arg @edgedepth/research-mcp
```

### Hermes

```yaml
mcp_servers:
  com-edgedepth-research:
    command: "npx"
    args: ["-y", "@edgedepth/research-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "com-edgedepth-research": {
      "command": "npx",
      "args": [
        "-y",
        "@edgedepth/research-mcp"
      ]
    }
  }
}
```

## 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-08-04 (score 62, −1)

- [security regression] CVE-2026-69207 affects this package: medium
- [security regression] Known CVEs: partial → fail

### 2026-08-03 (score 63, −3)

- [functional] Package version: 0.2.4 → 0.2.5

### 2026-08-02 (score 66, +48)

- [security regression] Stability: unverified → fail
- [security regression] Provenance: unverified → fail
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Install scripts: unverified → pass
- [security improvement] Malware scan: unverified → pass
- [functional improvement] License: unverified → pass
- [functional improvement] Schema quality: unverified → good
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional] Licence: MIT

### 2026-07-31 (score 18, −10)

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

### 2026-07-30 (score 28, +20)

- [security regression] Provenance: unverified → fail
- [security improvement] Install scripts: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [functional improvement] License: unverified → pass
- [functional improvement] Maintenance: unverified → pass
- [functional] Schema quality: Schema quality not yet verified: our sandbox run of this package did not complete, so we have no schema to assess.
- [functional] Tool coverage: Tool coverage not yet verified: our sandbox run of this package did not complete, so we have no tool definitions to assess.
- [functional] Licence: MIT
- [functional] Package version: 0.2.3 → 0.2.4

### 2026-07-29 (score 8, −44)

- [security regression] Known CVEs: partial → unverified
- [security regression] Provenance: fail → unverified
- [security regression] Install scripts: pass → unverified
- [security improvement] Source repository: fail → pass
- [functional regression] License: pass → unverified
- [functional regression] Maintenance: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] Licence: MIT
- [functional] Package version: 0.2.3 → 0.2.4

### 2026-07-28 (score 52, +52)

- [security regression] Provenance: unverified → fail
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Install scripts: unverified → pass
- [functional improvement] License: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional] First check of Tool coverage: 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: excellent
- [functional] First check of Schema quality: fail
- [functional] Licence: MIT

### 2026-07-27 (score 0)

First indexed and scored.

## MCP tools (10)

### `list_features` (~101 tokens)

List research features (the grammar registry)

Return the closed registry for the pinned feature_version: every feature id with its dtype and range, the operators, window aggregates and durations, sequence rules, limits, sort fields, and the machine-readable validation and transport error-code lists. Call this FIRST: a document that only uses ids from here cannot invent field names. The registry is ETag-revalidated on every read, so additive feature ids become visible to long-running agents without inventing or hard-coding fields.

### `list_instruments` (~265 tokens)

List research instruments and coverage

Return the authoritative feature-store universe derived from complete manifests. DEFAULT: a compact deterministic summary (coverage window, dataset revision, instrument counts by availability status) - the full body is ~360 KB and overflows agent contexts. Pass symbols: ["btcusdt", ...] for the complete canonical records of specific instruments (per-instrument coverage, present/excluded partition counts, provenance, replay entitlement). Pass full: true for the verbatim canonical bytes of the whole universe. Excluded symbol-days remain visible as universe membership. NVDAUSDT and QQQUSDT are Binance USDT-M perpetuals referencing TradFi assets, not direct Nasdaq data. This read is deterministic and free in every mode.

Input parameters:

- `full` (boolean): True for the verbatim ~360 KB canonical universe bytes.
- `if_none_match` (string): Optional ETag to revalidate an unchanged result for free. ETags are projection-scoped: pass back the ETag this tool returned for the SAME mode (full/summary/symbols). An ETag from a different mode ne…
- `symbols`: Return only the full canonical records of these instruments (lowercase perps, e.g. ["btcusdt","ethusdt"]). A string-encoded array is repaired deterministically.

### `interpret_prose` (~198 tokens)

Interpret prose into a proposed research document

Turn a plain-language market question into a PROPOSED research_query.v2 document. The result is a proposal, not a result: it is labeled proposal:true and is never executed here. Show the document (plus any unsupported[] stand-ins and clarify notices) to the user, then call run_scan with the document to execute. That second call is the confirm gate. Requires the research:interpret scope and is metered separately (each call spends provider money).

Input parameters:

- `language` (string, required): The market question in plain language, e.g. "vpin above 0.7 then a liquidation surge within 30m on majors last week".
- `time_zone` (string): Optional IANA identity used only to interpret local calendar language, for example Asia/Bangkok. Omit to use the public API default, UTC. Explicit prose such as "June 7 UTC" overrides this default. A…

### `run_scan` (~620 tokens)

Run a research scan (record_occurrences)

Execute a research_query.v2 document over the deterministic engine and return counts, denominators, outcomes_summary, the reproducibility key and page-1 rows as the engine's canonical bytes. outcomes_summary carries forward outcomes over FOUR horizons per occurrence: 30m return, 1h MFE/MAE, and 4h and 24h return + MFE/MAE (record_result.v3), with a closed threshold ladder to +/-20 pct - "how often did this setup reach +5% within 24h, with how much drawdown" is answered by the summary over ALL occurrences. Completeness caveat: an occurrence closer to the end of recorded data than a horizon has that horizon ABSENT (counted in the absent tally, never a truncated or implied-zero outcome) - quote present, not total_matching, as the denominator for any horizon rate. Document-only input: stated chips are the only input the scan path accepts (use interpret_prose first if you have prose, then re-submit its document). CONTRACT (relay to the user): 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; both normalize to canonical ISO before hashing. identity.symbol must be an exact lowercase Binance USDT-M perpetual symbol: case, whitespace and separators are rejected.  You may rerun freely: a rerun of the same document is served from cache (X-Research-Cache: hit), and reruns and 304 revalidations are free. SIZE: page rows carry full 33-feature setup vectors (~2 KB each); page.limit 50 returns ~120 KB, which can overflow an agent context. Counts, outcomes_summary and representatives are complete-result regardless of page size - set page.limit 1-5 unless you need row-level evidence, then page with next_page. PROJECTION: counts_by_symbol lists only instruments with at least one match; the number of zero-co…

Input parameters:

- `document` (object, required): A complete research_query.v2 document (target record_occurrences, stated chips only). Call list_features for the grammar; do not invent field names.
- `full_counts` (boolean): 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…
- `if_none_match` (string): An ETag from a previous run to revalidate: identical data answers 304 and spends nothing. Pass it back verbatim (it may be weak, W/"...").

### `next_page` (~226 tokens)

Fetch the next page of a prior scan

Continue a prior run_scan by re-sending the SAME document with the opaque cursor from the previous response. Never construct cursors. If X-Dataset-Revision changed since page 1, the data under THIS document changed (e.g. the nightly append) and the result set with it: restart from page 1. The revision is scoped to the document's symbols and window - never compare revisions across different documents. Every page has its own ETag and remains free, including a continuation cache miss. Complete-result counts and summaries remain independent of the page rows. Same counts_by_symbol projection as run_scan; full_counts: true for verbatim bytes.

Input parameters:

- `cursor` (string, required): The opaque page.cursor from the previous response. Never construct or edit it.
- `document` (object, required): The EXACT document from the prior run_scan.
- `full_counts` (boolean): True returns the engine's verbatim canonical bytes, including every zero-count instrument in counts_by_symbol. Default omits zero-count entries.
- `if_none_match` (string): Optional ETag to revalidate this page.

### `snapshot_at` (~153 tokens)

Read the registry as-of a moment

Read the engine registry AS-OF the grid bucket containing a moment: every feature value, the closed-list window aggregates, and the fired rulebook ids, as the engine's canonical bytes. A read, never a scan (not credit-metered). Use it to turn one observed moment into candidate clauses, then run_scan to find every other time it looked like that. Selection discipline: if you picked the moment because it moved, expect the follow-up scan to deflate over all occurrences. That is the product working.

Input parameters:

- `at` (string, required): An RFC3339 datetime; the engine floors it to the grid bucket that contains it.
- `symbol` (string, required): Lowercase perp, e.g. btcusdt.

### `base_rate` (~299 tokens)

Base rate of a single condition

Measure how often a SINGLE stated condition is true over all eligible symbol-minute buckets in a window. base_rate_result.v1 reports predicate_true_buckets, predicate_false_buckets, eligible_buckets, absent_or_ineligible_buckets and true prevalence globally and per symbol. This is not a count of false-to-true occurrence episodes and computes no forward outcomes. Missing values are excluded from eligible, never coerced to false or zero. Deterministic and free, including reruns. field, operator and value must be grammar-valid (see list_features); expect the 422 contract code verbatim if not. The assembled one-clause document is echoed back so you can show the user exactly what ran.

Input parameters:

- `field` (string, required): A feature.* or window.* id from list_features (e.g. feature.vpin).
- `from` (string, required): Window start, RFC3339.
- `operator` (string, required): gte, lte, between, eq or in - matching the field dtype.
- `symbol`: Optional scope: one lowercase perp or a JSON array of them. Omit for the whole universe. A string-encoded array is repaired deterministically.
- `to` (string, required): Window end, RFC3339.
- `value` (required): A number for numeric fields (send a JSON number, not a quoted string), a label for enum fields, or an array for between/in. String-encoded numbers and arrays are repaired deterministically.

### `commonality` (~117 tokens)

Commonality across N moments

Given N (symbol, time) moments, return the DETERMINISTIC intersection: per registry field a verdict of agree, partial, disagree, quiet or absent, plus the survivorship and multiple-comparisons honesty framing IN the output. Never similarity search. A shared feature is a description of the chosen moments, not a prediction: to test any AGREE chip, follow up with base_rate over the same window.

Input parameters:

- `moments` (array, required): At least 2 moments: { symbol: lowercase perp, at: RFC3339 }.

### `get_report` (~108 tokens)

List reports or fetch one by hash

Omit hash8 to list published archive and record reports with count, revision and explicit integrity status. Provide an 8-hex canonical hash to fetch one report: structurally generated title, author, the definition that ran (re-submittable to run_scan) and the result pinned at publish time. Invalid or withdrawn reports carry correction and successor metadata and must not be presented as healthy.

Input parameters:

- `hash8` (string): Optional 8 lowercase hex canonical id. Omit to list public reports.

### `run_cohort` (~429 tokens)

Run a cohort comparison study (record_occurrences)

Execute a research_query.v2 document as a predicate-complement comparison and return canonical cohort_result.v2 bytes: what followed the condition (the treatment side, byte-identical to the run_scan outcomes_summary for the same document) vs what followed every OTHER eligible bucket where the full predicate was FALSE (the baseline), each as the same 30m/1h/4h/24h return + MFE/MAE summary over ALL occurrences. WHERE-ONLY: a sequence document is refused with 422 COHORT_SEQUENCE_UNSUPPORTED (run it as an ordinary run_scan instead). The bytes carry NO ratios, lift, averages or significance - you compare the two distributions yourself. This is not covariate matching: treatment/baseline identities, different observation units, dedupe difference, and denominator arithmetic ship in the result with three mandatory caveats. Both sides honour the completeness rule: an occurrence closer to the end of recorded data than a horizon has that horizon ABSENT - quote present, not total, as the denominator. CONTRACT (relay to the user): 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 rerun of the same document is served from cache (X-Research-Cache: hit) in its own cohort namespace; reruns and 304 revalidations are free.

Input parameters:

- `document` (object, required): A complete research_query.v2 document (target record_occurrences, WHERE-ONLY - no sequence). Call list_features for the grammar; do not invent field names.
- `full_counts` (boolean): True returns the engine's verbatim canonical bytes, including any zero-count instrument in counts_by_symbol. Default omits zero-count entries when present.
- `if_none_match` (string): 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/"...").

## Diagnostics

Captured diagnostic sections: Provenance, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/com-edgedepth-research/edgedepth-research-mcp#diagnostics

## Score history

- 2026-08-04: 62
- 2026-08-03: 63
- 2026-08-02: 66
- 2026-08-01: 18
- 2026-07-31: 18
- 2026-07-30: 28
- 2026-07-29: 8
- 2026-07-28: 52
- 2026-07-27: 0

## Links

- npm package: https://www.npmjs.com/package/@edgedepth/research-mcp
- Socket report: https://socket.dev/npm/package/@edgedepth/research-mcp
- Repository: https://gitlab.com/jtucker96/edgedepth-research-mcp
- Changelog RSS feed: https://verifymcp.io/servers/com-edgedepth-research/edgedepth-research-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-edgedepth-research/edgedepth-research-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/com-edgedepth-research/edgedepth-research-mcp
