Skip to main content
Glama

Free financial data exists and is scattered across twenty APIs with twenty shapes. Everyone rebuilds the same glue, badly, and quietly ends up backtesting on restated figures and survivor biased universes.

Vintage is that glue, written once, served over MCP. It hosts no data. It connects, normalizes, and serves structured financial data from the web.

What people use it for

Related MCP server: QuantForge MCP Server

Install

Claude Code

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

Claude Desktop / any MCP client — add to your config file:

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

Claude Desktop config lives at %APPDATA%\Claude\claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS). Restart the app afterwards. MCP servers load once at startup.

Needs uv. If you'd rather use pip: pip install vintage-mcp and set the command to vintage.

Optional configuration

Everything works with zero configuration. These make it work better:

Variable

Why

VINTAGE_USER_AGENT

SEC EDGAR asks for a real contact. "Your Name your@email.com".

FRED_API_KEY

Free key — unlocks 800k macro series with first-release vintages.

VINTAGE_CACHE_DIR

Defaults to ~/.cache/vintage.

Set them under "env" in the same config block:

{
  "mcpServers": {
    "vintage": {
      "command": "uvx",
      "args": ["vintage-mcp"],
      "env": {
        "VINTAGE_USER_AGENT": "Jane Quant jane@example.com",
        "FRED_API_KEY": "..."
      }
    }
  }
}

Your key stays in this file. It is read by the server process and is never passed through the model or written into the conversation.

Use it as a library

The same data, without the server. Everything is synchronous and returns pandas, including inside Jupyter where a loop is already running.

import vintage as v

v.prices("AAPL", start="2020-01-01")          # daily prices, with known_at
v.panel(["AAPL", "MSFT", "JNJ"])              # dates x tickers
v.fundamentals("AAPL", "us-gaap:Assets", as_of="2020-01-01")
v.restatements("AAPL", "us-gaap:Assets")      # periods reported twice, differently
v.factors("ff3")                              # Ken French, wide
v.macro("DGS10", as_of="2008-09-15")          # ALFRED first-release vintage
v.claim("Mom12m")                             # what the paper claimed
v.claims(price_only=True)                     # the 56 replicable with free data
v.crypto("BTC-USD")
v.short_volume("AAPL")
v.sentiment("wallstreetbets")

known_at is kept as a column on every frame rather than dropped for tidiness — losing it is how a point-in-time dataset quietly becomes an ordinary one. Pass as_of and rows published after that date are gone before you see them.

Try it

Once installed, ask your assistant:

"What was Apple's total assets as of January 2020 — and has it been restated since?"

"Backtest 12-1 momentum on the Dow 30 since 2010."

"Now try short-term reversal instead. Did the alpha survive?"

The third question is the one that matters. Every answer carries the worst held-out path next to the headline Sharpe.

The two dates

Every value carries both:

  • observed_at — what period the number describes

  • known_at — when it first became public

A backtest may only use rows whose known_at precedes the trade date. That is structural, not a setting: the panel is indexed on known_at, so any slice of it is automatically point-in-time. There is no flag to turn it off.

Sources that cannot supply an honest known_at are flagged UNKNOWN_VINTAGE rather than given a fabricated date.

Six ways yesterday's data quietly changed

  • Lag — the number is true in December, published in February.

  • Restatement — the company says "oops, wrong" and changes last year's figure.

  • Revision — the government keeps fixing old jobs and inflation numbers, for years.

  • Survivorship — dead companies get deleted; only the winners are still listed.

  • Membership — today's S&P 500 list is not the list from 2005.

  • Price adjustment — splits and dividends silently rewrite every price before them.

All six say the same thing: the data you have today is not what people saw back then.

Six verbs

Source is a parameter, never a separate tool. Twenty more sources adds zero tools.

Verb

Does

resolve

Any identifier → the entity key everything else accepts

discover

Plain-English search across every source's catalog

fetch

The workhorse. Any field, any source, with as_of

events

Filing timeline with exact public timestamps

backtest

Cross-sectional signal → returns, costs, held-out paths

benchmark

