Vintage
Vintage is a point-in-time financial research terminal that normalizes data from 22 free sources (SEC EDGAR, FRED, Ken French, Open Source Asset Pricing, and more) and exposes them through six core verbs:
capabilities— List every field prefix, argument requirements, and example calls.resolve— Convert any identifier (ticker, CIK, FRED series, French dataset) into the canonical entity key.discover— Plain‑English search across all source catalogs, including a company’s reported XBRL concepts.fetch— Retrieve point‑in‑time rows for any field (e.g.,us-gaap:Assets,fred:CPIAUCSL,price:close) with strictas_offiltering.events— Get the exact filing timeline for an entity (8‑K, 10‑K/10‑Q, Form 4, 13D/G).backtest— Run cross‑sectional, cost‑aware backtests (momentum, reversal, low volatility, trend) that always charge transaction costs and report a Deflated Sharpe Ratio adjusted for multiple testing across the session.benchmark— Score a backtest against Fama‑French factors to check for genuine alpha.status— Show cache size, configured keys, available sources, and session trial count.
Every data row carries both observed_at and known_at timestamps, embedding point‑in‑time integrity structurally. Backtests enforce point‑in‑time data, always charge costs on turnover, and the Deflated Sharpe corrects for all trials in the session.
Fetches cryptocurrency price and market data from Coinbase, enabling point-in-time financial analysis for assets like BTC-USD.
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., "@VintageBacktest 12-1 momentum on the Dow 30 since 2010."
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.
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-mcpClaude 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 |
| SEC EDGAR asks for a real contact. |
| Free key — unlocks 800k macro series with first-release vintages. |
| Defaults to |
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 describesknown_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 |
| Any identifier → the entity key everything else accepts |
| Plain-English search across every source's catalog |
| The workhorse. Any field, any source, with |
| Filing timeline with exact public timestamps |
| Cross-sectional signal → returns, costs, held-out paths |
| 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 | structural, no flag to disable | ✅ shipped |
Costs charged on turnover, always | no zero-cost mode exists | ✅ shipped |
Deflated Sharpe Ratio | ✅ shipped | |
Session trial ledger feeding the deflation | Bailey & López de Prado (2014) | ✅ shipped |
Probability of Backtest Overfitting, via CSCV | ⏳ 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 | ⏳ 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. | 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 | 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 |
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 resettable —
reset_trials=Truezeroes 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 pytestsmoke_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 toolsbacktestA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| start | No | ||
| signal | No | momentum_12_1 | |
| cost_bps | No | ||
| long_pct | No | ||
| universe | Yes | ||
| rebalance | No | ME | |
| short_pct | No | ||
| reset_trials | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | ||
| dataset | No | ff3 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| entity | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | ||
| limit | No | ||
| entity | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| form | No | ||
| as_of | No | ||
| field | Yes | ||
| limit | No | ||
| start | No | ||
| entity | No | ||
| quarter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
v0.9.0- Changed
backtest1 field changed- added
Input schema / properties / reset_trialsAdded value: +{ + "default": false, + "title": "Reset Trials", + "type": "boolean" +}
- Added
capabilities - Changed
fetch1 field changed- added
Input schema / properties / quarterAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Quarter" +}
7 tool updates
v0.1.1- First observed
backtest - First observed
benchmark - First observed
discover - First observed
events - First observed
fetch - First observed
resolve - First observed
status
TDQS
Scored across 8 tools
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.
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.
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.
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
Related MCP Connectors
Financial data and research MCP for US/CN/JP equities: filings, statements, ownership, signals.
Quant intelligence over MCP: backtest, signals, screens, scores & portfolios for US & TSX stocks.
Real SEC, 13F, insider, congress & macro data your AI agent can cite. Hosted MCP, 24 tools.
China A-share market data for research, backtesting and AI agents via MCP.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables 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
- AlicenseNot gradedqualityBmaintenanceEnables AI-driven quant research by exposing backtesting, portfolio optimization, and performance analytics tools through MCP, allowing iterative strategy refinement with built-in overfitting guardrails.MIT
- AlicenseNot gradedqualityAmaintenanceQuantitative research, backtesting, creator-marketplace subscriptions, editable strategy forks, continuous copy trading, and controlled brokerage execution through 125 MCP tools.516 npm6MIT
- FlicenseBqualityCmaintenanceEnables 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-