You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The biggest update since the 2.0 release: a faster package built on Polars and a database that has been cleaned, verified and filled in almost everywhere. The API is unchanged, so existing code keeps working; only the minimum Python version moves to 3.11.
The Finance Database MCP Server
This release introduces an MCP server that gives any AI assistant supporting the Model Context Protocol direct access to all 300,000+ symbols. Ask in plain English for, say, every large cap semiconductor company in Europe, the fixed income ETFs of an issuer or the listings behind an ISIN, and the assistant queries the database for you. No API key is needed.
Hosted: connect to https://financedatabase.jeroenbouma.com/mcp; nothing to install and no sign-in.
Local:uvx --from "financedatabase[mcp]" financedatabase-mcp-setup adds the server to Claude Desktop, Claude Code, VS Code, Cursor, Gemini CLI or Windsurf. The Claude Desktop bundle (financedatabase.mcpb) is attached to this release.
Tools: one per asset class (equities, etfs, funds, indices, currencies, cryptos, moneymarkets) with the same filters as select(), plus search_instruments (find a symbol by ticker, name or ISIN), show_options and search_categories. Responses are compact and paginated, and invalid filter values come back with suggestions.
Self-hosting:financedatabase-mcp --transport streamable-http or the included Docker setup, with /health and, when FD_MCP_ANALYTICS=1, anonymous usage totals at /stats.
See the MCP Server section of the README for every client.
Package
Faster, lazily evaluated queries with Polars. The database is downloaded once into a local cache (checked for updates at most once a day) and queried lazily, so creating a class is instant and filters only read what they need. show_options went from about 8 seconds to 0.1 seconds, and select is faster too. Results are still pandas DataFrames with to_toolkit(); pass as_pandas=False to get a Polars DataFrame instead.
Typed Parquet files. The published data now also comes as Parquet, with delisted stored as a real boolean, so nothing has to be converted after loading. The bz2 CSV files are still published unchanged, so older versions of the package keep working.
The ticker NA (Nano Labs) is no longer read as a missing value.
Restructured internally into helpers, models and controllers, the same layout as the Finance Toolkit. Public classes and methods are unchanged.
Requirements: Python 3.11 or newer (3.11 to 3.14 are supported), financetoolkit>=2.2.1, polars>=2.0, pandas>=3.0, plus numpy and requests, which were already used but are now declared. The PyPI page now links to the homepage and repository.
Database
Comparing the published data of 2.4.0 with 2.5.0 (live listings, so delisted ones excluded):
2.4.0
2.5.0
Equities with an ISIN
26%
78%
Equities with a FIGI
43%
80%
Equities with a sector / industry
62% / 41%
95% / 88%
Equities with a website / headquarters city
39% / 41%
86% / 86%
Equities with a market cap tier
44%
88%
Equities with a description
60%
95%
ETFs
36,483
44,429
ETFs with an ISIN
22%
37%
ETFs / funds with a fund family
75% / 64%
84% / 72%
Added. Close to 15,000 equity listings that were missing, taken from official exchange symbol directories and confirmed on OpenFIGI: among others 1,135 Shanghai and Shenzhen listings, 935 on the Bombay Stock Exchange, 748 in Taiwan (including TSMC), 578 in London, 468 in Korea, 362 in Warsaw, about 500 each from the Middle East, Europe and Asia-Pacific, Nasdaq First North, new NSE and ASX listings and US OTC lines. About 8,000 ETFs were added (US and international, including UCITS listings), plus open-ended funds and Bitcoin pairs for the cryptocurrencies. New listings come in with their company description, address, website, market cap tier and a GICS-style classification, and the weekly update now also reads the official exchange directories.
Corrected.
Every equity and ETF ISIN was verified on OpenFIGI. ISINs, CUSIPs and FIGIs that belonged to another company, share class or exchange were cleared or replaced, for example local listings that carried their foreign parent's or ADR's identity, such as Infosys, Siemens India and Oracle Japan.
Hundreds of renamed companies now carry their current name and description on all their listings, for example Avolta (formerly Dufry), Clariane (Korian), CMB.Tech (Euronav) and PDD Holdings (Pinduoduo).
Tickers that were replaced by a new ticker, or that no longer trade anywhere, are flagged as delisted. That's about 17,000 equities, kept for reference; exclude_delisted hides them.
Market cap tiers were refreshed with current market caps, and secondary listings use the tier of the company's home listing.
Websites, descriptions and classifications that belonged to a different company were fixed.
All-caps and truncated exchange names such as "SIEMENS AG NA O.N." are written as proper company names.
ETFs are categorised with one documented system based on their holdings (see CONTRIBUTING.md). 168 airport, port and toll-road operators are classified as Transportation Infrastructure.
Postcodes follow each country's format, damaged characters are repaired, and every classification is checked against the GICS tree in the test suite.
Moved. Listings are in the asset class the rest of the database uses for them: exchange-traded products and funds filed as equities moved to the ETF and fund files (Leverage Shares ETCs, Gold Bullion Securities, Danish investment funds), and REITs and other companies filed as ETFs moved to equities.
Removed.
About 35,500 empty equity records without a name or any other information, most of them on Euronext.
About 15,500 instruments that are not stocks: certificates, turbos, covered warrants, structured notes and dated bonds, for example Vienna and German bank certificates and Korean warrants.
About 10,900 empty index records and 158 empty money market records.
Duplicate listings written in two notations (for example BRK/A next to BRK-A).
Maintenance
The weekly update adds new tickers from official exchange directories and stops re-adding share classes written with a slash.
Pull requests now run the GICS check and an identifier validation, and the tests compare the package against the data in the pull request itself.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
The biggest update since the 2.0 release: a faster package built on Polars and a database that has been cleaned, verified and filled in almost everywhere. The API is unchanged, so existing code keeps working; only the minimum Python version moves to 3.11.
The Finance Database MCP Server
This release introduces an MCP server that gives any AI assistant supporting the Model Context Protocol direct access to all 300,000+ symbols. Ask in plain English for, say, every large cap semiconductor company in Europe, the fixed income ETFs of an issuer or the listings behind an ISIN, and the assistant queries the database for you. No API key is needed.
https://financedatabase.jeroenbouma.com/mcp; nothing to install and no sign-in.uvx --from "financedatabase[mcp]" financedatabase-mcp-setupadds the server to Claude Desktop, Claude Code, VS Code, Cursor, Gemini CLI or Windsurf. The Claude Desktop bundle (financedatabase.mcpb) is attached to this release.equities,etfs,funds,indices,currencies,cryptos,moneymarkets) with the same filters asselect(), plussearch_instruments(find a symbol by ticker, name or ISIN),show_optionsandsearch_categories. Responses are compact and paginated, and invalid filter values come back with suggestions.financedatabase-mcp --transport streamable-httpor the included Docker setup, with/healthand, whenFD_MCP_ANALYTICS=1, anonymous usage totals at/stats.See the MCP Server section of the README for every client.
Package
show_optionswent from about 8 seconds to 0.1 seconds, andselectis faster too. Results are still pandas DataFrames withto_toolkit(); passas_pandas=Falseto get a Polars DataFrame instead.delistedstored as a real boolean, so nothing has to be converted after loading. The bz2 CSV files are still published unchanged, so older versions of the package keep working.NA(Nano Labs) is no longer read as a missing value.financetoolkit>=2.2.1,polars>=2.0,pandas>=3.0, plusnumpyandrequests, which were already used but are now declared. The PyPI page now links to the homepage and repository.Database
Comparing the published data of 2.4.0 with 2.5.0 (live listings, so delisted ones excluded):
Added. Close to 15,000 equity listings that were missing, taken from official exchange symbol directories and confirmed on OpenFIGI: among others 1,135 Shanghai and Shenzhen listings, 935 on the Bombay Stock Exchange, 748 in Taiwan (including TSMC), 578 in London, 468 in Korea, 362 in Warsaw, about 500 each from the Middle East, Europe and Asia-Pacific, Nasdaq First North, new NSE and ASX listings and US OTC lines. About 8,000 ETFs were added (US and international, including UCITS listings), plus open-ended funds and Bitcoin pairs for the cryptocurrencies. New listings come in with their company description, address, website, market cap tier and a GICS-style classification, and the weekly update now also reads the official exchange directories.
Corrected.
exclude_delistedhides them.Moved. Listings are in the asset class the rest of the database uses for them: exchange-traded products and funds filed as equities moved to the ETF and fund files (Leverage Shares ETCs, Gold Bullion Securities, Danish investment funds), and REITs and other companies filed as ETFs moved to equities.
Removed.
BRK/Anext toBRK-A).Maintenance
This discussion was created from the release FinanceDatabase 2.5.0.
All reactions