Your returns → correlation and alpha vs published factors

Plus status for cache size, keys, and how many specs you have tried.

Backtesting methodology

  • Deflated Sharpe (Bailey & López de Prado, 2014) accounting for every spec tried this session

  • Costs always charged on turnover. There is no zero-cost mode

  • A standing survivorship warning, because the universe is a list of names that exist today

Vintage implements the backtest-validation literature rather than inventing its own statistics. Execution realism is a different problem, already solved by LEAN and Nautilus Trader — Vintage runs before that, at the stage where most ideas should die.

Technique

Source

Status

Point-in-time panel indexed on known_at

structural, no flag to disable

✅ shipped

Costs charged on turnover, always

no zero-cost mode exists

✅ shipped

Deflated Sharpe Ratio

Bailey & López de Prado (2014)

✅ shipped

Session trial ledger feeding the deflation

Bailey & López de Prado (2014)

✅ shipped

Probability of Backtest Overfitting, via CSCV

Bailey, Borwein, López de Prado & Zhu (2017)

⏳ planned

Purged k-fold CV with embargo

Advances in Financial Machine Learning, ch. 7

⏳ planned

Combinatorial purged cross-validation

Advances in Financial Machine Learning, ch. 12

⏳ planned

Minimum Backtest Length

Bailey, Borwein, López de Prado & Zhu (2014)

⏳ planned

Newey–West adjustment for autocorrelated returns

Newey & West (1987)

⏳ planned

Square-root market impact

Almgren et al. (2005)

⏳ planned

Citations are references, not endorsements — none of these authors is affiliated with Vintage. Anything marked planned is not in the code yet, and the backtest response says so at runtime rather than in the footnotes.

Where the data comes from

A century of market history, twenty-two sources, and twenty of them need no key at all. The Fama-French factors start in July 1926 and the SEC filing stream runs to this morning — Vintage covers both ends from the same six verbs.

Most of these are the primary source — not a reseller, not a scraper. The filings come from the regulator that receives them, the macro series from the central bank that publishes them, and the factors from the university that computes them.

@remove all emojis and just print list of soruceswith icons for them.

Source

Standing

Covers

Key

Point-in-time

SEC EDGAR XBRL

Primary · US regulator

Every concept every US filer has tagged, with accession number and filing date on each figure. Restatements arrive as rows, never as an overwrite.

none

✅ native filing dates

SEC filings stream

Primary · US regulator

8-K, 10-K, 10-Q, Form 4, 13D/G — timestamped to the second EDGAR accepted them.

none

✅ exact timestamps

FRED / ALFRED

Primary · central bank

Federal Reserve Bank of St. Louis. ALFRED keeps first releases, so you can ask what CPI looked like that morning.

free

✅ first-release vintages

Ken French Data Library

Primary · academic

Dartmouth. FF3, FF5, momentum, daily FF3, 49 industry portfolios — from where the authors publish them.

none

❌ rebuilt each release

Open Source Asset Pricing

Primary · academic

Chen & Zimmermann. 331 published predictors with claimed return, t-stat, sample window and an implementable definition. openap:Mom12m returns Jegadeesh-Titman's 1.31%/mo, t=3.74.

none

✅ claims dated to publication year

SEC Form 13F

Primary · US regulator

Institutional equity holdings for every manager over $100m. Quarter end and filing date are up to 45 days apart and both are kept, so as_of returns the book that was actually public.

none

✅ quarter end vs filing date

SEC Form 25

Primary · US regulator

Every delisting on record — 36,830 filings across 11,614 companies. The correction for a universe built from names that still exist.

none

✅ filing dates, never revised

SEC XBRL frames

Primary · US regulator

One concept across every filer in a single call. 6,289 companies in 840 KB — the shape a cross-sectional sort needs.

none

❌ carries the accession, not its date

US Treasury

Primary · US government

The par yield curve, 14 tenors from one month to thirty years, published each business day.

none

✅ never revised

CFTC

Primary · US regulator

Commitments of Traders. Tuesday's positioning by trader class, released the following Friday, and the lag is preserved.

