MCP server · open source · no API keys

VINTAGE

Free market research terminal

Vintage federates the free, point-in-time financial data of the web.

Point-in-time means you only ever see what the world could actually see that day. No number that was revised, restated or listed years later leaks backwards into a test of the past.

There is no free lunch in market data — the real terminals cost more than a car. But most of what they sell is already public and already free, just scattered across a dozen government, university and exchange sites in ten incompatible formats, none of them keeping track of when anything became known. Vintage is the closest thing to a free terminal: one pipeline, one schema, one interface.

Eighteen free
      financial data sources — SEC EDGAR, Form 13F, FRED, ECB, US Treasury, BLS, BEA,
      CFTC, CBOE, FINRA, Coinbase, Ken French and more — federated behind one interface,
      every row carrying both the date it describes and the date it became public
Eighteen sources scattered across the internet, one interface, every value dated twice.
claude mcp add vintage -s user -- uvx vintage-mcp

Free forever · no key · no account

$0total cost
100years of history
18primary sources
6verbs, that's the API
800k+macro series
331published anomalies

How the federation works

Filings from the regulator that receives them, macro from the central bank that publishes it, factors from the university that computes them — then four stages that make them one dataset. Vintage hosts none of it.

THE WEB · FREE, PUBLIC, SCATTERED VINTAGE · THE FEDERATION LAYER ONE INTERFACE REGULATORS SEC EDGAR XBRL SEC filings stream FINRA short volume XBRL JSON · index files · pipe-delimited CENTRAL BANK FRED ALFRED vintages CSV · REST · 800k series ACADEMIA Ken French Library Open Source Asset Pricing zipped CSV · Google Drive MARKETS & CROWD Yahoo Finance Coinbase Exchange ApeWisdom chart JSON · REST · no history 1 resolve AAPL · 0000320193 · “Apple Inc” → one entity key every source accepts 2 normalize four wire formats, ten field vocabularies → one schema, one unit convention 3 stamp vintage every row gets observed_at + known_at no honest date → flagged UNKNOWN_VINTAGE 4 index on known_at the panel is point-in-time by construction there is no flag that turns this off one schema · one key · two dates per row nothing hosted · nothing redistributed · no API keys SIX VERBS resolve discover fetch events backtest benchmark source is a parameter, never a new tool YOUR AI CLIENT · MCP backtest 12-1 momentum on the dow 30 since 2010 sharpe 2.14 deflated 0.09 after 41 tries claude · cursor · chatgpt · anything

← swipe the diagram sideways

1926what that federation coverstoday
SEC EDGAR XBRL2009 → today
SEC filings stream1993 → today
FRED1947 → today
ALFRED vintages1996 → today
Ken French LibraryJul 1926 → today
Open Source Asset Pricing1926 → 2023
FINRA short volume2009 → today
Coinbase Exchange2015 → today
Yahoo Finance1962 → today
ApeWisdomrecords from today

The full field-by-field catalogue is generated from the registry, so it cannot drift from the code.

Point-in-time, in one picture

Gluing ten APIs together is a weekend. Keeping them honest about time is the whole job. Watch the day-marker sweep forward: a fact only enters your backtest once it was genuinely public, and a correction adds a row instead of erasing one.

TIME → the day you are pretending it is today Jul 2019 Jan 2020 Jul 2020 Jan 2021 10-K FY2019 · assets $338.5B public 31 Oct 2019 10-Q Q1 2020 public 29 Jan 2020 FY2019 restated · $323.9B public 30 Oct 2020 nobody knew yet period ends Sep 2019 WHAT YOUR BACKTEST IS ALLOWED TO SEE assets $338.5B filed 31 Oct 2019 Q1 2020 filed filed 29 Jan 2020 assets $323.9B · restatement filed 30 Oct 2020 — row 1 stays

← swipe the diagram sideways

Lagtrue in December, published in February Restatementthe company changes last year's number Revisionthe government keeps fixing old figures Survivorshipdead companies quietly disappear Membershiptoday's S&P 500 is not 2005's list Adjustmentsplits rewrite every price before them

Six ways yesterday's data quietly changed underneath you. Sources that cannot supply an honest known_at are flagged UNKNOWN_VINTAGE rather than given a made-up date.

And it counts how many times you asked

Free data plus a fast backtester is a machine for fooling yourself. Vintage keeps a ledger of every idea you tried this session and prices it into the result.

ONE RESEARCH SESSION 41 ideas tried — every one counted TRIAL LEDGER n = 41 kept per session, automatically DEFLATED SHARPE · BAILEY & LÓPEZ DE PRADO (2014) 2.14 what your backtest reported 2.29 what pure luck would have produced 0.09 what is left once the 41 tries are priced in

← swipe the diagram sideways

shipped · point-in-time panel shipped · costs on turnover shipped · deflated Sharpe shipped · session trial ledger planned · PBO via CSCV planned · purged k-fold + embargo planned · minimum backtest length planned · Newey–West planned · square-root impact

Execution realism is a different problem, already solved by LEAN and Nautilus Trader — Vintage runs before that, where most ideas should die. Citations are references, not endorsements; anything marked planned is not in the code yet, and the backtest response says so at runtime.

What it feels like

claude — vintage
$claude mcp add vintage -s user -- uvx vintage-mcp
connected · sec · fred · dartmouth · openap · coinbase · finra
backtest 12-1 momentum on the dow 30 since 2010
reading 30 tickers from yahoo-finance, 3,914 sessions
panel indexed on known_at — lookahead structurally impossible
annualized return14.8%volatility17.1%turnover cost−40 bps/yr
sharpe2.14
try short-term reversal instead
sharpe1.87
and low volatility
sharpe2.31
honesty report
specs tried this session41
sharpe noise would produce2.29
deflated sharpe probability0.09
after 41 trials, a sharpe this high is what noise produces.
the terminal you pay for does not tell you this.

Four more questions answered end to end on the demo reel.

Install

One command. Nothing to clone.

claude mcp add vintage -s user -- uvx vintage-mcp

Add to claude_desktop_config.json, then restart the app.

{
  "mcpServers": {
    "vintage": {
      "command": "uvx",
      "args": ["vintage-mcp"]
    }
  }
}

Add to ~/.cursor/mcp.json.

{
  "mcpServers": {
    "vintage": {
      "command": "uvx",
      "args": ["vintage-mcp"]
    }
  }
}

Settings → Connectors → Developer mode. Needs a hosted URL — run vintage behind HTTPS and point the connector at it.

uvx vintage-mcp --transport streamable-http --port 8000

Needs uv. Prefer pip? pip install vintage-mcp, then use vintage as the command. No API keys required for anything above.