Tessera Analytics
Hyperliquid perp ve HIP-3 piyasa verilerini sorgulayın — OHLCV, fonlama oranları, açık pozisyon ve konumlandırma — ayrıca doğrudan LLM'nizden kantitatif fonlama/volatilite tahminleri.
Dokümantasyon
Source: https://tesseralytics.dev/mcp-server
Model Context Protocol
The Hyperliquid MCP server for cross-sectional market intelligence
Point Claude — or any MCP client — at one endpoint and ask market questions in plain language. Eight tools: discover the catalog and the field vocabulary, then rank the cross-section, screen on several conditions, measure funding divergence and pull a per-coin series.
POST https://tesseralytics.dev/mcp
Get an API key Open the playground
No card required — a free key ranks every market over the trailing week.
tessera.mcp · claude 8 tools · 3 open
{ day: "2026-09-15", columns: ["ret_1d", "funding_rate_mean"], order_by: "ret_1d", descending: false, top_n: 5 }
#CoinDayFunding /h
1 XRP −-9.89% +0.00123%
2 LIT −-8.39% +0.00125%
3 XLM −-8.21% +0.00075%
4 VVV −-7.83% +0.00189%
5 CRV −-7.76% +0.00116%
33 of 234 markets ranked as of 2026-09-15
{ window_days: 30, benchmark: "ETH", metric: "rate", top_n: 5 }
→ the widest spread in each direction — the most expensive carry and the cheapest · markets with no funding in the window are dropped, not zeroed
{ bar: "1h", coins: ["BTC"], window_days: 1, columns: ["ret_1h", "usd_volume", "net_taker_open", "d_open_interest"] }
→ one row per completed hour — hourly return, volume, taker flow and open-interest change · the exact completed hour and source are named
Every historical answer names the completed daily or hourly grain it covers and the slice it ranked. The ranked rows above are a real capture of the venue’s public API on 2026-09-16 — 234 markets listed, 33 clearing $5M daily notional on 2026-09-15. The other replies state the call’s arguments and the shape of what comes back.
What you can ask, and what comes back
Seven questions the intelligence layer answers today. Each maps to one shipped tool, and each response names the completed grain it covers, its source and the population it evaluated.
You ask
Which coins are most crowded on funding?
query_cross_section
The model calls it with order_by on funding, descending, and top_n — no day given, so it resolves to the last complete day and the response says which day that is. Add stat=percentile to rank by the percentile within your eligible population instead of the raw rate.
→ one row per market, ranked · the day it covers · how many markets were ranked
You ask
Which coins are crowded relative to their own liquidity?
query_cross_section
Same call, a second factor: rank on oi_over_volume — open-interest notional per unit of the day’s traded notional — and a quiet market carrying a heavy book moves ahead of a busy one the same size. Ask for stat=zscore as well and each row carries how far that ratio sits from the rest of your eligible population, in standard deviations, which is what makes the number comparable across markets.
→ one row per market, ranked by crowding · the z-score of that ratio · the day it covers
You ask
Show me coins with top-decile funding but bottom-decile changes in open interest.
screen_universe
A multivariate screen: one call with two conditions — funding in the top decile and the change in open interest in the bottom decile. Deciles use the eligible population after any coin or liquidity filter, and the response separates visible, eligible and matched counts.
→ only the matches · visible / eligible / matched population counts
You ask
Which coins’ funding has diverged most from ETH this month?
funding_divergence
A 30-day window with ETH as the benchmark, ranked by divergence: either the average rate spread or the cumulative spread, your choice. Coins with no funding in the window are excluded from the ranking rather than shown as zero.
→ ranked spreads · coins with no funding in the window dropped, not zeroed
You ask
Find potential short squeezes — open interest climbing while funding goes negative.
screen_universe
Another screen: open interest rising over the trailing week, paired with funding in the bottom decile. A positioning screen like this is exactly what the daily grain is for — the crowded side shows up in the cross-section before it shows up in price.
→ the crowded side of the book, named
You ask
How much of the market do you actually cover?
get_universe
The coverage picture: the latest completed daily or hourly grain, how many coins are represented for each scope, row density and completeness facts. The default scope is crypto; pass hip3 for HIP-3 markets, which carry a venue prefix like xyz:NVDA and, because they track an underlying that closes, come with a session caveat — their weekend flow isn’t comparable.
→ latest completed grain · represented coins by scope · row density · completeness facts
You ask
Is BTC’s move over the past week backed by real flow?
query_series
A 7-day trailing window for BTC, returning return, volume, taker flow and open-interest change per day. The response always notes how many days the trailing-window figures were computed over, and asks for fewer coins or a shorter window rather than silently truncating if the payload would blow the row cap.
→ one row per day · the number of days actually covered
And because MCP composes
Plug in a second server and ask across both
MCP tools compose, so you can add a second MCP server or skill — say one that reads a venue like Boros or Derive — and ask things like “given Tessera Analytics’ cumulative BTC funding for the past month, which Boros funding markets look mispriced?” The model pulls the funding series from Tessera Analytics and cross-references the other tool.
This is a usage example only — the venue connector is yours to bring; Tessera Analytics doesn’t ship or endorse one, and none of this is trading advice.
Runnable
Every question above is one tool call. The playground runs them with no key at all — the server answers in this browser on the anonymous trial, and the reply is its own, not a capture. Run one of them now →
A raw-row wrapper is not an intelligence layer
Most perp-data MCP servers hand the model rows and leave the thinking to it: a candle, a funding print, an open-interest number. That works for “what’s the funding”, and collapses on “which coins are crowded relative to the rest of the market” — the model can’t rank a universe it can’t hold.
Raw rows
A cross-section over 234 markets is 234 requests to a per-coin API — and then the model still has to compute the ranking in context, burning tokens on arithmetic it will get subtly wrong.
Tessera intelligence layer
The cross-section is computed where the data is: one call ranks every market and returns the answer, its percentile or z-score, the day it covers and how many markets it ran over. top_n caps the rows returned, never the population ranked.
The intelligence layer cannot page raw rows, by design — row access stays on the REST API. Discovery tools need no key; the analytics tools take yours and rank the whole cross-section inside a 7-day window.
Get connected
First create an API key. Then wire it into your client — replace YOUR_TESSERA_API_KEY with your key.
Claude Code
One command — native streamable-HTTP transport with a header.
claude mcp add --transport http tessera https://tesseralytics.dev/mcp \
--header "Authorization: Bearer $TESSERA_API_KEY"
Clients with native header auth
For MCP clients that accept a remote URL plus custom headers, add this to your MCP config.
{
"mcpServers": {
"tessera": {
"type": "http",
"url": "https://tesseralytics.dev/mcp",
"headers": {
"Authorization": "Bearer YOUR_TESSERA_API_KEY"
}
}
}
}
Claude Desktop (via mcp-remote)
Some desktop clients don't yet send custom headers to remote servers. The mcp-remote bridge proxies the connection and injects your key. Add this to claude_desktop_config.json, then restart the app.
{
"mcpServers": {
"tessera": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"https://tesseralytics.dev/mcp",
"--header", "Authorization: Bearer ${TESSERA_API_KEY}"
],
"env": {
"TESSERA_API_KEY": "YOUR_TESSERA_API_KEY"
}
}
}
}
The eight tools
Three open discovery tools, five keyed analytics tools. Discovery works without a key; the analytics tools take your API key and answer over every market inside a 7-day window.
Open — no API key
Discovery. These answer before you sign in, so an assistant can learn the vocabulary first.
| Tool | Arguments | What it answers |
|---|---|---|
| list_datasets | — | Every dataset you can reach — name, one-line summary, column count and the months available. |
| describe_dataset | asset | One dataset in full: each column’s type, nullability and plain-English meaning. |
| list_fields | Every field the query tools accept, with its meaning, unit and exact daily/hourly availability. |
Analytics — key or trial
Analytics. These need a key, or answer on a small anonymous trial without one — the plane’s 7-day window is enforced either way and cannot be widened.
| Tool | Arguments | What it answers |
|---|---|---|
| query_cross_section | bar? (1d | 1h), day (YYYY-MM-DD |
| screen_universe | bar? (1d | 1h), day (date |
| funding_divergence | bar? (1d | 1h), window_days, benchmark? (default ETH), metric?, top_n, scope? |
| get_universe | bar? (1d | 1h), day? (date |
| query_series | bar? (1d | 1h), coins[] (≤10), window_days, columns[], ending_day? (date |
How an answer behaves
Two clocks: hourly and daily
The intelligence layer answers at two grains, and they are not the same freshness. The 1d cross-section is the last complete UTC day; the 1h cross-section is the newest published hour — which is not the newest hour, because the rollup lands roughly 1.5–2.5 hours behind the bar it describes. The hourly grain is state, not timing.
Omit bar or pass 1d for the last complete UTC day; the response says bar: "1d", uses tessera_daily, and stamps as_of as YYYY-MM-DD. Pass bar: "1h" for the latest listed completed UTC hour; the response uses tessera_hourly and an RFC3339 as_of ending exactly at :00:00Z. Name a covered day or completed hour explicitly, or leave it as latest; requests outside the covered range return an explicit error rather than silent zeros.
Both grains are open to any key inside a 7-day window: bar: "1h" for completed hours, bar: "1d" for completed days. The anonymous trial is answered at bar: "1d" and is told so by name if it asks for bar: "1h"; the refused call is not counted against its allowance.
Because the hourly feed publishes late, read it as a state feed, not a timing feed. Its durable value is 24-hour-horizon state — size, carry, positioning — plus disconfirmation of a thesis you already hold, not a fresh entry signal. The fast order-flow timing that decays within the hour is exactly what the publication lag leaves behind; the state that survives a 24-hour horizon is what the lag leaves intact. If you want 1h timing, that needs a lower-latency path, not this rollup.
Every analytical response names the grain, source, completed timestamp and market scope. Its visible_count starts with the policy and scope population, eligible_count applies explicit coin and liquidity filters, and matched_count is the ranked or condition-satisfying result population.
Rankings and screens are computed within the eligible population, so explicit filters change the denominator and a one-coin eligible slice is refused instead of returning a hollow percentile.
Fields come from discovery
Field names, meanings and units are not something you memorise: call list_fields (or ask for the vocabulary in plain language) and the model gets every column the query tools accept, each with a plain-English meaning, its unit and exact 1d / 1h availability. Discovery is free — pass those names straight into columns, a screen condition, or order_by. The whole vocabulary is also browsable on this site — the field dictionary.
Free, rate-limited
Any valid API key can use the MCP server: 20 tool calls a day per key, trailing 7 days, daily and hourly bars, every market — including HIP-3. Discovery tools show the whole catalog regardless; a market the layer does not carry comes back empty with the reason stated — the slice is never widened to fill it.
No key at all? An anonymous trial answers up to 12 analytics calls an hour (20 a day) on the daily grain, with ranked lists clamped to 25 rows.