none

✅ lag preserved in known_at

Bureau of Labor Statistics

Primary · US agency

CPI down to item strata, payrolls, JOLTS, wages, productivity. Any series id, not a curated shortlist.

optional

❌ ships no release date

Bureau of Economic Analysis

Primary · US agency

The national accounts. One call returns every line of a NIPA table rather than one series at a time.

free

❌ current estimate only

European Central Bank

Primary · central bank

Daily FX reference rates since 1999, plus any cross derived from two euro legs and labelled as derived.

none

✅ published once, never revised

CBOE

Primary · exchange

VIX and the whole volatility family — term structure, VVIX, SKEW — back to 1990.

none

✅ index levels are not revised

FINRA

Primary · US regulator

Daily short sale volume per symbol, published after each close and never revised. Short volume, not short interest.

none

✅ never revised

Coinbase Exchange

Exchange

Crypto OHLCV, every listed pair.

none

✅ trade prints are never restated

ApeWisdom

Community

Forum mention ranks across ~15 subreddits. No history upstream — rows are stamped when Vintage fetched them.

none

⏩ forward only, from the day you record

Yahoo Finance

Third party

Daily OHLCV and adjusted close, decades deep.

none

⚠️ adjusted retroactively, flagged on every row

COVERAGE.md is the full field-by-field catalogue — every prefix, every dataset, every signal, with measured coverage spans. It is generated from the registry, so it cannot drift from the code.

Counts current as of August 2026. Vintage redistributes none of this — each upstream source keeps its own terms.

Cache

Gzipped JSON in ~/.cache/vintage, tiered by how mutable the data is: closed periods never refetch, academic datasets monthly, current fundamentals daily, prices per session. An hour of conversation is roughly 20 upstream calls.

Known gaps

Stated plainly, because the alternative is shipping a bad substitute:

Data:

  • Survivorship — universes are current-listing only. Form 25 delistings are the next build and the backtester warns until then.

  • Analyst estimates — no free source exists.

  • Historical options chains — paid everywhere.

  • Point-in-time index membership — licensed by S&P and MSCI.

Engine — the backtester is vectorized and cross-sectional, which is a rung below an event-driven simulator:

  • No purging or embargo — overlapping label windows can leak across a train/test split (López de Prado, AFML ch. 7). Deflation catches selection bias, not leakage.

  • No market impact — costs are a flat charge on turnover, so large-notional results are optimistic.

  • No PBO — deflated Sharpe covers multiple testing; the Probability of Backtest Overfitting via combinatorially symmetric cross-validation would be the stronger test.

  • Trial count is session-scoped and resettablereset_trials=True zeroes it mid-conversation. Deliberate: the correction only applies to repeated attempts at one question, and the engine cannot tell those from unrelated ones.

  • Sharpe is per observation, not annualized — that is the frequency the deflation is defined at, and the response says so.

Development

git clone https://github.com/RezaSoleymanifar/vintage
cd vintage
uv sync --group dev
uv run pytest

smoke_test.py exercises all six verbs against the live sources — useful before a release, and it needs network.

License

MIT. Vintage redistributes no data; each upstream source keeps its own terms.

mcp-name: io.github.RezaSoleymanifar/vintage

Available Tools

8 tools
backtestA

Run a cross-sectional backtest. Point-in-time and costed by construction.

At each rebalance the engine sees only data knowable strictly before that date. Costs are always charged on turnover; there is no zero-cost mode.

The validation block leads with purged cross-validation across every held-out combination of blocks. Its multiple_testing sub-block carries the deflated Sharpe and the count of specs run since the last reset. That correction assumes the specs were attempts at one question; if this run starts an unrelated line of enquiry, pass reset_trials=True to zero the count first.

