# tech.ensotrade/ensotrade

> Live crypto data: why a coin or the market is moving (funding, OI, positioning, flow).

- name: tech.ensotrade/ensotrade
- version: 1.0.0
- connection class: R0 (autonomous)
- trust: 88/100
- quality: 80/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/tech.ensotrade%2Fensotrade
- tools: https://api.protogrid.dev/v1/servers/tech.ensotrade%2Fensotrade/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "ensotrade": {
      "type": "http",
      "url": "https://www.ensotrade.tech/mcp/"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 99
- freshness: 65
- provenance: 85
- drivers: +repository +dns-namespace +website +reachable +uptime-96% ~updated-119d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 80/100 (good)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 64 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 6 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- fail `tools.annotations`: no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: mass_scan (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); position_limits (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); explain_move (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …
- pass `tools.token_cost`: about 5,387 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 22, about 5,387 tokens to load them all
- tool set hash: b55bdd417c1c51bf84382372920db200
- badge: [![protogrid quality](https://protogrid.dev/badge/tech.ensotrade/ensotrade.svg)](https://protogrid.dev/servers/tech.ensotrade/ensotrade)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Remotes

- https://www.ensotrade.tech/mcp/ (streamable-http, auth none, reachable true, uptime30d 0.96363634)

## Packages

_none_

## Tools (22)

- `carry_pressure`: Toxic Carry Score (cost-of-leverage from funding, positive = bullish) + Open Interest
Quality Index (is the price trend agreeing with new positioning, i.e. healthy, or against
it, i.e. forced flow / reversal risk). Requires an EnsoTrade Pro API key. `coin` = ticker
e.g. 'btc'. See the `market_glossary` resource for how to read these numbers.
- `currency_leg`: The cost of the currency you were never quoted in. Use for "what does it really cost me
to trade $5M of SOL", "which venue is cheapest for a USD fund", "how much am I paying to
hold USDT", "should I use a USDC venue instead".

THE POINT: every execution cost in this API, and in every competing tool, is denominated in
the VENUE'S OWN quote currency. Most perp venues quote USDT. A fund's money is USD. So the
quoted cost is for a trade the fund cannot place until it has bought USDT, and the price of
that conversion appears in nobody's TCA. This walks the live USD/USDT and USD/USDC books at
the caller's size, reports the cheapest round trip and the capacity ceiling, and re-ranks
venues on cost INCLUDING the leg.

IT DOES NOT TELL YOU WHICH VENUE TO TRADE ON, and you must not present it as if it does.
That output existed, was measured across 20 coins x 5 sizes, flipped 0 of 95 times, and was
deleted — `leg_does_not_change_venue` in the response carries the numbers. What it tells you
is what the trade ACTUALLY costs: quote `leg_as_pct_of_execution_cost`, which is the leg
measured against the trade's own execution cost on the venue the desk would really use.

THE LEG IS A COST ON CAPITAL MOVED, NOT ON TURNOVER. `turns` is how many times the desk
turns the balance over before repatriating to USD. At turns=1 the full round trip is
charged; at turns=50 the leg is rounding error and the response will show that. Do not
quote the turns=1 figure as a per-trade cost for a desk that trades continuously.

`coin` = ticker e.g. 'sol'. `notional_usd` = order size in USD. `side` = 'buy' or 'sell'.
Requires an EnsoTrade Pro API key.
- `execution_window`: When during the day crypto is cheapest to execute into, as a session-level profile pooled
across the coin universe. Use for "what time of day should I trade", "when is crypto most
liquid", "best time to execute a large crypto order". Returns four UTC session blocks with a
relative execution-cost number each (lower = cheaper), measured as Amihud illiquidity
(|hourly return| / hourly quote volume) over ~62 days of hourly candles.

IMPORTANT when quoting this: the effect is WEAK BUT STABLE — roughly 1.3-1.45x between the
cheapest and dearest session, and the response ships a split-half check so you can see that
both halves of the sample agree on the ordering. There is deliberately NO per-coin "best
hour" because that version FAILED split-sample validation; do not invent one from this data.
Free on any EnsoTrade API key.
- `exit_capacity`: How fast a crypto position can be exited and what it costs. Use for "how long to get out
of $5M of SOL", "can I exit this position", "what's my liquidity risk". Returns: immediate
exit cost by walking the live book; direction skew (up-cost vs down-cost, since a lopsided
book matters); time to exit at 5%/10%/20% participation; max exitable in 24h; and how
concentrated the depth is on one venue.

IMPORTANT when quoting the capacity numbers: they are computed on REPORTED venue volume,
which is an UPPER BOUND on genuinely tradable capacity — say so, and treat the time-to-exit
figures as optimistic. An "effective volume" adjustment was built and deliberately NOT
shipped: comparing how much volume each venue needs to move price one bp collapses into a
pure size proxy, because arbitrage equalises price travel across venues. The response
carries a live degeneracy_check showing this for the requested asset. Do not present the
capacity figures as adjusted or verified volume.

`coin` = ticker e.g. 'sol'. `position_usd` = position size in USD. Requires an EnsoTrade
Pro API key.
- `explain_move`: Explain WHY a crypto coin is up or down right now, from live order-flow and positioning.
Use this for "why is bitcoin down", "why is BTC/ETH/SOL pumping or dumping", or any question
about the CAUSE of a crypto move. Returns a ready-to-quote sentence plus structured signals
(price, regime, funding, open interest, basis). `coin` = ticker like 'btc', 'eth', 'sol'.
Pass an EnsoTrade Pro API key as a Bearer token for real-time data (public calls are
15-minute delayed) — generate one at ensotrade.tech under Account -> Developer Access.
- `fetch_series`: Raw time series for one field on one symbol, oldest-first, capped at 1000/1500 points.
Use this to explore what a field actually looks like before wiring it into test_formula.
Requires an EnsoTrade Pro API key. `symbol` e.g. 'SOL' or 'SOLUSDT'.

`timeframe="scalp"` (default): WDE order-flow microstructure, second-scale. `field` is one
of mid, spread_bp, signal, toxicity, cost_bp, ret_1s_bp, ret_5s_bp, ret_30s_bp, ret_60s_bp
(top-level), or ofi1, ofi5, dofi, qi, mp, obi, tf1, tf5, tf30, run, inten, vpin, wall,
bid_pr, ask_pr, sigma1m (order-flow features). `hours` max 168. Coverage is uneven and only
covers whatever windows the WDE panel was actively open for a symbol — SOL and BNB have the
most logged history, other symbols may return no rows for a recent window; widen `hours` or
try a different symbol if so.

`timeframe` = "15m", "1h", "4h", or "1d" for day/swing work: real OKX perp candles instead
of order-flow logs (always available, not dependent on the WDE panel being open). `field`
is one of open, high, low, close, volume, ret_pct (bar-over-bar % return), range_pct
(bar high-low as % of close), body_pct (close-open as % of open), rsi14, vol_ratio (volume
vs its 20-bar average). `hours` max ~1500 bars worth (e.g. up to ~62 days for "1h").
- `get_funding`: Current perpetual funding rate and crowding read for a crypto coin (are longs or shorts
paying / crowded). Use for "what's the funding rate on <coin>", "is funding positive".
`coin` = ticker e.g. 'btc'. Bearer-auth with a Pro API key for real-time data.
- `get_order_flow`: Positioning regime + open interest + recent taker imbalance for a crypto coin — whether a
move is new longs, short covering, fresh shorts, or deleveraging. Use for "crypto order flow",
"open interest change", "is this a short squeeze". `coin` = ticker e.g. 'btc'. Bearer-auth
with a Pro API key for real-time data.
- `leg_rates`: What it costs, right now, to move USD into and back out of the stablecoins the crypto
venues quote in — and how much can be moved before the book runs out. Use for "what does
USDT conversion cost", "is USDC or USDT cheaper to hold", "how much can I convert at once",
"what is the USDT basis".

No coin involved: this is the currency leg on its own. Returns per-market cost in and out,
the cheapest venue for each direction, aggregate capacity, and how far each stablecoin is
trading from 1.0000.

`where_to_convert` IS THE ACTIONABLE PART: the cheapest and dearest conversion venue and
the bp/USD penalty between them. Measured at 13.5x-17x on USDT and 27.7x on USDC, and the
winner ROTATES with size because these books are shallow enough that the usual winner runs
out — Kraken wins to $2.5M and loses to Bitfinex at $5M.

CAPACITY IS THE PART THAT SURPRISES PEOPLE. The USD/stablecoin books are thin relative to
the coin books they feed, so a size that walks a coin book comfortably can exhaust the
currency book outright. `size_exceeds_capacity` is a hard wall, not a cost.

par_offset_bp is NOT charged as a cost — a desk that buys and later sells the same
stablecoin is flat to it. Do not add it to the round-trip figure.

`notional_usd` = the size to price. Requires an EnsoTrade Pro API key.
- `market_rotation`: Cross-sectional momentum ranking across the whole crypto perp universe right now —
which coins are leading (top percentile) vs lagging (bottom percentile). Use this FIRST
when asked to "find a coin" or "what should I look at" before drilling into one with the
other tools. Requires an EnsoTrade Pro API key.
- `market_snapshot`: One combined live snapshot for a crypto coin: price, 24h change, funding, open interest,
perp basis, positioning regime. `coin` = ticker e.g. 'btc'. Bearer-auth with a Pro API key
for real-time data plus the validated funding-momentum directional signal (public calls get
a 15-minute-delayed price and no directional call).
- `mass_map`: Bounded MASS scan. Select exchanges with comma-separated venues. Rows stay separate. Pro key required.
- `mass_scan`: MASS on one selected exchange or comma-separated exchanges. One result per exchange; no blend. Pro key required.
- `options_chain`: Full crypto options chain for a coin: strikes, mark IV, greeks, and the Black-Scholes
fair-value gap per contract. Requires an EnsoTrade Pro API key. `coin` = underlying
ticker e.g. 'btc'.
- `perp_dashboard`: Full perp dashboard for a crypto coin: mark price, index price, funding rate + next
funding time, open interest, 24h high/low/volume. Requires an EnsoTrade Pro API key
(Bearer auth) — generate one at ensotrade.tech, Account -> Developer Access.
`coin` = ticker e.g. 'btc'.
- `position_limits`: Position-limit table for a universe of crypto perps: the largest position in each coin
that could be exited inside 24 hours at a chosen participation rate, sorted TIGHTEST-FIRST.
Use for "what position limit should I set on X", "which of my positions is too big to get
out of", "how much SOL can I safely hold", "rank my coins by exit risk".

`coins` = optional comma-separated list (default: the liquid crypto perp universe by
volume). `participation` = the fraction of daily volume you are willing to be, default
0.10 (10%). `limit` = how many coins to return, max 40.

IMPORTANT when quoting these: they are computed on REPORTED venue volume, which is an
UPPER BOUND on genuinely tradable capacity — say so, and treat the limits as optimistic.
No effective-volume adjustment is applied; that was built, measured and cut because
arbitrage equalises price travel across venues, collapsing volume-per-bp into a size
proxy. Requires an EnsoTrade Pro API key.
- `post_map`: Universe-wide maker/taker table: for each liquid crypto perp, the best venue to post on and
the round-trip prize, sorted widest-first. Use for "where is being passive worth the most",
"which coins should I be quoting rather than taking", "rank my book by spread capture".

Same honesty requirement as post_value and it is not optional: these are prizes CONDITIONAL ON
BEING FILLED. No fill probability is estimated anywhere in the response. Say so.

`coins` = optional comma-separated list (default: the liquid crypto perp universe by volume).
`notional_usd` = optional; supplying it prices crossing as the real book walk and adds the
best-venue-to-cross comparison per coin. `limit` = how many coins, max 40. Requires an
EnsoTrade Pro API key.
- `post_value`: What POSTING a resting order is worth versus CROSSING the spread, per venue, for a crypto
perp. Use for "should I use a limit order or market order", "what does paying the spread cost
me", "which venue should I quote on", "is it worth being passive here", "maker vs taker".

Returns per venue: the current spread in bp, taker and maker fee, the value of posting per
side, and the round trip (2x, because a position is opened and closed). Ranked by posting
value. Pass `notional_usd` to price the crossing side as the real walk down the book instead
of half the spread — a larger and more honest number at size.

MEASURED across 54 coin-venue pairs: median 4.09bp per side / 8.17bp round trip, mean 4.63bp,
p90 6.72bp. Wide-spread names go much further (ARB 20.31bp round trip, OP 19.33bp, DOT
19.70bp). Note SOL at a 0.13bp spread is still worth 4.07bp per side — on a tight book the
whole of the value is the maker/taker FEE DIFFERENTIAL, which does not shrink as spreads
tighten. That is a floor, and it is why this holds up on liquid majors where cheapest_venue
has almost nothing to choose between.

YOU MUST STATE THIS WHEN QUOTING ANY NUMBER FROM THIS TOOL: it is the SIZE OF THE PRIZE, NOT
THE PROBABILITY OF WINNING IT. A resting order that never fills does not save the spread, it
costs the trade, and that is routinely worth more than the basis points here. EnsoTrade does
NOT estimate fill probability — that needs order-book time series this service does not log —
and does not approximate it. Never present posting as free money.

Also read `cross_vs_post`: the best venue to POST on is frequently NOT the best venue to
CROSS on, because maker fees and spreads rank venues differently from depth. Where they
differ, the answer is to rest on one and take on the other.

`coin` = ticker e.g. 'sol'. Requires an EnsoTrade Pro API key.
- `route_order`: Cheapest way to fill a crypto perp order across multiple venues, and what that saves
versus using the single best venue. Merges every order-book level from Binance, Bybit,
Bitget, Hyperliquid, OKX and Gate into one list ordered by FEE-ADJUSTED price and walks it
until filled. Use for "how should I split this order", "what's the cheapest venue to buy
$2M of SOL", "how much would routing save me". Returns the per-venue allocation, the
blended price, the best single venue, and the saving in bp and USD.

`coin` = ticker e.g. 'sol'. `notional_usd` = order size in USD. `side` = 'buy' or 'sell'.
`venues` = optional comma-separated subset (e.g. "binance,bybit") for a desk that only has
accounts on some — the saving is only real on venues you can actually trade.

This is a MEASUREMENT of a live book, not a prediction: it is optimal for the static
snapshot, prices move while an order works, and it assumes capital is already on each
venue and ignores transfer costs. Requires an EnsoTrade Pro API key.
- `save_strategy`: Save a formula as a strategy IF it currently validates. Re-runs test_formula itself
server-side first — never trusts a stale claim from an earlier call, since data moves —
and only saves when that fresh verdict is 'validated'. Saved strategies appear in the
user's own EnsoTrade dashboard under Strategies; they're private to that account, not
published or shared with anyone else. Same parameters as test_formula: `symbol`/`formula`
as usual, `timeframe`="scalp" (use `horizon`) or "15m"/"1h"/"4h"/"1d" (use `horizon_bars`),
`hours` = history window tested. `label` is an optional short name for the strategy (e.g.
"BTC 1h RSI reversion"). Requires an EnsoTrade Pro API key.
- `test_formula`: Invent a formula over EnsoTrade's data, and get back whether it actually predicts
forward returns — validated on a holdout split, not just fit to the whole window.
`formula` is a math expression combining any of the fields listed in fetch_series'
docstring (for the same `timeframe`) with +, -, *, /, **, %, unary +/-, and abs/min/max/
sqrt/log/log1p/exp/sign/clip/mean/std, e.g. "ofi1 * vpin - dofi / 2" or
"sign(qi) * sqrt(abs(obi))". No other Python is executed — this runs through a restricted,
default-deny expression evaluator, not eval().

`timeframe="scalp"` (default, WDE order-flow, second-scale): `horizon` is which forward
return to correlate against — ret_1s_bp, ret_5s_bp, ret_30s_bp, or ret_60s_bp. `hours` max
720 (30 days).

`timeframe` = "15m"/"1h"/"4h"/"1d" for day/swing strategies (real OKX candles, always
available): use `horizon_bars` instead of `horizon` — the forward % return N candles
ahead (e.g. horizon_bars=4 on timeframe="1h" = predicting the move 4 hours out). `hours`
max ~1500 bars worth; a small `hours` still fetches at least 150 bars (the minimum needed
for a meaningful 70/30 split) rather than failing outright, so the actual window tested
can be wider than requested for a small `hours` value.

Either mode needs enough rows that a 70/30 split leaves >=150 total. Returns train (first
70% chronologically) and holdout (untouched final 30%) Spearman/Pearson correlations plus
a verdict: 'validated' only if holdout |spearman| >= 0.15 AND same-signed as train — this
guards against keeping a formula that only looked good by chance on one slice of data.

ALSO returns, computed on the holdout portion only:
- `net`: risk-adjusted performance AFTER trading costs — sharpe, sortino,
  max_drawdown_pct, calmar, ann_return_pct, ann_volatility_pct, win_rate_pct,
  profit_factor. Sharpe is annualized and corrected for overlapping horizons
  (a horizon spanning N bars sampled every bar is subsampled to non-overlapping
  periods first, which removes the ~sqrt(N) inflation naive Sharpe would show).
- `gross`: the same metrics before costs, so the cost drag is visible.
- `costs`: fee/slippage assumptions, position_changes (turnover), total_cost_pct.
  Costs are charged on position CHANGES only, not per bar — holding one side is
  cheap, flipping every bar is not.
- `cost_verdict`: survives_costs / marginal_after_costs / killed_by_costs / unknown.
  IMPORTANT: `verdict` is a correlation test and says nothing about profitability;
  a formula can be 'validated' and still be killed_by_costs. Check both.
- `walk_forward`: the same formula re-scored on 5 consecutive time blocks, with
  consistency_pct (share of blocks agreeing on direction) and a `stable` flag.
  An edge that passes one holdout but flips sign between blocks is usually noise.

`fee_bp`/`slippage_bp` are per side, defaulting to 5bp taker + 2bp slippage; raise
them for illiquid coins or a worse fee tier. Iterate: call this repeatedly with
different formulas, keep what validates AND survives costs, discard what doesn't.
Requires an EnsoTrade Pro API key.
- `top_movers`: Top gaining and losing crypto perpetuals right now, ranked across the whole market. Use for
"top crypto movers", "biggest crypto gainers and losers today".
