Skip to main content
Glama

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.md

Related 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.json

2. Загрузка и запуск

curl -O https://raw.githubusercontent.com/lakshya-aga/data-mcp/main/docker-compose.yml
docker compose up -d

docker-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

search_tools

Запрос на естественном языке → соответствующие документы функций + примеры кода

get_tool_doc

Полная справка по одной функции по точному имени

list_all_tools

Все функции-обёртки с описаниями и тегами

request_data_source

Попросить Codex реализовать и зарегистрировать новую обёртку данных

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

OPENAI_API_KEY

Аутентификация Codex — пропускает OAuth, если задан (альтернатива монтированию аутентификации хоста)

FRED_API_KEY

Требуется для get_fred_series. Бесплатно на fred.stlouisfed.org

CODEX_CLI_PATH

Переопределить путь к бинарному файлу Codex (по умолчанию codex в PATH)

BLOOMBERG_HOST

Хост Bloomberg API для функций get_bloomberg_* (по умолчанию localhost)

BLOOMBERG_PORT

Порт Bloomberg API (по умолчанию 8194)

BLOOMBERG_TIMEOUT_MS

Ожидание на событие перед отказом от запроса Bloomberg (по умолчанию 30000)

BLOOMBERG_AUTH

Строка setAuthenticationOptions для Server API / B-PIPE, например AuthenticationType=OS_LOGON. Оставьте не заданным для настольного терминала


Краткий справочник 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, RF

get_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, volume

get_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 tickers

get_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, vwap

get_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, value

get_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/ -v

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      A 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
    • A
      license
      A
      quality
      D
      maintenance
      FinData 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.
      5
      39 PyPI
      1
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server that provides AI agents with financial tools including real-time quotes, backtesting, technical analysis, and multi-exchange data via a simple CLI interface.
      2
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP server that enables AI agents to query real-time financial data including stock quotes, market indices, company fundamentals, and portfolio tracking.
      MIT