Signals: momentum_12_1, momentum_6_1, reversal_1m, low_volatility, trend_200d.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
startNo
signalNomomentum_12_1
cost_bpsNo
long_pctNo
universeYes
rebalanceNoME
short_pctNo
reset_trialsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does an excellent job: it discloses that the engine only sees point-in-time data, costs are charged on turnover, validation is purged cross-validation, and multiple testing correction is applied. It also explains the reset_trials behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with front-loaded purpose, followed by key behavioral details and parameter-specific notes. It is a bit longer than minimal but every sentence adds useful information, so it earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with 9 parameters, the description covers the core methodology, safety/cost behavior, validation scheme, and signal choices. Output schema exists for return values, so this is adequate. Minor gaps remain on parameter details, but overall it is fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It enumerates valid signal values (momentum_12_1, etc.) and explains reset_trials, but does not clarify start/end, universe, long_pct/short_pct, or rebalance parameters. This is partial compensation given the 9 parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Run a cross-sectional backtest', which is a specific verb+resource that clearly identifies the tool's function. It distinguishes from siblings like 'benchmark' by emphasizing the cross-sectional, point-in-time, and costed nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context: costs are always charged, no zero-cost mode, and a conditional guideline for reset_trials when starting an unrelated enquiry. However, it does not explicitly compare to alternatives or state when NOT to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

benchmarkA

Score a backtest against the published Fama-French factors.

Answers the question that decides whether a result is interesting: did you discover something, or rebuild a factor that has been public since 1993?

Datasets: ff3, ff5, momentum, ff3_daily, industry49.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYes
datasetNoff3

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It states the core behavior and dataset options but does not disclose potential failure modes, whether it is read-only, or any network/access requirements. This is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence front-loads the main action, and the dataset list is compact. The rhetorical question adds useful context, though it could be trimmed. Overall, the description is concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since an output schema exists, return values need not be described. However, the description omits the role of 'run_id' and does not clarify the relationship with sibling tools like 'backtest'. It gives enough to guess but not full operational context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%. The description lists valid dataset values, but it never mentions the 'run_id' parameter, its purpose, or how it maps to the schema. It partially compensates for the dataset parameter but ignores the required one.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the verb 'Score' and the resource 'a backtest against the published Fama-French factors', which is specific and distinguishes it from siblings like 'backtest' (runs backtests) and 'discover'. The added question about discovering vs rebuilding a factor further clarifies the tool's unique role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context: use this tool to evaluate a backtest against Fama-French factors, and it lists the available datasets. However, it does not explicitly state when not to use it or mention alternatives like 'status' or 'events'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

capabilitiesA

Everything Vintage can answer, with the arguments each field needs.

Call this first. It returns every field prefix, whether it needs an entity, whether as_of can be enforced on it, which ones need a key, and an example call per prefix that runs as written, so field names never have to be guessed. discover searches inside this surface.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that example calls run as written and that the tool returns metadata, implying a safe read-only operation. However, it does not explicitly state side effects, permissions, or error behavior, leaving some gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core message, and every sentence adds value. No fluff or repetition of schema information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema, the description is complete. It explains what the tool returns, how to sequence it (call first), and its relationship to a sibling tool, covering all essential context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so parameter semantics baseline is 4. The description focuses on the returned fields' arguments rather than the tool's own input, which is appropriate given the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a full inventory of what 'Vintage' can answer, including field prefixes, required arguments, and example calls. It distinguishes itself from the discover sibling by noting that discover searches within this surface.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Call this first,' giving direct when-to-use guidance. It also names discover as an alternative that searches inside the returned surface, effectively providing a when-not-to-use signal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

discoverA

Search every source's catalog for fields matching a plain-English query.

This is how breadth is reached. There is no per-source tool. With entity set, it also searches that company's reported XBRL concepts, which is the reliable way to find the exact field name for fundamentals.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
entityNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the global search scope and the XBRL behavior with `entity`, but does not mention rate limits, result format, or pagination. However, the output schema may cover return values, and the tool is read-only in nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences deliver the core action and key differentiator. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 3 parameters and an output schema, and the description covers the main behavior and special case with `entity`. It does not discuss how results are returned or any limitations, but the presence of an output schema suggests that information is structured elsewhere. Given the simple search nature, it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains the `entity` parameter in depth ('reliable way to find the exact field name for fundamentals'), and implicitly defines `query` as 'plain-English query'. It does not describe `limit`, leaving a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States 'Search every source's catalog for fields matching a plain-English query.' This clearly identifies verb, resource, and scope, and distinguishes from siblings by noting 'There is no per-source tool.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'This is how breadth is reached. There is no per-source tool,' which tells the agent when to use this instead of per-source alternatives. Also says with `entity` set, it searches XBRL concepts as the reliable way to find exact field names for fundamentals, providing specific usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eventsA

