trading-mcp
trading-mcp
MCP-сервис для торговых данных и технических индикаторов, построенный на базе uv + pydantic + akshare + TA-Lib.
Возможности проекта
Предоставление запросов рыночных данных по акциям и расчет базовых технических индикаторов (K-линии, RSI, MA, MACD).
Предоставление запросов фундаментальных данных для среднесрочных и долгосрочных инвестиций (основные показатели акций A-share, три основные финансовые отчетности акций США, основные показатели акций США).
Единый уровень доступа к рыночным данным, поддерживающий акции A-share и акции США (например,
AAPL.US).Инструментальный интерфейс MCP с поддержкой вывода в формате Markdown или JSON.
Архитектура проекта
data/: Уровень доступа к рыночным данным. ИнтерфейсMarketDataClient+ реализацияAkshareMarketDataClient.services/: Уровень бизнес-логики. Преобразование сырых рыночных данных в стандартные структуры и запуск расчета индикаторов.indicators/: Инкапсуляция движка индикаторов. Единый вызов на основе TA-Lib.models/: Модели запросов и ответов инструментов (Pydantic).utils/: Форматирование вывода MCP (таблицы Markdown и т.д.).mcp_app.py/main.py: Точка входа в MCP-сервис и регистрация инструментов.
Структура каталогов
config/: Определение конфигурации (Pydantic Settings).data/: Реализация клиента рыночных данных.indicators/: Движок расчета индикаторов.models/: Модели запросов/ответов.services/: Уровень бизнес-логики.tests/: Модульное тестирование.utils/: Форматирование вывода и вспомогательные инструменты.mcp_app.py: Регистрация инструментов MCP.main.py: Точка входа для запуска сервиса.
Установка и зависимости
Установка зависимостей:
uv sync --extra devУстановка системной библиотеки TA-Lib:
macOS:
brew install ta-libDebian/Ubuntu:
sudo apt-get install libta-lib0 libta-lib0-devWindows: используйте предварительно скомпилированный wheel для соответствующей версии Python
Описание конфигурации
Конфигурация переопределяется через переменные окружения с префиксом TRADING_MCP_:
export TRADING_MCP_ENVIRONMENT=dev
export TRADING_MCP_DATA_DIR=./data
export TRADING_MCP_DEFAULT_SYMBOL=000001
export TRADING_MCP_HOST=0.0.0.0
export TRADING_MCP_PORT=8000
export TRADING_MCP_AKSHARE_PROXY_ENABLED=true
export TRADING_MCP_AKSHARE_PROXY_AUTH_IP=***
export TRADING_MCP_AKSHARE_PROXY_AUTH_TOKEN=*** TRADING_MCP_AKSHARE_PROXY_RETRY=30Значения полей:
TRADING_MCP_ENVIRONMENT: Идентификатор среды выполнения (например,dev/test/prod).TRADING_MCP_DATA_DIR: Локальный каталог данных.TRADING_MCP_DEFAULT_SYMBOL: Инструмент по умолчанию.TRADING_MCP_HOST: Адрес прослушивания MCP-сервиса.TRADING_MCP_PORT: Порт MCP-сервиса.TRADING_MCP_AKSHARE_PROXY_ENABLED: Включить лиakshare-proxy-patch.TRADING_MCP_AKSHARE_PROXY_AUTH_IP: IP шлюза авторизацииakshare-proxy-patch; если не настроено, патч не будет установлен.TRADING_MCP_AKSHARE_PROXY_AUTH_TOKEN: Опциональный токен авторизации.TRADING_MCP_AKSHARE_PROXY_RETRY: Количество внутренних повторных попыток патча.
Примечание по прокси для защиты от парсинга (East Money):
Проект содержит встроенный
akshare-proxy-patch, который автоматически пытается установиться при импорте data/akshare_client.py.Активируется только при настроенном
TRADING_MCP_AKSHARE_PROXY_AUTH_IPиTRADING_MCP_AKSHARE_PROXY_ENABLED=true.Патч перехватывает только запросы к доменам East Money и не влияет на другие сайты.
Использование в Python
from trading_mcp.config import Settings
from trading_mcp.data import AkshareMarketDataClient
from trading_mcp.indicators import IndicatorEngine
settings = Settings(environment="dev", data_dir="./data", default_symbol="000001")
client = AkshareMarketDataClient()
frame = client.fetch(settings.default_symbol, "2024-01-01", "2024-02-01")
engine = IndicatorEngine()
close_series = frame["close"] if "close" in frame.columns else frame.iloc[:, 0]
result = engine.compute("sma", close_series, timeperiod=5)
print(result.tail())MCP-сервис Запуск MCP-сервиса (streamable HTTP):
python main.pyЗапуск MCP Inspector (адаптирован для WSL, доступен с хост-машины):
./dev.shПо умолчанию используются следующие настройки Inspector:
MCP_INSPECTOR_HOST=0.0.0.0MCP_INSPECTOR_CLIENT_PORT=6274MCP_INSPECTOR_SERVER_PORT=6277MCP_INSPECTOR_AUTO_OPEN=false
В браузере на хост-машине Windows рекомендуется использовать:
http://localhost:6274Если на локальной машине не включена переадресация localhost в WSL, можно выполнить hostname -I внутри WSL, чтобы узнать IP, а затем зайти с хост-машины по адресу http://<wsl-ip>:6274.
Если вы хотите доступ только из локальной среды Linux, можно переопределить на:
MCP_INSPECTOR_HOST=127.0.0.1 ./dev.shВнимание: прокси Inspector обладает способностью запускать локальные процессы. 0.0.0.0 следует использовать только в доверенных сетевых средах.
Доступные инструменты:
trading_kline(symbol, limit=30, offset=0, period_type="1d", start_date=None, end_date=None, response_format="markdown")trading_macd(symbol, limit=30, fast_period=12, slow_period=26, signal_period=9, offset=0, period_type="1d", start_date=None, end_date=None, response_format="markdown")trading_rsi(symbol, limit=30, period=14, offset=0, period_type="1d", start_date=None, end_date=None, response_format="markdown")trading_ma(symbol, limit=30, period=20, ma_type="sma", offset=0, period_type="1d", start_date=None, end_date=None, response_format="markdown")trading_volume(symbol, limit=30, offset=0, period_type="1d", start_date=None, end_date=None, response_format="markdown")trading_fund_flow_individual_em(symbol, limit=30, offset=0, start_date=None, end_date=None, response_format="markdown")trading_fund_flow_individual_rank_em(indicator="5日", limit=30, offset=0, response_format="markdown")trading_fund_flow_sector_rank_em(indicator="今日", sector_type="行业资金流", sort_by="主力净流入", limit=30, offset=0, response_format="markdown")trading_fund_flow_sector_summary_em(symbol, indicator="今日", limit=30, offset=0, response_format="markdown")trading_fundamental_cn_indicators(symbol, indicator="按报告期", limit=30, offset=0, start_date=None, end_date=None, response_format="markdown")trading_fundamental_us_report(stock, symbol="资产负债表", indicator="年报", limit=30, offset=0, start_date=None, end_date=None, response_format="markdown")trading_fundamental_us_indicators(symbol, indicator="年报", limit=30, offset=0, start_date=None, end_date=None, response_format="markdown")trading_industry_summary_ths(limit=30, offset=0, response_format="markdown")trading_industry_index_ths(symbol, limit=30, offset=0, start_date=None, end_date=None, response_format="markdown")trading_industry_name_em(limit=30, offset=0, response_format="markdown")trading_board_change_em(limit=30, offset=0, response_format="markdown")trading_industry_spot_em(symbol, limit=30, offset=0, response_format="markdown")trading_industry_cons_em(symbol, limit=30, offset=0, response_format="markdown")trading_industry_hist_em(symbol, period="日k", adjust="none", limit=30, offset=0, start_date=None, end_date=None, response_format="markdown")trading_industry_hist_min_em(symbol, period="5", limit=30, offset=0, response_format="markdown")trading_info_global_em(limit=30, offset=0, response_format="markdown")
Описание параметров trading_fundamental_cn_indicators:
indicatorenum:按报告期(по отчетному периоду),按单季度(по кварталам)symbolсовместимый ввод:000001,000001.SZ,600519.SH(автодополнение или нормализация суффикса)Результаты фундаментальных данных возвращаются в формате исходных строк:
columns + items
Описание параметров trading_fundamental_us_report:
symbol(тип отчета) enum:资产负债表(баланс),综合损益表(отчет о прибылях и убытках),现金流量表(отчет о движении денежных средств)indicator(период отчета) enum:年报(годовой отчет),单季报(квартальный отчет),累计季报(накопительный квартальный отчет)stockсовместимый ввод:TSLA,AAPL.US,105.AAPL,BRK.B(внутренняя нормализация в тикер, распознаваемый AkShare)
Описание параметров trading_fundamental_us_indicators:
indicatorenum:年报,单季报,累计季报symbolсовместимый ввод:TSLA,AAPL.US,105.AAPL,BRK.BРезультаты фундаментальных данных возвращаются в формате исходных строк:
columns + items
Описание полей trading_volume:
Возвращаемые поля:
timestamp,volume,amount,turnover_rateСтратегия единиц измерения: сохраняются исходные единицы источника данных, единицы возвращаются в полях ответа
A-share:
volume_unit=lot,amount_unit=CNYАкции США:
volume_unit=share,amount_unit=USDturnover_rate_unit=percent
Если недельные/месячные данные агрегированы из дневных,
turnover_rateможет бытьnull
Описание инструментов потоков капитала:
trading_fund_flow_individual_em: Потоки капитала по отдельным акциям (East Money),symbolподдерживает000001,600519.SH,830799.BJtrading_fund_flow_individual_rank_em: Рейтинг потоков капитала по акциям (East Money)indicatorenum:今日,3日,5日,10日
trading_fund_flow_sector_rank_em: Рейтинг потоков капитала по секторам (East Money)indicatorenum:今日,5日,10日sector_typeenum:行业资金流(отраслевые),概念资金流(концептуальные),地域资金流(региональные)sort_byenum:涨跌幅(изменение цены),主力净流入(чистый приток основных средств); по умолчанию сортировка по主力净流入по убыванию
Если интерфейс рейтинга East Money недоступен:
Рейтинг акций переключается на рейтинг потоков капитала от Tonghuashun
Рейтинг отраслевых/концептуальных секторов переключается на соответствующий рейтинг Tonghuashun
После переключения возвращаемые столбцы могут отличаться от исходных столбцов East Money;
地域资金流не переключается
trading_fund_flow_sector_summary_em: Потоки капитала по компонентам указанного сектораПо умолчанию используется East Money, при сбое переключается на Tonghuashun
symbol— название сектора, например电源设备(силовое оборудование),风电设备(ветроэнергетическое оборудование)indicatorenum:今日,5日,10日После переключения возвращаемые столбцы могут отличаться от исходных столбцов East Money
Результаты потоков капитала возвращаются в виде исходной таблицы:
columns + items
Описание символов:
Примеры A-share:
000001,300308.SZПримеры акций США:
AAPL.US,AAPL,105.AAPL,BRK.B
Описание инструментов отраслевых секторов:
trading_industry_summary_ths: Сводная таблица отраслей Tonghuashun, возвращает исходные поля сводки секторовtrading_industry_index_ths: Отраслевой индекс Tonghuashun,symbol— название сектора, поддерживаетstart_date/end_datetrading_industry_name_em: Список названий отраслевых секторов East Moneytrading_board_change_em: Детали изменений секторов за день (East Money)trading_industry_spot_em: Рыночные данные отраслевых секторов в реальном времени (East Money),symbol— название сектораtrading_industry_cons_em: Компоненты отраслевых секторов (East Money),symbol— название сектораtrading_industry_hist_em: Исторические данные отраслевых секторов (East Money)periodenum:日k(дневные),周k(недельные),月k(месячные)adjustenum:none,qfq(с поправкой на дивиденды),hfq(с поправкой на дивиденды);noneозначает без поправки
trading_industry_hist_min_em: Исторические внутридневные данные отраслевых секторов (East Money)periodenum:1,5,15,30,60
Результаты по отраслевым секторам возвращаются в виде исходной таблицы:
columns + items
Описание инструментов новостей:
trading_info_global_em: Глобальные финансовые новости (East Money)Результаты новостей возвращаются в виде исходной таблицы:
columns + items
Структура ответа (structuredContent)
{
"stock": "TSLA",
"symbol": "资产负债表",
"indicator": "年报",
"columns": ["REPORT_DATE", "ITEM_NAME", "AMOUNT"],
"items": [],
"count": 0,
"total": 0,
"limit": 30,
"offset": 0,
"has_more": false,
"next_offset": null,
"start_date": null,
"end_date": null
}Процесс взаимодействия с данными MCP (архитектура и диаграмма последовательности)
Ниже с помощью Mermaid нарисованы основная архитектура взаимодействия с данными и диаграмма последовательности текущего MCP, чтобы помочь понять путь прохождения запроса в системе.
Схема архитектуры (Flowchart)
flowchart LR
Client[Client / User] -->|HTTP/Stream 请求| MCP[MCP Server]
MCP -->|调用工具接口| API[Tool Dispatcher / Handlers]
API --> Market[MarketDataClient (Akshare / Providers)]
Market -->|行情数据| Storage[Local Cache / Data Dir]
API --> Indicator[IndicatorEngine (TA-Lib)]
Indicator -->|指标结果| Formatter[Response Formatter (Markdown / JSON)]
Formatter -->|返回| Client
Market -.->|必要时| Proxy[akshare-proxy-patch]
MCP -->|注册 & 管理| Inspector[MCP Inspector]Пояснения:
MCP Server: принимает внешние запросы (HTTP/stream), отвечает за разбор запроса и вызов внутренних инструментов.
Tool Dispatcher: маршрутизирует запрос к конкретному инструменту (например, trading_kline, trading_macd).
MarketDataClient: единый уровень доступа к рыночным данным, в настоящее время реализован в основном через Akshare, поддерживает патч прокси.
IndicatorEngine: вызывает TA-Lib или встроенные алгоритмы для расчета технических индикаторов.
Response Formatter: преобразует структурированные данные в формат ответа MCP (Markdown или JSON).
Local Cache/Storage: используется для краткосрочного кэширования и хранения исторических данных для уменьшения количества вызовов API.
Диаграмма последовательности (Sequence Diagram)
sequenceDiagram
participant U as Client/User
participant M as MCP Server
participant D as Tool Dispatcher
participant MD as MarketDataClient
participant I as IndicatorEngine
participant F as Formatter
U->>M: 发起 trading_macd 请求 (symbol, start, end, params)
M->>D: 解析并转发请求
D->>MD: 请求历史 K 线 (symbol, start, end)
MD-->>D: 返回原始行情数据 (OHLCV)
D->>I: 传入行情数据与参数, 调用指标计算
I-->>D: 返回指标结果 (MACD lines, histogram)
D->>F: 格式化为 Markdown / JSON 的 MCP 响应
F-->>M: 返回格式化结果
M-->>U: 通过 HTTP Stream 返回响应 (chunked / 完整)
alt 缓存命中
D->>Storage: 读取缓存
Storage-->>D: 返回缓存数据
end
alt 第三方被阻断/需要代理
MD->>Proxy: 走 akshare-proxy-patch
Proxy-->>MD: 返回代理后的数据
endВышеуказанные две диаграммы являются абстрактным представлением текущей системы; если вы хотите детализировать диаграммы до большего количества компонентов (например: аутентификация, ограничение скорости, очереди, асинхронные задачи, показатели мониторинга), сообщите мне, какие части нужно добавить, и я расширю и обновлю диаграммы Mermaid в README.
Если вы подтверждаете, что это обновление в порядке, я зафиксирую изменения в новой ветке и отправлю их, а затем создам Pull Request для проверки.
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Appeared in Searches
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/tohsaka888/trading-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server