Your coding agent, connected to 26 years of market data

MarketParquet speaks MCP. Claude Code, Codex CLI, Cursor — any MCP-capable agent — can answer market questions by running DuckDB SQL server-side against the archive. No downloads, no data wrangling.

agent session
you > what was SPY's max drawdown in 2022?
agent > query_sql(etf, daily, 2022-01-01 .. 2022-12-31) ... 251 files scanned
agent > SPY's 2022 max drawdown was -25.4%, bottoming on Oct 12.
01
Get an API key

Register free and create a bt_ key on your account page. Any key can connect and browse the catalog.

02
Add the server

One command or a few config lines — pick your client below. The endpoint speaks MCP Streamable HTTP.

03
Ask questions

Your agent explores symbols, pulls bars, and aggregates with full DuckDB SQL — server-side, against the parquet archive.

[ Setup ]

> Claude Code

claude mcp add --transport http marketparquet \
    https://marketparquet.com/labs/mcp \
    --header "Authorization: Bearer bt_YOUR_KEY"

> Codex CLI (~/.codex/config.toml)

[mcp_servers.marketparquet]
url = "https://marketparquet.com/labs/mcp"
http_headers = { Authorization = "Bearer bt_YOUR_KEY" }

> Cursor (.cursor/mcp.json)

{
  "mcpServers": {
    "marketparquet": {
      "url": "https://marketparquet.com/labs/mcp",
      "headers": { "Authorization": "Bearer bt_YOUR_KEY" }
    }
  }
}

> opencode (opencode.json)

{
  "mcp": {
    "marketparquet": {
      "type": "remote",
      "url": "https://marketparquet.com/labs/mcp",
      "headers": { "Authorization": "Bearer bt_YOUR_KEY" }
    }
  }
}

> Kimi CLI (~/.kimi/mcp.json)

{
  "mcpServers": {
    "marketparquet": {
      "url": "https://marketparquet.com/labs/mcp",
      "headers": { "Authorization": "Bearer bt_YOUR_KEY" }
    }
  }
}

> Any MCP client

endpoint: https://marketparquet.com/labs/mcp   (MCP Streamable HTTP)
header:   Authorization: Bearer bt_YOUR_KEY

Replace bt_YOUR_KEY with a key from your account page.

[ Tools ]

list_datasetsany key

Every dataset (asset class × timeframe) with file counts, date coverage, and your key's access window. Agents call it first.

list_symbolskeep current

Search the ~30,000-ticker universe — stocks, ETFs, futures, delisted included — with first/last trade date per symbol.

get_barskeep current

OHLCV for one symbol over a date range, 1-minute to daily. The quick look before a deeper query.

query_sqlkeep current

Read-only DuckDB SQL over a bars view — window functions, QUALIFY, corr(), date_trunc — run server-side against the parquet archive.

get_download_urlkeep current

A presigned parquet file when the agent needs one file locally. Counts as a normal download.

get_download_urlskeep current

Presigned URLs for a whole date range — up to 400 daily or 25 intraday files per call. The bulk path to local backtesting.

[ One tool call, real answers ]

you > what was SPY's max drawdown in 2022?
WITH eq AS (
  SELECT date, close,
         max(close) OVER (ORDER BY date) AS peak
  FROM bars WHERE symbol = 'SPY')
SELECT round(min(close / peak - 1) * 100, 2) AS max_drawdown_pct FROM eq;
-- -25.4% (trough 2022-10-12), computed over 251 daily files
you > which ETFs had the biggest volume spikes vs their 20-day average?
SELECT symbol, date,
       round(volume / avg(volume) OVER w, 1) AS spike
FROM bars
WINDOW w AS (PARTITION BY symbol ORDER BY date ROWS 20 PRECEDING)
QUALIFY spike > 8 ORDER BY spike DESC LIMIT 10;

[ Full backtests ]

query_sql is for research — capped, aggregated, server-side. Real backtests run on your machine, and your agent drives the whole loop:

01
Research the signal

Explore symbols and test ideas with query_sql — server-side SQL, nothing to download yet.

02
Pull the range

get_download_urls hands your agent presigned URLs for the whole backtest window; it downloads them in parallel.

03
Backtest locally

The agent writes and runs the backtest against local parquet — pandas, Polars, vectorbt, DuckDB — with no query caps at all.

you > backtest a 50/200-day golden cross on SPY since 2005, with realistic fills
agent > query_sql(...)              -- sanity-checks the signal server-side
agent > get_download_urls(etf, daily, 2005-01-01 .. 2026-07-21)  x 14 chunks
agent > xargs -P8 curl ...          -- ~5,400 files to ./data/
agent > python backtest.py          -- full path-dependent engine, local
agent > CAGR 9.8%, max DD -22%, 14 round trips. Full tearsheet in results/

[ Pricing ]

Included with Keep Current $15/mo — no separate MCP fee

The same subscription that rolls your archive forward each trading day unlocks every MCP data tool. Any valid API key can connect and call list_datasets without it.

> see pricing

[ Limits & fair use ]

  • Read-only: a single SELECT/WITH statement per query
  • Per query: 320 daily files or 8 intraday files, 200 result rows, 90s wall clock
  • Bulk downloads: 400 daily / 25 intraday presigned files per get_download_urls call — chunk longer ranges; local work has no caps
  • Standard API rate limits apply (600 req/min on paid plans)
  • Date ranges are clamped to your plan's access window
  • MCP Streamable HTTP, protocol 2025-06-18 — early-access surface, tool schemas may evolve

Questions? FAQ or [email protected]