Timeline of what happened to an entity, with exact public timestamps.

Currently the SEC filing stream, 8-K material events, 10-K/10-Q, Form 4 insider transactions, 13D/G stakes. Every row carries the minute it became public, which is what makes event studies possible.

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ofNo
limitNo
entityYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It discloses the data sources and timestamp granularity, which is useful. However, it does not mention any limits, pagination, or side effects. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with front-loaded purpose. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description gives a good overview but lacks parameter semantics and explicit usage guidance. Output schema exists, so return structure is covered, but input guidance is sparse.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description must clarify parameters. It does not explain 'entity', 'as_of', or 'limit' beyond their names. The description focuses on output, not inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a timeline of events for an entity with exact public timestamps, and lists the specific filing types covered. This distinguishes it from siblings like 'fetch' and 'discover', which likely serve different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for event studies by noting the minute-level public timestamps, but does not explicitly state when to prefer this over sibling tools or any exclusions. Provides context but no direct comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetchA

Fetch any field from any source, as point-in-time rows.

Field forms: "us-gaap:Assets" (needs entity), "price:close" (needs entity), "fred:CPIAUCSL", "french:ff3", "openap:Mom12m" (or "openap:*" for all 331 published claims), "crypto:close" (needs an entity like BTC-USD), "short:short_ratio" (needs an entity), "ape:all-stocks", "13f:value" (needs a manager like BERKSHIRE), "bls:CUUR0000SA0", "bea:T10101". Run discover first if unsure.

as_of is the point-in-time switch: it drops every row that was not public on that date, so you see what a researcher on that day saw, restatements and all. quarter picks a reporting period for 13F holdings ("2024-12-31" or "2024"); without it you get the latest.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
formNo
as_ofNo
fieldYes
limitNo
startNo
entityNo
quarterNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral disclosure. It explains point-in-time semantics, how as_of drops non-public rows, includes restatements, and how quarter selects a reporting period. The field-form catalog also sets expectations about what can be fetched. This is rich, non-obvious behavior clearly explained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently organized: a one-line purpose, a list of field forms with examples, and two key parameter explanations. Every sentence adds value, and the line breaks make it scannable. Despite length, there is no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complex tool with 8 parameters, no annotations, and an output schema. The description covers field forms, point-in-time behavior, and reporting period selection. It omits explicit guidance on date range parameters (start/end) and limit, but those are relatively intuitive. It comes close to complete but has minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It thoroughly explains the critical `field` parameter with many examples and covers `as_of` and `quarter` semantically. However, it does not describe `start`, `end`, `limit`, or `form`, leaving some ambiguity for a full parameter set. Still, the most important and confusing parameters are well handled.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Fetch any field from any source, as point-in-time rows,' using a specific verb and resource type. It clearly distinguishes from siblings: 'discover' is for field discovery, while this is the actual fetching tool. The broad but explicit scope makes the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Run discover first if unsure' and explains when as_of and quarter matter. While it doesn't enumerate alternatives like events or backtest, the field-form examples and point-in-time semantics give clear context for when this tool is appropriate. It lacks an explicit 'when not to use' but the guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolveA

Turn any identifier into the entity key every other verb accepts.

