Indian Stock Analyst MCP
Servidor MCP para análisis del mercado de valores indio: fundamentos, aspectos técnicos, valoración DCF, comparación entre pares y más.
Documentación
stock-analyst-mcp
Servidor MCP para análisis del mercado de valores global — fundamentales, técnicos, valoración DCF, comparación entre pares, soporte multi-activo y más. Funciona en más de 50 regiones en todo el mundo.
Novedades en v0.5.7
Requisito de Python 3.13+
- Requiere Python >=3.13: Corrige
uvxque seleccionaba Python 3.12 obsoleto, lo que causaba fallos en la extensión C de pandas (ModuleNotFoundError: pandas._libs.pandas_parser) uvx stock-analyst-mcpahora funciona sin--python: uv/uvx selecciona automáticamente 3.13+
Novedades en v0.5.6
Migración del framework MCP — FastMCP independiente
- Reemplazado el SDK
mcpporfastmcpindependiente: Elimina los cambios disruptivos de v2.0.0, sin más errores de importación demcp.server.fastmcp - Dependencia más limpia:
fastmcp>=3.4.0,<4.0.0(mantenido por Prefect, en desarrollo activo) - Configuración del puerto: Ahora se pasa como kwarg a
mcp.run(transport=..., port=...) - A prueba de futuro: Sin conflictos de versiones del SDK, fastmcp maneja todas las versiones del protocolo MCP
Novedades en v0.5.5
Corrección de noticias — cambio de formato en yfinance
- Corregidos titulares vacíos: yfinance ahora anida los campos de noticias bajo
content - Mapeo correcto: title, publisher, link, pub_date extraídos de
content.* - Compatible con versiones anteriores: aún maneja el formato de noticias heredado de nivel superior
Novedades en v0.5.4
Corrección de API — compatibilidad con FastMCP.run()
- Corregido TypeError:
FastMCP.run()no acepta el kwargport - Configuración del puerto: Se establece mediante
mcp.settings.portantes de llamar arun()
Novedades en v0.5.3
Corrección de compatibilidad — soporte para mcp>=1.28
- Corregida importación disruptiva: Reemplazado
MCPServereliminado porFastMCPdemcp.server.fastmcp - Dependencia mcp fijada:
mcp>=1.0.0,<3.0.0para evitar futuros problemas - Añadido requirements.txt para instalaciones basadas en pip
Novedades en v0.5.2
Corrección del screener — screen_stocks funciona en todas las regiones
- Corregido el parámetro EquityQuery de yfinance:
_size→sizeen la llamada ayf.screen(), restaurando los resultados del screener para India y otras regiones
Novedades en v0.5.1
Revisión de rendimiento — análisis de pares 3-19x más rápido
- Fundamentales de pares en paralelo: ThreadPoolExecutor en llamadas a
get_info()(aceleración 3.7x) - Descargas de historial por lotes: Un solo
yf.download()para todos los pares (aceleración 19.3x) - Obtención de fragmentos en paralelo: El análisis de noticias ahora obtiene fragmentos de artículos de forma concurrente
- Nuevo módulo
stock_analyst/utils/: Helpers de concurrencia reutilizables (parallel_map,parallel_map_dict,batch_download_history) - Cero dependencias nuevas: Usa
concurrent.futuresde la biblioteca estándar
Ejemplo: Analizar LOW (US) con 10 pares ahora toma ~2-3s en lugar de 8-10s.
Instalación
pip install stock-analyst-mcp
O ejecútalo directamente sin instalar:
uvx stock-analyst-mcp
Configuración de MCP
Añade a la configuración de tu cliente MCP (Claude Desktop, Devin, Cursor, etc.):
{
"mcpServers": {
"stock-analyst": {
"command": "uvx",
"args": ["stock-analyst-mcp"]
}
}
}
O si se instaló mediante pip:
{
"mcpServers": {
"stock-analyst": {
"command": "stock-analyst-mcp"
}
}
}
Herramientas
| Herramienta | Descripción |
|---|---|
analyze_stock | Análisis completo: fundamentales + técnicos + pares + DCF + pronóstico + noticias (cualquier región) |
get_fundamentals | Ratios financieros: rentabilidad, liquidez, apalancamiento, eficiencia, valoración |
get_technicals | Señales técnicas: tendencia EMA, RSI, MACD, Bandas de Bollinger |
get_peer_comparison | Métricas fundamentales y técnicas de pares con clasificaciones (limitado a la región) |
get_dcf_valuation | DCF: WACC, valor del patrimonio/acción, rango de sensibilidad |
get_revenue_forecast | Pronóstico de ingresos: escenarios base/alcista/bajista |
get_news | Titulares de noticias con sentimiento VADER + fragmentos de artículos + recomendaciones de analistas |
get_market_mood | Índices específicos de la región + índice de volatilidad + evaluación del mercado |
screen_stocks | Filtrar acciones por criterios (sector, PE, ROE, capitalización de mercado, etc.) en cualquier región |
get_screener_filters | Listar las claves de filtro del screener y las opciones de ordenación disponibles |
search_tickers | Buscar tickers por nombre o símbolo en todas las regiones (acciones, ETFs, índices, cripto, etc.) |
analyze_asset | Analizar cualquier clase de activo: acciones, ETFs, índices, materias primas, cripto, divisas |
compare_stocks | Comparación lado a lado de múltiples acciones |
get_raw_data | Obtener datos financieros brutos en caché para análisis profundos |
get_config | Ver la configuración actual de todas las herramientas de análisis |
set_config | Actualizar la configuración de forma dinámica |
Herramientas de Configuración
get_config
Recupera toda la configuración actual. Útil para entender qué parámetros están disponibles antes de llamar a set_config.
from stock_analyst import get_config
config = get_config()
# Returns dict with sections:
# - data_provider, default_exchange, default_period, cache settings
# - technical_analysis: EMA periods, RSI period, MACD params, Bollinger settings
# - financial_analysis: DCF params, WACC settings, forecast scenarios
# - peer_comparison: max count, metrics to compare
# - output: format, pretty-print settings
set_config
Actualiza la configuración dinámicamente sin reiniciar. Los cambios afectan a las llamadas posteriores de herramientas.
from stock_analyst import set_config
# Change technical analysis period from 1y to 1d
result = set_config("default_period", "1d")
# Returns: {"status": "success", "key": "default_period", "new_value": "1d", "affected_tools": ["all_tools"]}
# Change RSI period from 14 to 21
result = set_config("ta_rsi_period", "21")
# Returns: {"status": "success", "key": "ta_rsi_period", "new_value": 21, "affected_tools": ["get_technicals", "analyze_stock"]}
# Change DCF projection years from 5 to 10
result = set_config("fa_dcf_projection_years", "10")
# Returns: {"status": "success", "key": "fa_dcf_projection_years", "new_value": 10, "affected_tools": ["get_dcf_valuation", "get_revenue_forecast", "analyze_stock"]}
Claves de configuración comunes:
| Clave | Tipo | Predeterminado | Descripción | Afecta |
|---|---|---|---|---|
default_period | str | 1y | Período histórico: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, max | all_tools |
ta_rsi_period | int | 14 | Período de cálculo del RSI | get_technicals, analyze_stock |
ta_ema_periods | str | 20,50,200 | Períodos EMA separados por comas | get_technicals, analyze_stock |
ta_macd_params | str | 12,26,9 | MACD (rápido, lento, señal) | get_technicals, analyze_stock |
ta_bollinger_enabled | bool | true | Habilitar Bandas de Bollinger | get_technicals, analyze_stock |
ta_bollinger_period | int | 20 | Período de las Bandas de Bollinger | get_technicals, analyze_stock |
fa_dcf_enabled | bool | true | Ejecutar valoración DCF | analyze_stock, get_dcf_valuation |
fa_dcf_projection_years | int | 5 | Años de proyección DCF | get_dcf_valuation, get_revenue_forecast, analyze_stock |
fa_dcf_terminal_growth | float | 0.025 | Tasa de crecimiento terminal (2.5%) | get_dcf_valuation, analyze_stock |
fa_dcf_exit_multiple | float | 12.0 | Múltiplo de salida para DCF | get_dcf_valuation, analyze_stock |
fa_wacc_risk_free_rate | float | 0.07 | Tasa libre de riesgo (7% para India) | get_dcf_valuation, analyze_stock |
fa_wacc_equity_risk_premium | float | 0.06 | Prima de riesgo del capital (6%) | get_dcf_valuation, analyze_stock |
fa_wacc_cost_of_debt | float | 0.09 | Costo de la deuda (9% para India) | get_dcf_valuation, analyze_stock |
fa_wacc_tax_rate | float | 0.25 | Tasa impositiva (25% para India) | get_dcf_valuation, analyze_stock |
peers_max_count | int | 10 | Máximo de pares a comparar | get_peer_comparison, analyze_stock |
cache_ttl | int | 3600 | TTL de caché en segundos | all_tools |
Ejemplo: Personalizar el análisis técnico
from stock_analyst import set_config, get_technicals
# Use 1-day data with custom RSI period
set_config("default_period", "1d")
set_config("ta_rsi_period", "21")
# Get technicals with new settings
signals = get_technicals("RELIANCE")
Ejemplo: Personalizar la valoración DCF
from stock_analyst import set_config, get_dcf_valuation
# Use 10-year projection with different growth assumptions
set_config("fa_dcf_projection_years", "10")
set_config("fa_dcf_terminal_growth", "0.03") # 3% terminal growth
set_config("fa_wacc_risk_free_rate", "0.065") # 6.5% risk-free rate
# Get DCF with new assumptions
valuation = get_dcf_valuation("RELIANCE")
CLI
También funciona como CLI independiente (sin necesidad de LLM):
# Full analysis
stock-analyst --symbol RELIANCE
# Specific analysis
stock-analyst --symbol TCS --analysis fundamentals
stock-analyst --symbol INFY --analysis technicals
stock-analyst --symbol RELIANCE --analysis dcf
# Compare multiple stocks
stock-analyst --symbols RELIANCE,TCS,INFY --compare
# Markdown output
stock-analyst --symbol RELIANCE --format markdown
# Raw data
stock-analyst --symbol RELIANCE --raw financials
# Market mood (no symbol needed)
stock-analyst --analysis market-mood
# Stock screener (India)
stock-analyst --screen --sector Technology --pe-max 30 --roe-min 0.15
stock-analyst --screen --market-cap-min 50000000000 --sort-by pe --limit 20
# Global stocks (any region)
stock-analyst --symbol AAPL --region us
stock-analyst --symbol 0700.HK --region hk
stock-analyst --screen --region gb --sector Technology --pe-max 25
# Market mood (global)
stock-analyst --analysis market-mood --region us
stock-analyst --analysis market-mood --region de
# Ticker search
stock-analyst --search "Apple" --search-type stock --region us
stock-analyst --search "Bitcoin" --search-type cryptocurrency
# Multi-asset analysis
stock-analyst --symbol SPY --analysis asset --asset-type etf
stock-analyst --symbol GC=F --analysis asset --asset-type commodity
stock-analyst --symbol BTC-USD --analysis asset --asset-type crypto
Configuración
Todos los ajustes son configurables mediante variables de entorno con el prefijo SA_. Los valores predeterminados funcionan de inmediato para los mercados indios (NSE). Admite más de 50 regiones en todo el mundo.
| Variable | Predeterminado | Descripción |
|---|---|---|
SA_DEFAULT_REGION | in | Código de región (us, gb, de, jp, in, etc.) |
SA_DEFAULT_EXCHANGE | .NS | NSE (.NS) o BSE (.BO) — solo para India |
SA_DEFAULT_PERIOD | 1y | Período de datos históricos |
SA_CACHE_BACKEND | redis | redis, csv o none |
SA_REDIS_URL | redis://localhost:6379/0 | URL de conexión a Redis |
SA_CACHE_TTL | 3600 | TTL de caché en segundos |
SA_SCREENER_ENABLED | true | Usar screener.in como respaldo para pares |
SA_FA_DCF_ENABLED | true | Ejecutar valoración DCF |
SA_FA_WACC_RISK_FREE_RATE | 0.07 | Rendimiento del bono gubernamental indio a 10 años |
SA_PEERS_MAX_COUNT | 10 | Máximo de pares a comparar |
SA_MCP_TRANSPORT | stdio | stdio o streamable-http |
SA_MCP_PORT | 3001 | Puerto para streamable-http |
Consulta configurations.env.example para ver la lista completa.
Biblioteca de Python
from stock_analyst import (
analyze, get_fundamentals, get_technicals,
get_news, get_market_mood, screen_stocks,
search_tickers, analyze_asset,
)
# Indian stocks (default region)
result = analyze("RELIANCE")
ratios = get_fundamentals("TCS")
signals = get_technicals("INFY", period="6mo")
# Global stocks (any region)
us_stock = analyze("AAPL", region="us")
hk_stock = analyze("0700.HK", region="hk")
uk_stock = analyze("HSBA", region="gb")
# News with sentiment
news = get_news("TCS")
# Returns headlines with sentiment_score, sentiment_label, snippet
# Market mood (region-specific)
mood_in = get_market_mood(region="in") # Includes MMI from tickertape
mood_us = get_market_mood(region="us") # S&P 500 + VIX
mood_de = get_market_mood(region="de") # DAX + VDAX
# Stock screener (any region)
results_in = screen_stocks({"sector": "Technology", "pe_max": 30}, region="in")
results_us = screen_stocks({"sector": "Technology", "pe_max": 40}, region="us")
# Ticker search
apple_results = search_tickers("Apple", instrument_type="stock", region="us")
crypto_results = search_tickers("Bitcoin", instrument_type="cryptocurrency")
# Multi-asset analysis
etf = analyze_asset("SPY", asset_type="etf")
commodity = analyze_asset("GC=F", asset_type="commodity")
crypto = analyze_asset("BTC-USD", asset_type="crypto")
currency = analyze_asset("EURUSD=X", asset_type="currency")
Pruebas
# Install dev dependencies
pip install -e ".[dev]"
# Run all tests
pytest
# Run with coverage
pytest --cov=stock_analyst --cov-report=term-missing
# Run specific test file
pytest tests/test_peers.py -v
Fuentes de datos
- yfinance — OHLCV, estados financieros, balance general, flujo de caja, info, descubrimiento de pares mediante Industry API, screener de acciones mediante EquityQuery (más de 50 regiones)
- screener.in — descubrimiento de pares + screener de acciones de respaldo para India (mejor esfuerzo, degradación elegante)
- tickertape.in — extracción del Market Mood Index (MMI) para India
- VADER — análisis de sentimiento de titulares (vaderSentiment)
- Valores predeterminados ajustados para India — tasa libre de riesgo 7%, costo de la deuda 9%, impuestos 25%
Regiones admitidas
Más de 50 regiones mediante yfinance: EE. UU., Reino Unido, Alemania, Francia, Italia, España, Países Bajos, Bélgica, Suiza, Austria, Suecia, Noruega, Dinamarca, Finlandia, Polonia, República Checa, Rumanía, Portugal, Grecia, Hungría, Irlanda, Lituania, Letonia, Estonia, Canadá, México, Brasil, Argentina, Chile, Perú, Colombia, Venezuela, Australia, Nueva Zelanda, Japón, Corea del Sur, China, Hong Kong, Singapur, Malasia, Tailandia, Filipinas, Indonesia, Vietnam, Pakistán, Sri Lanka, EAU, Arabia Saudita, Kuwait, Catar, Israel, Egipto, Turquía, Sudáfrica y más.
Referencia rápida de regiones
| Región | Código | Índice principal | VIX |
|---|---|---|---|
| EE. UU. | us | S&P 500 (^GSPC) | ^VIX |
| Reino Unido | gb | FTSE 100 (^FTSE) | ^VIX |
| Alemania | de | DAX (^GDAXI) | ^VDAX |
| Francia | fr | CAC 40 (^FCHI) | ^VDAX |
| Japón | jp | Nikkei 225 (^N225) | ^VIX |
| Hong Kong | hk | Hang Seng (^HSI) | ^VIX |
| India | in | Nifty 50 (^NSEI) | ^INDIAVIX |
| Australia | au | ASX 200 (^AXJO) | ^VIX |
| Canadá | ca | TSX (^GSPTSE) | ^VIX |
| Brasil | br | Bovespa (^BVSP) | ^VIX |
Licencia
MIT