Reservoir MCP
Reads Hyperliquid/HIP-3 history from Amazon S3: queries Parquet files in the Hydromancer Reservoir bucket (s3://hydromancer-reservoir) using the user's AWS credentials (AWS CLI profile or env vars), with requester-pays downloads. Estimates download size before each call, enforces a per-call MB limit, caches small files locally, and reports per-call and month-to-date data transfer so AWS costs stay visible.
Runs read-only DuckDB SQL over Reservoir's Parquet data straight from S3, matching the layout and market naming of Hydromancer's Exploring Reservoir guide. Queries are restricted to a single SELECT against the Reservoir bucket and local cache, with column/time-slice pruning to minimize downloads, query timeouts, and downloadable local copies of files for free re-querying.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Reservoir MCPShow hourly BTC candles for October 1."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Reservoir MCP
Let your AI agent work with Reservoir, Hydromancer's free archive of Hyperliquid history, the same way the Exploring Reservoir guide does: DuckDB reading Parquet files straight from S3.
"How much was traded on xyz:ANT in its first 24 hours, and how many longs got liquidated?" "Show me hourly BTC candles for October 1." "What did the xyz:TSLA order book look like at 14:30 UTC yesterday? What would a $100K sell have cost?" "Who held the biggest positions in xyz:MSFT on October 20, and where are their liquidation prices?" "Which HIP-3 markets had the most liquidations last week?"
Your agent picks the tool, checks how much it will download, runs the query and explains the answer.
Everything in Reservoir: fills (trades, liquidations, ADL, builder and TWAP fills), 1-second candles, daily position, spot-balance and account-value snapshots, and 1-minute order books, for Hyperliquid and every HIP-3 venue (including ones that have shut down)
Same layout as the guide: same bucket paths, same market names, same DuckDB SQL. Anything the guide does,
reservoir_querycan runWatches your AWS bill: Reservoir is requester pays. Every tool estimates the download first, stops above a limit you control, and reports what each call downloaded
Knows where Reservoir stops: for today's data, intraday positions, individual orders, funding, open-interest history or very large per-wallet scans, results point to the Hydromancer API endpoint that answers it directly
Read-only: it reads the Reservoir bucket and its own local copies. It cannot write elsewhere, trade, sign or touch funds
1. Set up AWS (once)
Reservoir is free, but downloads are billed to your own AWS account (requester pays). The first 100 GB a month of AWS internet transfer is free, then about $0.114 per GB. A typical question downloads a few MB to a few hundred MB.
Install the AWS CLI v2.
Sign in:
aws login(or use a named profile with a read-only IAM user; see the guide for the policy).Check it works:
aws s3 ls s3://hydromancer-reservoir/ --request-payer requester --region ap-northeast-1You also need uv, which runs the server.
Related MCP server: Alpha Arena MCP
2. Add it to your AI app
Claude Code
claude mcp add reservoir -- uvx --from git+https://github.com/joshavenue/reservoir-mcp reservoir-mcpClaude Desktop
Settings → Developer → Edit Config, then add:
{
"mcpServers": {
"reservoir": {
"command": "uvx",
"args": ["--from", "git+https://github.com/joshavenue/reservoir-mcp", "reservoir-mcp"]
}
}
}Restart Claude Desktop. If it says uvx is not found, use the full path from which uvx (for example /Users/you/.local/bin/uvx).
Cursor
~/.cursor/mcp.json: use the same mcpServers block as Claude Desktop.
Codex
~/.codex/config.toml:
[mcp_servers.reservoir]
command = "uvx"
args = ["--from", "git+https://github.com/joshavenue/reservoir-mcp", "reservoir-mcp"]VS Code (GitHub Copilot)
.vscode/mcp.json:
{
"servers": {
"reservoir": {
"command": "uvx",
"args": ["--from", "git+https://github.com/joshavenue/reservoir-mcp", "reservoir-mcp"]
}
}
}Using a profile other than default? Add "env": { "AWS_PROFILE": "your-profile" }. You can also pass AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY (and AWS_SESSION_TOKEN) in env instead of signing in with the CLI.
Then ask: "Run reservoir_setup_check."
Tools
Tool | What it answers |
| Does my AWS access work? What is the newest day? How much have I downloaded this month? |
| What datasets, venues and dates exist? Is something (say, funding) in Reservoir, or which API endpoint has it? |
| Which files cover a date range, how big they are, and a ready |
| Any read-only DuckDB SQL over the bucket, written as in the guide. Estimates the download before running |
| Volume, taker buy/sell, net flow, long/short liquidations, VWAP for a market, a venue or a wallet; breakdowns by minute, hour, day, market or wallet; largest fills |
| OHLCV at 1s to 1d, built from Reservoir's 1-second candles |
| Spread, depth within N bps, slippage for an order size, and the full top-20 book at any minute |
| Every open position in a perp market from the daily snapshot: long vs short, leverage, largest positions, liquidation clusters |
| A wallet's perp positions, spot balances and account values on a given day |
| Save whole files locally (like |
The server also has a reservoir://guide resource and a reservoir_guide prompt that tell the agent which tool answers which question.
Market names
Same as in Reservoir itself:
Hyperliquid perps:
BTC,ETH,kPEPEHIP-3 perps:
xyz:MSFT,xyz:ANT,para:BTCD,io:ANTH(case is fixed for you)Spot:
@107,PURR/USDCHIP-4 outcomes:
#114940
Venues: hyperliquid, xyz (Trade[XYZ]), flx (Felix), vntl (Ventuals), hyna (HyENA), km and mkts (Markets.xyz, which moved from km to mkts in mid-2026), cash (Dreamcash), para (Paragon), io (Entropy).
Times accept 2026-10-26, 2026-10-26T14:00:00Z, 7d, 24h or Unix milliseconds, all UTC. A date-only end includes that whole day.
What it costs
Every result includes aws_usage: megabytes downloaded in that call and your month-to-date total through this server.
Reservoir files are sorted by time, and the tools read only the columns and time slices they need. The first 24 hours of xyz:ANT (two days of xyz fills, about 620 MB of files) downloaded 74 MB.
Files are not split by market or wallet, so a single-wallet question still reads whole days. Those results suggest the matching Hydromancer API endpoint.
Each call stops if its estimate is above
max_download_mb(1,024 MB unless you or your agent pass a different value; the highest allowed is set byRESERVOIR_HARD_MAX_DOWNLOAD_MB).Small files (order books, liquidation files, venue snapshots, most candle files) are kept in
~/reservoir-dataafter the first read, so asking again costs nothing.Running the server on an AWS machine in
ap-northeast-1(Tokyo) makes transfer free.
When Reservoir isn't the right source
Reservoir is a daily archive. It is added to once a day (yesterday's data lands around 10:00 to 12:00 UTC) and never includes today. When a request goes past what it holds, results include a hydromancer_api section naming the endpoint that answers it, with a link to its docs and an example request:
You asked for | Hydromancer API |
Today, or anything live |
|
Positions at any time of day |
|
Individual orders and who placed them |
|
Funding, open interest over time, oracle and mark prices |
|
One wallet over many days, PnL, deposits and withdrawals |
|
Slippage and depth over months, or orders bigger than 20 levels can fill |
|
Get an API key. Early-stage teams and public goods may qualify for free access. Questions or data requests: data@hydromancer.xyz.
Settings
Variable | Default | What it does |
|
| AWS CLI profile to read credentials from |
|
| Local copies of files, in the bucket's folder layout |
|
| Per-call download limit when a tool call doesn't set one |
|
| Highest limit a tool call may ask for |
|
| Keep files up to this size locally after first use |
|
| Stop a query after this many seconds |
| found on PATH | Full path to |
Safety
Read-only toward Hyperliquid: no trading, no signing, no private keys.
The DuckDB connection can read only
s3://hydromancer-reservoir/and the local data folder. Writing files, attaching databases, installing extensions and changing settings are blocked, andreservoir_queryaccepts a singleSELECT.Your AWS credentials stay on your machine. They are read from the AWS CLI or your environment and used only to sign requests to the Reservoir bucket.
Development
git clone https://github.com/joshavenue/reservoir-mcp && cd reservoir-mcp
uv sync
uv run pytest -q # offline unit tests
uv run python scripts/smoke.py # end-to-end over stdio (needs AWS, a few MB)
uv run python scripts/live_check.py # every tool against live data (needs AWS, a few hundred MB)Data definitions follow Hydromancer's docs: fills have one row per account side, volume counts the taker side only, open interest from snapshots is two-sided. See the schema reference.
License
MIT
Available Tools
10 toolsreservoir_candlesCandles from 1-second dataARead-onlyIdempotent
OHLCV candles at any interval, rolled up from Reservoir's 1-second candles (up to 1,500 candles per call).
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | UTC. A date ("2026-10-26"), date-time ("2026-10-26T14:00:00Z"), relative ("7d", "24h") or Unix ms. A date-only end includes that whole day. Default: the newest day in Reservoir. | |
| start | No | UTC. A date ("2026-10-26"), date-time ("2026-10-26T14:00:00Z"), relative ("7d", "24h") or Unix ms. A date-only end includes that whole day. Default: the newest day in Reservoir. | |
| market | Yes | Market as Reservoir names it: "BTC" (Hyperliquid perp), "xyz:MSFT" (HIP-3 perp), "@107" or "PURR/USDC" (spot), "#114940" (HIP-4). Case is fixed automatically for perps. | |
| interval | No | Candle size, built from Reservoir's 1-second candles. | 1h |
| max_download_mb | No | Stop if the estimated download is larger than this many MB (default 1024). Raise it only if the user accepts the AWS cost. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld safety, so the bar is lower, and the description still adds a real behavioral constraint: a hard cap of up to 1,500 candles per call, which tells the agent results may be truncated. It stops short of describing pagination/truncation mechanics or the interaction with the download-size guard.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the per-call cap placed where it will be seen first. Nothing wasted, nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema and rich parameter descriptions carry most of the load, and the source/cap is stated, but for a tool with a cost-related parameter and a 1,500-candle ceiling the description says nothing about truncation behavior, expected return shape, or when to widen the interval versus paginate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter including the interval enum and the max_download_mb cost warning is already fully documented in the schema. The description adds no syntax or format detail beyond what is structured, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific output (OHLCV candles) at any interval, derived from a specific source (Reservoir's 1-second candles). An agent can distinguish this from reservoir_query (raw data) or reservoir_download (files) without inspecting any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'rolled up from 1-second candles' — this is the aggregation tool — but the description never explicitly says when to prefer it over reservoir_query or how it interacts with reservoir_coverage. No exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reservoir_coverageWhat Reservoir coversARead-onlyIdempotent
Datasets, bucket paths, market naming, venues with their first and newest day, update schedule and
AWS cost. With topic, says whether Reservoir holds it and, if not, which Hydromancer API endpoint does.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | What the user wants, e.g. "funding history" or "liquidations". Says whether Reservoir has it or which Hydromancer API endpoint does. | |
| venue | No | Only this venue: hyperliquid, xyz, flx, vntl, hyna, km, mkts, cash, para, io. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, open-world behavior, so the safety bar is low. The description adds meaningful non-obvious content: it discloses the specific fields returned (venue first/newest day, update schedule, AWS cost) and the fallback behavior of pointing to an alternate API endpoint when a topic is absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler, and the coverage scope is front-loaded before the topic-routing behavior. The noun-pile style is dense but readable and every clause conveys content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema defining return values and annotations covering safety and idempotency, the description only needed to convey scope and topic routing, which it does. It could be slightly stronger by noting the no-argument default (full catalog), but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the venue enum list and a full explanation of `topic`, so the schema carries the parameter burden. The description restates the topic behavior without adding syntax, defaults, or format detail beyond the schema, making baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource it reports on (datasets, bucket paths, market naming, venue date ranges, update schedule, AWS cost), which clearly distinguishes it from sibling data-retrieval tools like reservoir_query or reservoir_candles. It is a telegraphic noun list rather than an explicit verb+object, but the intent (report Reservoir's coverage/catalog) is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the conditional behavior of the `topic` argument ('says whether Reservoir holds it and, if not, which Hydromancer API endpoint does'), which is a form of routing guidance. However, it never states when an agent should call this tool versus the sibling data tools (e.g., before querying, to discover venues), and gives no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reservoir_downloadDownload Reservoir filesAIdempotent
Like aws s3 cp: save whole Parquet files to the local Reservoir folder (RESERVOIR_DATA_DIR, default
~/reservoir-data), keeping the bucket's folder layout. Files already there are skipped. Use for repeated analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | UTC. A date ("2026-10-26"), date-time ("2026-10-26T14:00:00Z"), relative ("7d", "24h") or Unix ms. A date-only end includes that whole day. Default: the newest day in Reservoir. | |
| start | No | UTC. A date ("2026-10-26"), date-time ("2026-10-26T14:00:00Z"), relative ("7d", "24h") or Unix ms. A date-only end includes that whole day. Default: the newest day in Reservoir. | |
| venue | No | Venue for by_dex datasets. | |
| market | No | Needed for order-book datasets. | |
| dataset | Yes | Dataset key, as in reservoir_list_files. | |
| max_download_mb | No | Stop if the estimated download is larger than this many MB (default 1024). Raise it only if the user accepts the AWS cost. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, but the description adds the concrete mechanism: files land in a specific local folder, keep the bucket's layout, and existing files are skipped, which explains the idempotency rather than restating it. It does not mention network/credential requirements or what happens on partial failure, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the analogy and the destination path, then idempotency, then the use case. Nothing is redundant and every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full parameter documentation, the description only needs to convey the side effects and the intent, which it does. The remaining gap is the absence of any explicit comparison to the sibling query tools for an agent deciding between downloading and querying in place.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so dataset, start/end, venue, market, and max_download_mb are all documented in the schema, including cost warnings and defaults. The description adds no parameter-level detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete verb+resource ('save whole Parquet files') plus the exact destination (RESERVOIR_DATA_DIR, default ~/reservoir-data) and layout behavior (bucket folder structure preserved). The `aws s3 cp` analogy and 'whole Parquet files' phrasing implicitly separate it from query-style siblings like reservoir_query, but no sibling is named outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use for repeated analysis' is the only usage cue, and it implies when this beats querying remotely without stating the alternative or any exclusion. There is no guidance on when not to download (e.g., one-off lookups) or how it relates to reservoir_query / reservoir_orderbook.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reservoir_fillsFills, volume and liquidationsARead-onlyIdempotent
Trades for a market, a venue or a wallet over any past window: taker volume, buy/sell split, net flow, long/short liquidations, VWAP, high/low, wallets, plus optional breakdowns and raw fills.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | UTC. A date ("2026-10-26"), date-time ("2026-10-26T14:00:00Z"), relative ("7d", "24h") or Unix ms. A date-only end includes that whole day. Default: the newest day in Reservoir. | |
| kind | No | Which fill file to read. liquidations/adl/twap_fills/builder_fills are much smaller than all. | all |
| rows | No | Also return this many individual fills (0 = none). | |
| start | No | UTC. A date ("2026-10-26"), date-time ("2026-10-26T14:00:00Z"), relative ("7d", "24h") or Unix ms. A date-only end includes that whole day. Default: the newest day in Reservoir. | |
| venue | No | Venue when no market is given (default hyperliquid). | |
| market | No | Market as Reservoir names it: "BTC" (Hyperliquid perp), "xyz:MSFT" (HIP-3 perp), "@107" or "PURR/USDC" (spot), "#114940" (HIP-4). Case is fixed automatically for perps. Omit to cover a whole venue. | |
| address | No | Only this wallet (0x...). Reservoir files are per day, so this scans whole days. | |
| min_usd | No | With rows: only fills of at least this USD value, largest first. | |
| group_by | No | Also return a breakdown. | none |
| with_tx_hash | No | Include tx_hash in rows (the largest column; costs more). | |
| max_download_mb | No | Stop if the estimated download is larger than this many MB (default 1024). Raise it only if the user accepts the AWS cost. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety is covered. The description adds little behavioral context of its own — the cost warnings, day-level scanning, and small-file hints all live in the schema, not the description. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with scope and then lists outputs; no filler. The metrics list is dense but each clause carries information an agent needs to know the tool exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% schema description coverage, the description only needs to convey the analytical surface, which it does by naming the aggregates and optional breakdowns/raw fills. What's missing is guidance on volume/time-range cost tradeoffs, which is relevant given a per-day file scan of possibly large downloads.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 11 parameters is already documented with format, defaults and constraints (relative dates, max_download_mb cost guard, group_by enums). The description adds no parameter-level meaning beyond the schema, which is the expected baseline at full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a concrete resource (fills/trades) and enumerates the aggregates it returns: taker volume, buy/sell split, net flow, liquidations, VWAP, high/low, wallets, raw fills. Scope is stated as market/venue/wallet over any past window. It does not distinguish itself from siblings such as reservoir_query or reservoir_candles, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — an agent can infer this is the fills/volume aggregation tool, but the description never says when to prefer it over reservoir_query, reservoir_candles, or reservoir_download, nor any exclusions or prerequisites. No explicit when/when-not guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reservoir_list_filesList Reservoir filesARead-onlyIdempotent
Like aws s3 ls: the exact Parquet files for a dataset and date range, their sizes, the full-download
cost and a ready read_parquet(...) snippet for reservoir_query. Lists only; downloads nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | UTC. A date ("2026-10-26"), date-time ("2026-10-26T14:00:00Z"), relative ("7d", "24h") or Unix ms. A date-only end includes that whole day. Default: the newest day in Reservoir. | |
| start | No | UTC. A date ("2026-10-26"), date-time ("2026-10-26T14:00:00Z"), relative ("7d", "24h") or Unix ms. A date-only end includes that whole day. Default: the newest day in Reservoir. | |
| venue | No | Venue for by_dex datasets (default hyperliquid, or the market's venue). | |
| market | No | Needed for order-book datasets; sets the venue for others. | |
| dataset | Yes | Dataset key from reservoir_coverage, e.g. fills, liquidations, candles, perp_snapshots, orderbook, spot_fills, outcome_fills, account_values. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, idempotent, open-world behavior, but the description adds concrete context: the tool returns file listings with sizes and download cost and performs no download. It does not mention auth or rate limits, which is a minor gap for a read-only listing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with a useful analogy and immediately scoped by dataset/date range. Every phrase adds information, and the non-download behavior is stated without clutter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the annotations cover safety semantics, while the input schema fully documents all parameters. The description supplies enough context for an agent to understand the tool's role and call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including detailed start/end formats and venue/market meanings. The description only maps loosely to dataset and date range and adds no parameter syntax or constraints beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: it lists exact Parquet files for a dataset and date range, with sizes, cost, and a query snippet. The phrase 'Lists only; downloads nothing' clearly distinguishes it from download/query siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It establishes a clear use case via the `aws s3 ls` analogy and points to `reservoir_query` as the consumer of the returned snippet. 'Lists only; downloads nothing' rules out download behavior, but it does not explicitly name `reservoir_download` or other siblings as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reservoir_orderbookOrder book: spread, depth, slippageARead-onlyIdempotent
Minute-by-minute top-20 L2 books: mid, spread, USD depth within N bps, optional slippage for an order size, medians over the window, and the full book at a given minute (max 31 days).
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | Return the full top-20 book nearest this time instead of a window. | |
| end | No | UTC. A date ("2026-10-26"), date-time ("2026-10-26T14:00:00Z"), relative ("7d", "24h") or Unix ms. A date-only end includes that whole day. Default: the newest day in Reservoir. | |
| every | No | Sampling of the returned series. | 1h |
| start | No | UTC. A date ("2026-10-26"), date-time ("2026-10-26T14:00:00Z"), relative ("7d", "24h") or Unix ms. A date-only end includes that whole day. Default: the newest day in Reservoir. | |
| market | Yes | Market as Reservoir names it: "BTC" (Hyperliquid perp), "xyz:MSFT" (HIP-3 perp), "@107" or "PURR/USDC" (spot), "#114940" (HIP-4). Case is fixed automatically for perps. | |
| depth_bps | No | Depth bands in bps from mid (default [10, 50, 100]). | |
| notional_usd | No | Also compute buy and sell slippage for a market order of this size. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld), and the description adds real behavioral context on top: top-20 depth cap, a 31-day maximum window, and that windowed results are medians rather than raw samples. It omits rate limits, pagination, and empty-result behavior, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the resource and enumerates outputs in the order an agent would care about them. No filler, though the run-on enumeration takes a second pass to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the 100%-covered input schema handles parameter detail. The description supplies the key constraints (top-20, 31-day cap, median aggregation) an agent needs before calling; only sibling differentiation is left thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters including formats for start/end and the enum for every. The description adds only marginal meaning, mainly that 'N bps' maps to depth bands and 'order size' to notional_usd, plus the medians-over-window aggregation semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource and payload precisely: top-20 L2 books with mid, spread, USD depth by bps, slippage, window medians, and full-book snapshots. That is enough for an agent to tell it apart from reservoir_candles or reservoir_fills, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the 'medians over the window' vs 'full book at a given minute' phrasing hints at two modes of call, and '(max 31 days)' bounds the window. There is no explicit when-to-use, when-not-to-use, or routing to alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reservoir_positionsWho holds a perp marketARead-onlyIdempotent
Every open position in a perp market from the daily snapshot: long vs short accounts and notional, average entry, leverage, largest positions with liquidation prices, and where liquidations cluster.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | How many of the largest positions to list. | |
| date | No | Snapshot day (UTC date). Default: newest snapshot. | |
| market | Yes | Market as Reservoir names it: "BTC" (Hyperliquid perp), "xyz:MSFT" (HIP-3 perp), "@107" or "PURR/USDC" (spot), "#114940" (HIP-4). Case is fixed automatically for perps. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description usefully adds the key temporal behavior: data comes from the daily snapshot rather than live state, which is important context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single front-loaded sentence that scopes the tool before enumerating the data it returns. It is dense but not padded, though part of the return-value enumeration is partly redundant given the presence of an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, annotated tool with a full input schema and output schema, the description is largely sufficient for invocation. However, it says 'perp market' while the market parameter schema explicitly includes spot markets, creating a scope mismatch that could cause the agent to skip valid use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents market, date, and top semantics. The description does not add parameter-level detail beyond indirectly implying snapshot date and largest-position limiting, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource and scope: open positions in a market from the daily snapshot, with long/short aggregates, entries, leverage, largest positions, and liquidation clusters. This clearly separates it from siblings like reservoir_orderbook, reservoir_fills, and reservoir_candles, though it uses no explicit verb like 'list' or 'get'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the resource: use this for position/holder data from a daily snapshot. However, it offers no explicit when-to-use or when-not-to-use guidance and does not route the agent to alternatives such as reservoir_query for custom analysis or reservoir_orderbook for live book data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reservoir_queryRun SQL on ReservoirARead-onlyIdempotent
Run DuckDB SQL directly on the Reservoir bucket, exactly like the exploring-reservoir blog. Before running, estimates the download from the columns the query reads and refuses above max_download_mb. Only the Reservoir bucket and local Reservoir copies can be read. Prefer the dedicated tools for fills, candles, books and positions.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | One read-only DuckDB SELECT over s3://hydromancer-reservoir/... paths, written as in the blog, e.g. SELECT ... FROM read_parquet('s3://hydromancer-reservoir/by_dex/xyz/fills/perp/all/date=2026-10-26/fills.parquet') WHERE coin = 'xyz:MSFT'. | |
| dry_run | No | Only estimate the download; do not run. | |
| max_rows | No | Rows to return (default 200). | |
| max_download_mb | No | Stop if the estimated download is larger than this many MB (default 1024). Raise it only if the user accepts the AWS cost. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), and the description adds non-obvious behavior the annotations cannot express: an automatic download-size estimate derived from the columns read, a hard refusal above max_download_mb, and a read restriction to the Reservoir bucket and local copies. These are the failure modes an agent needs to anticipate before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the core action, guardrail and alternative routing front-loaded in that order. The reference to "exactly like the exploring-reservoir blog" is a mild external pointer that costs a clause without full standalone value, but nothing else is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists and annotations declare the safety profile, the description supplies everything else an agent needs: access scope, cost guardrail, alternatives, and the read-only SELECT constraint (reinforced in the schema). Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description meaningfully explains max_download_mb's mechanism (estimate based on columns read, refusal above threshold) rather than just restating it. The sql parameter's syntax and path conventions are left entirely to the schema, so it does not fully supersede the structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Run DuckDB SQL directly on the Reservoir bucket") plus the exact access scope, and explicitly bounds itself against sibling tools for fills, candles, books and positions. An agent can classify this as the escape-hatch SQL tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (ad-hoc DuckDB SELECTs over the bucket), explicit when-not (“Prefer the dedicated tools for fills, candles, books and positions”), and the named domains map cleanly onto reservoir_fills, reservoir_candles, reservoir_orderbook and reservoir_positions. It also flags the cost precondition for raising the download ceiling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reservoir_setup_checkCheck Reservoir accessARead-onlyIdempotent
Check AWS sign-in, requester-pays access to the Reservoir bucket, DuckDB, the local data folder and this month's download total. Run this first, or whenever a tool reports a credentials error.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds useful context beyond that by listing the specific environmental checks performed, which tells the agent what this diagnostic verifies without redundant safety restatement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first enumerates the checks, the second front-loads the usage trigger. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists to describe return values, and annotations cover safety and idempotency. The description supplies the remaining context an agent needs: what is checked and when to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing for the description to clarify; the schema is trivially complete. Baseline 4 applies, with no evidence of missing parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Check Reservoir access') and then enumerates exactly what is checked: AWS sign-in, requester-pays bucket access, DuckDB, local data folder, and monthly download total. This makes it immediately distinguishable from the data-fetching sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger condition: 'Run this first, or whenever a tool reports a credentials error.' That is strong when-to-use guidance, though it does not name specific sibling alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reservoir_walletOne wallet's daily snapshotARead-onlyIdempotent
A wallet's perp positions, spot balances and account values on a given day, from the global snapshots. These files are not split by wallet, so each part scans the whole day's file.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Snapshot day (UTC date). Default: newest snapshot. | |
| address | Yes | Wallet address, 0x followed by 40 hex characters. | |
| include | No | Parts to read (default all three). | |
| max_download_mb | No | Stop if the estimated download is larger than this many MB (default 1024). Raise it only if the user accepts the AWS cost. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description adds a genuinely useful non-obvious trait: the underlying files are not partitioned by wallet, so each requested part scans the full day's file — a real cost/latency signal that pairs with the schema's max_download_mb guard.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the concrete payload and followed by the operational caveat; nothing is wasted. The second sentence is terse to the point of slight ambiguity about what 'these files' refers to, keeping it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% param coverage, the description need only frame scope and cost, which it does. The main remaining gap is routing guidance against reservoir_positions/reservoir_query, which an agent would need to choose this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains date defaulting, address format, the include enum, and the download cap; baseline 3 applies. The description only indirectly motivates 'include' via the whole-file scan note and adds no format or default detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the specific resource (perp positions, spot balances, account values for one wallet on one day) and the source (global snapshots), which is concrete enough to distinguish it from a generic query tool. It does not explicitly name reservoir_positions or reservoir_query as the alternative, so sibling differentiation is only implied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'one wallet's daily snapshot' versus the whole-day global files, but there is no explicit when-to-use statement, no exclusion of reservoir_positions or reservoir_query, and no prerequisites (e.g. needing reservoir_setup_check first). The agent must infer selection from the name and the one-line scan caveat.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
reservoir_candles - First observed
reservoir_coverage - First observed
reservoir_download - First observed
reservoir_fills - First observed
reservoir_list_files - First observed
reservoir_orderbook - First observed
reservoir_positions - First observed
reservoir_query - First observed
reservoir_setup_check - First observed
reservoir_wallet
TDQS
Scored across 10 tools
Most tools target clearly distinct resources or actions: setup, coverage, file listing, specialized market-data queries, and file downloads. The broad reservoir_query overlaps with the specialized fills/candles/orderbook/positions tools, but its description explicitly says to prefer the dedicated tools, reducing misselection risk.
All tools use the consistent reservoir_ prefix and snake_case, which makes them easy to scan and group. The set mixes action-like names (list_files, setup_check, download) with resource-like names (fills, candles, orderbook), so it is not a perfect verb_noun convention, but it remains predictable.
Ten tools is well-scoped for a specialized market-data access server. Each tool has a clear role: setup, discovery, listing, querying, specialized data views, and downloading.
The surface covers the full read-only lifecycle for this domain: credential/setup checking, dataset discovery, file listing, SQL access, common analytical queries, and local downloads. The generic reservoir_query provides an escape hatch for any dataset not covered by the specialized tools, so there are no obvious dead ends.
Maintenance
Related MCP Connectors
Read-only Hyperliquid data for AI agents: fills, candles, funding, liquidations, wallet analytics.
Version 2.8.0. HyperNatt Terminal: liquidation radar, Hyperliquid execution context and Li.Fi cross-chain swap for AI agents. BTC ETH SOL BNB XRP HYPE ZEC. Before an order: estimate depth, VWAP, spread and fees for its size. Between checks: compare liquidity and costs with the previous baseline. After execution: reconcile supplied fills. Read-only data, no custody or order submission. 6 tools, v2.8.0; call get_agent_manifest first. Radar and each execution-context call cost 0.001 USDC via x402 Base/Solana or eligible credits; manifest and MCP swap quote are free (on-chain swap fees apply). Daily MCP trial: one free call per paid tool and per token per client each UTC day. Four tools x seven tokens = up to 28 independent trials; then 0.001 USDC per call. Read trial_policy_v2 and free_tier_status_v1 on the same MCP connection for current availability. A zero daily_cap is the separate credit pool, not the intro allowance. Full platform: https://hypernatt.com. Docs: github.com/DIALLOUBE-RESEARCH/hypernatt-terminal.
Polymarket + Hyperliquid + macro for AI agents. 38 tools, signal backtest, SSE streaming. Free tier.
Polymarket orderbook history, live books, trades and settlements, plus Hyperliquid perp books.
Related MCP Servers
AlicenseAqualityAmaintenanceProvides comprehensive crypto intelligence for the Hyperliquid exchange, allowing users to query trader profiles, behavioral cohorts, and live market data. It enables AI agents to analyze over 1.8 billion trades, track whale positions, and access real-time liquidation heatmaps.10677 npm10MIT- AlicenseAqualityDmaintenanceEnables AI agents to interact with Hyperliquid perpetual futures exchange for market analysis, account management, and risk-managed trading.51MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to query Hyperliquid spot market data, including token listings, live prices, 24h volumes, and wallet balances, via pay-per-call x402 micropayments.MIT
- AlicenseAqualityAmaintenanceProvides AI agents read-only, keyless access to Hyperliquid market data, funding rates, account risk, and HyperEVM token transfers through MCP tools, with caching and rate limiting to protect upstream APIs.121MIT