findata-mcp
findata-mcp
Единая библиотека финансовых данных с MCP-сервером для агентов, пишущих код.
Когда агент запрашивает MCP (например, "equity daily prices"), он получает:
Сигнатуру функции-обёртки findata
Полную документацию по параметрам и типам возвращаемых значений
Готовый к вставке пример кода, вызывающий наш API
MCP никогда не получает живые данные — это сервер документации, чтобы агенты могли писать корректные вызовы к библиотеке findata.
Структура проекта
data-mcp/
├── findata/ Data library
│ ├── equity_prices.py get_equity_prices() yfinance wrapper
│ ├── sp500_composition.py get_sp500_composition() fja05680/sp500 (local git clone)
│ ├── fama_french.py get_fama_french_factors() Ken French Data Library
│ ├── fred.py get_fred_series() FRED macroeconomic series
│ ├── cboe_volatility.py get_cboe_volatility_indices() VIX / VVIX
│ ├── coingecko.py get_coingecko_ohlcv() CoinGecko public API
│ ├── file_reader.py get_file_data() CSV / Parquet / Excel
│ └── bloomberg.py get_bloomberg_ticks() blpapi — tick-by-tick
│ get_bloomberg_bars() blpapi — intraday OHLCV
│ get_bloomberg_data() blpapi — historical / reference
├── findata_mcp/
│ └── server.py Tool registry + MCP handlers
├── Dockerfile
├── docker-compose.yml
├── .github/workflows/docker.yml GHCR build + push on every push to main
├── pyproject.toml
└── README.mdRelated MCP server: FinData MCP
Установка
Рекомендуемый способ запуска findata-mcp — через Docker. Образ публикуется в GHCR при каждом push в main и включает в себя Codex CLI.
Предварительные требования
Docker
Codex, аутентифицированный на вашей хост-машине
1. Аутентификация Codex (однократно)
codex auth login # opens browser → saves to ~/.codex/auth.json2. Загрузка и запуск
curl -O https://raw.githubusercontent.com/lakshya-aga/data-mcp/main/docker-compose.yml
docker compose up -ddocker-compose.yml монтирует ~/.codex в режиме только для чтения, чтобы контейнер наследовал вашу сессию Codex без интерактивных запросов. Именованные тома сохраняют сгенерированные файлы и данные между перезапусками.
3. Проверка
docker logs data-mcp-findata-mcp-1
# should show: findata-mcp starting on :8000Подключение к серверу
Claude Desktop
Добавьте в ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"findata": {
"url": "http://localhost:8000/sse"
}
}
}Python (сырой MCP-клиент)
import asyncio
from mcp.client.sse import sse_client
from mcp.client.session import ClientSession
async def main():
async with sse_client("http://localhost:8000/sse") as (r, w):
async with ClientSession(r, w) as s:
await s.initialize()
res = await s.call_tool("search_tools", {"query": "equity daily prices", "top_k": 3})
print(res.content[0].text)
asyncio.run(main())OpenAI Agents SDK
from agents.mcp import MCPServerSse
mcp = MCPServerSse(url="http://localhost:8000/sse")Инструменты MCP
Tool | Description |
| Запрос на естественном языке → соответствующие документы функций + примеры кода |
| Полная справка по одной функции по точному имени |
| Все функции-обёртки с описаниями и тегами |
| Попросить Codex реализовать и зарегистрировать новую обёртку данных |
search_tools
res = await s.call_tool("search_tools", {"query": "fama french factors", "top_k": 2})get_tool_doc
res = await s.call_tool("get_tool_doc", {"tool_name": "get_equity_prices"})request_data_source
res = await s.call_tool("request_data_source", {
"description": "get World Bank GDP per capita using the wbdata library"
})Codex записывает findata/<module>.py, обновляет server.py и горячо перезагружает новую функцию в живой реестр — перезапуск не требуется.
Переменные окружения
Variable | Description |
| Аутентификация Codex — пропускает OAuth, если задан (альтернатива монтированию аутентификации хоста) |
| Требуется для |
| Переопределить путь к бинарному файлу Codex (по умолчанию |
| Хост Bloomberg API для функций |
| Порт Bloomberg API (по умолчанию |
| Ожидание на событие перед отказом от запроса Bloomberg (по умолчанию |
| Строка |
Краткий справочник findata
get_equity_prices
from findata.equity_prices import get_equity_prices
df = get_equity_prices(
tickers=["AAPL", "MSFT"],
start_date="2024-01-01",
end_date="2024-12-31",
fields=["Close"],
frequency="1d", # 1d 5d 1wk 1mo 3mo
)get_fama_french_factors
from findata.fama_french import get_fama_french_factors
df = get_fama_french_factors(factor_model="5", start_date="2010-01-01", end_date="2020-12-31")
# columns: Mkt-RF, SMB, HML, RMW, CMA, RFget_fred_series
from findata.fred import get_fred_series
df = get_fred_series(["CPIAUCSL", "UNRATE"], start_date="2015-01-01", end_date="2024-12-31")get_coingecko_ohlcv
from findata.coingecko import get_coingecko_ohlcv
df = get_coingecko_ohlcv("bitcoin", vs_currency="usd", days=90)
# columns: open, high, low, close, volumeget_cboe_volatility_indices
from findata.cboe_volatility import get_cboe_volatility_indices
df = get_cboe_volatility_indices(symbols=["^VIX", "^VVIX"], start_date="2020-01-01", end_date="2024-12-31")get_sp500_composition
from findata.sp500_composition import get_sp500_composition
members = get_sp500_composition("2024-12-31") # list[str], ~503 tickersget_bloomberg_ticks — данные тикового уровня для любой ценной бумаги
Требуется терминал Bloomberg, право на SAPI или B-PIPE и SDK:
pip install blpapi --index-url https://bcms.bloomberg.com/pip/simple/from findata.bloomberg import get_bloomberg_ticks
# Every trade print in one US cash session, in New York time
ticks = get_bloomberg_ticks(
"AAPL US Equity",
"2024-06-03 09:30:00",
"2024-06-03 16:00:00",
tz="America/New_York",
)
# index = time (tz-aware)
# columns: security, type, value, size, conditionCodes, exchangeCode
# Trades AND top-of-book quotes, one hour per sub-request
book = get_bloomberg_ticks(
"ESZ5 Index",
"2024-06-03 13:30:00",
"2024-06-03 20:00:00",
event_types=["TRADE", "BID", "ASK"],
chunk="1h",
)
# VWAP straight from the prints
trades = ticks[ticks["type"] == "TRADE"]
vwap = (trades["value"] * trades["size"]).sum() / trades["size"].sum()Строка ценной бумаги передаётся в Bloomberg без изменений, поэтому работает всё, что котирует терминал — "AAPL US Equity", "ESZ5 Index", "EURUSD Curncy", "TY1 Comdty", "US912810TW33 Govt".
Длинные окна разбиваются на подзапросы размером chunk (по умолчанию один день) и объединяются, потому что Bloomberg молча обрезает слишком большой внутридневной ответ, а не выдаёт ошибку. Собственные лимиты Bloomberg по-прежнему действуют: история внутридневных тиков достигает примерно 140 дней, а дневные лимиты объёма привязаны к вашему праву доступа.
Используйте одну сессию при переборе вселенной — это позволяет избежать рукопожатия соединения для каждого имени:
from findata.bloomberg import BloombergSession, get_bloomberg_ticks
with BloombergSession() as bbg:
frames = {
sym: get_bloomberg_ticks(sym, start, end, session=bbg)
for sym in universe
}Агрегируйте тики в бары локально, с любым смещением pandas:
from findata.bloomberg import ticks_to_bars
bars = ticks_to_bars(ticks, rule="5min")
# columns: open, high, low, close, ticks, volume, vwapget_bloomberg_bars
from findata.bloomberg import get_bloomberg_bars
# 5-minute bars, aggregated server-side (much lighter than raw ticks)
bars = get_bloomberg_bars(
"AAPL US Equity",
"2024-06-03 09:30:00",
"2024-06-03 16:00:00",
interval=5, # minutes, 1-1440
tz="America/New_York",
)
# columns: security, open, high, low, close, volume, numEvents, valueget_bloomberg_data
from findata.bloomberg import get_bloomberg_data
# Historical daily series -> MultiIndex columns (field, security)
df = get_bloomberg_data(
tickers=["AAPL US Equity", "MSFT US Equity"],
fields=["PX_LAST", "VOLUME"],
start_date="2024-01-01",
end_date="2024-12-31",
)
close = df["PX_LAST"]
# Reference data -> rows=securities, cols=fields
ref = get_bloomberg_data(
tickers=["AAPL US Equity"],
fields=["CUR_MKT_CAP", "GICS_SECTOR_NAME"],
request_type="ReferenceDataRequest",
overrides={"BEST_FPERIOD_OVERRIDE": "1BF"},
)get_file_data
from findata.file_reader import get_file_data
df = get_file_data("data/prices.parquet", tickers=["AAPL"], start_date="2023-01-01", end_date="2023-12-31")Тесты
pytest tests/ -vTool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for Financial Modeling Prep API with 250+ financial data tools
Official Intrinio MCP server. US stock prices, options and fundamentals for AI agents.
One API and MCP server for financial and economic data: markets, economics, companies and more.
MCP server for stocksense-ai documentation, generated by doc2mcp.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA specialized MCP server that provides institutional-grade financial data and market research via the Finnhub API. It enables AI agents to function as equity researchers, generating professional market reports and high-fidelity analysis for stock tickers.ISC
- AlicenseAqualityDmaintenanceFinData MCP gives AI agents access to market data, company fundamentals, and macroeconomic indicators via MCP. It covers stocks, ETFs, crypto, forex, commodities, and economic time series.539 PyPI1MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that provides AI agents with financial tools including real-time quotes, backtesting, technical analysis, and multi-exchange data via a simple CLI interface.2MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI agents to query real-time financial data including stock quotes, market indices, company fundamentals, and portfolio tracking.MIT