Accepts a ticker ("AAPL"), a CIK ("CIK0000320193" or "320193"), a FRED series id, or a French dataset name. Start here when unsure what an entity is called.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the transparency burden. It discloses that the tool resolves identifiers to a canonical entity key and lists supported formats. However, it does not describe error handling, whether operation is read-only, or any side effects. Some behavioral disclosure exists but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded: the first sentence states the core purpose, the second lists accepted inputs and usage guidance. Every word earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (one parameter, no annotations, output schema exists). The description adequately covers the input types and when to use it. Minor gap: doesn't mention behavior for invalid identifiers, but given the output schema is available, the description is still largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully compensates by explaining what the 'identifier' parameter accepts (ticker, CIK with both formats, FRED series, French dataset name). This adds significant meaning beyond the bare 'string' type in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: turning any identifier into an entity key that other verbs accept. It names specific input types (ticker, CIK, FRED series, French dataset name), making it distinct from siblings like fetch or discover.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Start here when unsure what an entity is called,' giving a clear when-to-use. It also lists accepted identifier formats. It doesn't contrast directly with sibling tools, but the 'every other verb accepts' phrasing implies the workflow context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statusA

Cache size, configured keys, sources available, and specs tried so far.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the transparency burden. It does disclose some behavioral traits by enumerating the data returned (cache size, configured keys, etc.), which suggests a read-only observation operation. However, it doesn't explicitly state that the tool is non-mutating, safe to call, or free of side effects, leaving some ambiguity for a tool without annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly packed sentence that front-loads the four key pieces of status information. No wasted words, and the structure is easy to parse. It is appropriately sized for a tool with no input parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there are no input parameters and an output schema exists (which likely details return structures), the description is sufficiently complete. It covers the essential scope of the tool. The phrase 'specs tried so far' is slightly vague but does not undermine overall completeness for a status-checking tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is an empty object with no parameters, so the baseline of 4 applies. The description doesn't need to explain parameter meanings, and there are none to clarify. The description's list of returned items adds context beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly indicates the tool's purpose by listing the specific status information it exposes (cache size, configured keys, sources available, specs tried). It doesn't use an explicit verb like 'get' or 'show', but the noun-phrase structure is unambiguous. It distinguishes from sibling tools like 'resolve' and 'fetch' by focusing on status observation rather than actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use the tool or how it compares to alternatives. It doesn't mention scenarios like 'check current cache state' or exclusion criteria. With siblings like 'discover' and 'events', the lack of usage context leaves the agent to infer appropriate timing.

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.

  1. 3 tool updatesv0.9.0
    • Changedbacktest1 field changed
      • addedInput schema / properties / reset_trials
        Added value: +{
        +  "default": false,
        +  "title": "Reset Trials",
        +  "type": "boolean"
        +}
    • Addedcapabilities
    • Changedfetch1 field changed
      • addedInput schema / properties / quarter
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Quarter"
        +}
  2. 7 tool updatesv0.1.1
    • First observedbacktest
    • First observedbenchmark
    • First observeddiscover
    • First observedevents
    • First observedfetch
    • First observedresolve
    • First observedstatus

TDQS

A4.2/5.0

Scored across 8 tools

Disambiguation5/5

Each tool serves a unique, clearly delineated role: capabilities for introspection, resolve for entity mapping, discover for field search, fetch for data retrieval, events for timeline data, backtest for running strategies, benchmark for performance comparison, and status for system health. No two tools overlap in their core function.

Naming Consistency5/5

All tool names are single lowercase words (capabilities, resolve, discover, fetch, events, backtest, benchmark, status), following a minimal and uniform naming convention with no mixing of styles such as underscores or camelCase.

Tool Count5/5

8 tools provide a well-scoped interface for quantitative finance research, covering the full workflow from exploration to validation without unnecessary redundancy or excessive granularity.

Completeness5/5

The set provides a complete lifecycle: capabilities and discover facilitate exploration, resolve handles entity identification, fetch retrieves data, events offers time-series events, backtest tests strategies, benchmark compares against factors, and status monitors the system. There are no evident gaps for the stated purpose.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables quantitative trading research by providing tools to backtest strategies, list market datasets, review forward-test logs, and search previously rejected hypotheses, all through an MCP interface.
    MIT
  • F
    license
    B
    quality
    C
    maintenance
    Enables financial data retrieval, company context, market information, financial modelling, and valuation through MCP tools, with a deterministic sample provider for testing before connecting live data sources.
    15
    -