Skip to main content
Glama
yfinance

yfinance

by ozp

MCP Yahoo Finance Server

PyPI version PyPI - Downloads Python 3.10+ License: MIT MCP

A production-ready Model Context Protocol (MCP) server providing comprehensive access to Yahoo Finance data through 18 specialized tools. Features intelligent caching, multi-market support, and complete type safety.

🌟 Features

  • 18 Comprehensive Tools - Complete coverage of pricing, financials, options, holders, and news

  • Intelligent SQLite Caching - Reduces latency by 90% with TTL-based cache management

  • Multi-Market Support - Works globally with configurable market normalization (US, BR, UK, DE, FR, JP, IN, HK, AU, CA, and more)

  • Type-Safe - Full Pydantic models with complete type hints throughout

  • Production-Ready - Robust error handling with custom exception hierarchy

  • Zero Configuration - Deploy instantly via uvx with no setup required

  • Async/Await - Optimized for concurrent operations

Related MCP server: MCP Yahoo Finance

πŸš€ Quick Start

Add to your Claude Desktop configuration (claude_desktop_config.json):

{
  "mcpServers": {
    "yfinance": {
      "command": "uvx",
      "args": ["mcp-yfinance"],
      "env": {
        "YFINANCE_DEFAULT_MARKET": "US"
      }
    }
  }
}

Manual Installation

# Install with pip
pip install mcp-yfinance

# Or install from source
git clone https://github.com/yourusername/mcp-yfinance.git
cd mcp-yfinance
pip install -e .

πŸ› οΈ Configuration

Market Selection

Set your default market via environment variable:

# US stocks (default)
export YFINANCE_DEFAULT_MARKET=US

# Brazilian stocks (auto-adds .SA suffix)
export YFINANCE_DEFAULT_MARKET=BR

# UK stocks (auto-adds .L suffix)
export YFINANCE_DEFAULT_MARKET=UK

# Indian stocks - NSE (auto-adds .NS suffix)
export YFINANCE_DEFAULT_MARKET=IN_NSE

# Indian stocks - BSE (auto-adds .BO suffix)
export YFINANCE_DEFAULT_MARKET=IN_BSE

Supported Markets:

  • US - United States (no suffix)

  • BR - Brazil (.SA)

  • UK - United Kingdom (.L)

  • DE - Germany (.DE)

  • FR - France (.PA)

  • JP - Japan (.T)

  • IN_NSE - India NSE (.NS)

  • IN_BSE - India BSE (.BO)

  • HK - Hong Kong (.HK)

  • AU - Australia (.AX)

  • CA - Canada (.TO)

Cache Configuration

Cache is automatically created at ~/.mcp-yfinance/cache.db with the following TTLs:

Data Type

TTL

Use Case

Current Quotes

5 min

Real-time price tracking

Option Chains

5 min

Options trading

News

30 min

Recent news updates

Stock Info

1 hour

Company information

Historical Data

24 hours

Price history

Financial Statements

24 hours

Quarterly/annual reports

Holders

24 hours

Ownership data

Recommendations

24 hours

Analyst ratings

πŸ“š Available Tools

Pricing & Historical Data (6 tools)

1. get_current_stock_price

Get current stock price with day change information.

Input:

{
  "symbol": "AAPL"
}

Output:

{
  "symbol": "AAPL",
  "price": 234.56,
  "change": 2.34,
  "change_percent": 1.01,
  "volume": 52487900,
  "currency": "USD",
  "timestamp": "2025-01-15T16:00:00"
}

2. get_stock_price_by_date

Get closing price for a specific date.

Input:

{
  "symbol": "MSFT",
  "date": "2025-01-10"
}

3. get_stock_price_date_range

Get price series for a date range.

Input:

{
  "symbol": "GOOGL",
  "start_date": "2025-01-01",
  "end_date": "2025-01-15"
}

4. get_historical_stock_prices

Get full OHLCV (Open, High, Low, Close, Volume) historical data.

Input:

{
  "symbol": "TSLA",
  "period": "1mo",
  "interval": "1d"
}

Supported periods: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max

Supported intervals: 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo

5. get_dividends

Get complete dividend payment history.

6. get_stock_actions

Get all stock actions (dividends + splits).


Company Information (1 tool)

7. get_stock_info

Get comprehensive company information (~100 fields).

Output includes:

  • Company name, sector, industry

  • Market cap, enterprise value

  • P/E ratio, dividend yield

  • 52-week high/low

  • Beta, trailing EPS

  • And much more...


Financial Statements (3 tools)

8. get_income_statement

Get income statement (DRE - DemonstraΓ§Γ£o de Resultados do ExercΓ­cio).

Input:

{
  "symbol": "AAPL",
  "freq": "yearly"
}

Frequencies: yearly, quarterly, trailing

9. get_balance_sheet

Get balance sheet (BalanΓ§o Patrimonial).

10. get_cashflow

Get cash flow statement.


Holders & Ownership (1 tool)

11. get_holder_info

Get holder information with 6 different types.

Input:

{
  "symbol": "NVDA",
  "holder_type": "institutional_holders"
}

Holder types:

  • major_holders - Major ownership percentages

  • institutional_holders - Institutional investors

  • mutualfund_holders - Mutual fund holdings

  • insider_transactions - Recent insider trades

  • insider_purchases - Insider buy transactions

  • insider_roster_holders - Current insider roster


Options (2 tools)

12. get_option_expiration_dates

Get all available option expiration dates.

Output:

["2025-01-17", "2025-01-24", "2025-02-21", ...]

13. get_option_chain

Get option chain for specific expiration date.

Input:

{
  "symbol": "SPY",
  "expiration_date": "2025-01-17",
  "option_type": "both"
}

Option types: calls, puts, both

Output includes:

  • Contract symbols

  • Strike prices

  • Last prices, bid, ask

  • Volume and open interest

  • Implied volatility


News & Analysis (5 tools)

14. get_news

Get recent news articles.

Output:

[
  {
    "title": "Apple announces new iPhone",
    "summary": "...",
    "url": "https://...",
    "provider": "Reuters",
    "publishedAt": "2025-01-15T10:30:00Z"
  }
]

15. get_recommendations

Get analyst recommendations and upgrades/downgrades.

Input:

{
  "symbol": "TSLA",
  "recommendation_type": "upgrades_downgrades",
  "months_back": 12
}

Recommendation types: recommendations, upgrades_downgrades

16. get_earning_dates

Get earnings announcement dates (past and future).

Input:

{
  "symbol": "META",
  "limit": 12
}

17. get_stock_splits

Get historical stock split data.

Input:

{
  "symbol": "AAPL"
}

Output:

[
  {
    "date": "2020-08-31",
    "ratio": 4.0
  },
  {
    "date": "2014-06-09",
    "ratio": 7.0
  }
]

18. get_analyst_price_targets

Get analyst price targets and estimates.

Input:

{
  "symbol": "NVDA"
}

Output includes:

  • Current price

  • Target mean, median, high, low

  • Number of analysts

  • Recommendation (buy/hold/sell)


πŸ’‘ Usage Examples

With Claude Desktop

User: What's the current price of Apple stock?
Claude: [Uses get_current_stock_price tool]
        Apple (AAPL) is currently trading at $234.56, up $2.34 (1.01%) today.

User: Show me Microsoft's quarterly revenue for the last year
Claude: [Uses get_income_statement with freq="quarterly"]
        Here's Microsoft's quarterly revenue...

User: Get Tesla call options expiring next month
Claude: [Uses get_option_expiration_dates, then get_option_chain]
        Here are Tesla's call options for 2025-02-21...

Brazilian Market Example

{
  "mcpServers": {
    "yfinance-br": {
      "command": "uvx",
      "args": ["mcp-yfinance"],
      "env": {
        "YFINANCE_DEFAULT_MARKET": "BR"
      }
    }
  }
}
User: Qual o preΓ§o atual de PETR4?
Claude: [Automatically normalizes to PETR4.SA]
        Petrobras PN (PETR4.SA) estΓ‘ cotada a R$ 38.45...

πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Claude Desktop / API Client    β”‚
β”‚   (User makes stock queries)     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚ stdio
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   server.py (MCP Protocol)       β”‚ ◄─── Tool registration
β”‚   - @server.list_tools()         β”‚      Input validation
β”‚   - @server.call_tool()          β”‚      Response formatting
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   cache.py (Cache Layer)         β”‚ ◄─── TTL-based caching
β”‚   - Check cache by key           β”‚      5min: quotes
β”‚   - Return if valid              β”‚      1h: stock info
β”‚   - Pass through if miss         β”‚      24h: historical
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚ (cache miss)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   service.py (Business Logic)    β”‚ ◄─── YahooFinanceService
β”‚   - Normalize ticker             β”‚      Input validation
β”‚   - Call yfinance                β”‚      Data transformation
β”‚   - Map to Pydantic models       β”‚      Error handling
β”‚   - Save to cache                β”‚      Market normalization
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   yfinance library               β”‚
β”‚   (Yahoo Finance API)            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Project Structure

mcp-yfinance/
β”œβ”€β”€ src/
β”‚   └── mcp_yfinance/
β”‚       β”œβ”€β”€ __init__.py       # Version, exports, main()
β”‚       β”œβ”€β”€ __main__.py       # CLI entry point
β”‚       β”œβ”€β”€ server.py         # MCP server orchestration
β”‚       β”œβ”€β”€ service.py        # Business logic (18 methods)
β”‚       β”œβ”€β”€ models.py         # Pydantic schemas + Enums
β”‚       β”œβ”€β”€ cache.py          # SQLite cache manager
β”‚       β”œβ”€β”€ exceptions.py     # Custom exception hierarchy
β”‚       β”œβ”€β”€ utils.py          # Helper functions
β”‚       β”œβ”€β”€ config.py         # Configuration management
β”‚       └── py.typed          # Type checking marker
β”œβ”€β”€ tests/                    # Test suite
β”œβ”€β”€ pyproject.toml           # Package configuration
└── README.md                # This file

πŸ§ͺ Development

Setup Development Environment

# Clone repository
git clone https://github.com/yourusername/mcp-yfinance.git
cd mcp-yfinance

# Install with dev dependencies
pip install -e ".[dev]"

# Or with uv (recommended)
uv pip install -e ".[dev]"

Running Tests

# Run all tests
pytest

# Run with coverage
pytest --cov=mcp_yfinance --cov-report=html

# Run specific test file
pytest tests/test_service.py

Type Checking

# Run mypy
mypy src/mcp_yfinance

# Run ruff (linter + formatter)
ruff check src/mcp_yfinance
ruff format src/mcp_yfinance

Testing the Server

# Run server directly
python -m mcp_yfinance

# Test with MCP Inspector
npx @modelcontextprotocol/inspector uv run mcp-yfinance

# Test with environment variable
YFINANCE_DEFAULT_MARKET=BR python -m mcp_yfinance

πŸ”§ Troubleshooting

Common Issues

Issue: "Ticker not found"

  • Make sure the ticker symbol is correct

  • Check if you're using the right market (US vs BR vs UK, etc.)

  • Some tickers may not be available on Yahoo Finance

Issue: "Cache permission denied"

  • Ensure ~/.mcp-yfinance/ directory is writable

  • Check disk space

Issue: "Module not found"

  • Reinstall package: pip install --force-reinstall mcp-yfinance

  • Check Python version (requires β‰₯3.10)

Issue: "SSL certificate verification failed"

  • Set verify=False in service initialization (not recommended for production)

  • Update CA certificates: pip install --upgrade certifi


🀝 Contributing

Contributions are welcome! Please follow these guidelines:

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/amazing-feature)

  3. Write tests for new functionality

  4. Ensure all tests pass (pytest)

  5. Run type checking (mypy src/mcp_yfinance)

  6. Format code (ruff format)

  7. Commit changes (git commit -m 'Add amazing feature')

  8. Push to branch (git push origin feature/amazing-feature)

  9. Open a Pull Request

Code Standards

  • All code in English (comments, docstrings, variable names)

  • Complete type hints on all functions

  • Google-style docstrings

  • Test coverage β‰₯80%

  • Pass mypy strict mode


πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.


πŸ™ Acknowledgments


πŸ“ž Support


πŸ—ΊοΈ Roadmap

v0.2.0 (Planned)

  • Advanced retry logic with exponential backoff

  • Rate limiting protection

  • WebSocket support for real-time quotes

  • Additional markets (CN, KR, TW, etc.)

v0.3.0 (Future)

  • Multiple data sources (Alpha Vantage, IEX Cloud)

  • Backtesting tools

  • Technical indicators (RSI, MACD, Bollinger Bands)

  • Portfolio tracking


πŸ“Š Performance

Benchmarks (on average hardware):

Operation

Without Cache

With Cache

Improvement

Get Stock Price

450ms

15ms

96% faster

Get Historical Data

1200ms

20ms

98% faster

Get Option Chain

800ms

18ms

97% faster

Get Financial Statements

950ms

25ms

97% faster

Cache hit rate: ~85% after 1 hour of usage


Made with ❀️ for the MCP community

Available Tools

18 tools
get_analyst_price_targetsC

Get analyst price targets and recommendations summary.

Inputs: symbol (required).

get_balance_sheetC

Get balance sheet for a stock.

Inputs: symbol (required), freq.

get_cashflowC

Get cash flow statement for a stock.

Inputs: symbol (required), freq.

get_current_stock_priceB

Get the current stock price for a given symbol.

Inputs: symbol (required).

get_dividendsB

Get dividend history for a stock.

Inputs: symbol (required).

get_earning_datesA

Get upcoming and historical earnings dates for a stock.

Inputs: symbol (required), limit.

get_historical_stock_pricesB

Get historical stock prices for a given period and interval.

Inputs: symbol (required), period, interval.

get_holder_infoB

Get holder and ownership information for a stock.

Inputs: symbol (required), holder_type (required).

get_income_statementC

Get income statement for a stock.

Inputs: symbol (required), freq.

get_newsB

Get recent news articles for a stock.

Inputs: symbol (required).

get_option_chainB

Get option chain data for a specific expiration date.

Inputs: symbol (required), expiration_date (required), option_type.

get_option_expiration_datesC

Get available option expiration dates for a stock.

Inputs: symbol (required).

get_recommendationsC

Get analyst recommendations for a stock.

Inputs: symbol (required), recommendation_type, months_back.

get_stock_actionsB

Get stock actions (splits and dividends) history.

Inputs: symbol (required).

get_stock_infoC

Get comprehensive stock information and metadata.

Inputs: symbol (required).

get_stock_price_by_dateB

Get the stock price for a specific date.

Inputs: symbol (required), date (required).

get_stock_price_date_rangeB

Get stock prices for a date range.

Inputs: symbol (required), start_date (required), end_date (required).

get_stock_splitsB

Get stock split history for a stock.

Inputs: symbol (required).

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 18 tools

    Disambiguation5/5

    Each tool has a distinct, clearly defined purpose with no overlap. For example, get_current_stock_price, get_stock_price_by_date, and get_stock_price_date_range target different price queries, while financial statements (get_balance_sheet, get_income_statement, get_cashflow) are unique.

    Naming Consistency5/5

    All tools follow a consistent 'get_' prefix followed by descriptive snake_case noun phrases. No mixing of convention or verb styles.

    Tool Count4/5

    18 tools is slightly above the typical sweet spot (3-15) but still reasonable for a comprehensive financial data API. Each tool contributes to a well-scoped domain without feeling excessive.

    Completeness5/5

    The tool surface covers all major aspects of stock data: prices (current/historical/by date), financial statements, dividends, splits, options, analysts, news, holder info, and metadata. No obvious gaps for fundamental stock analysis.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      B
      maintenance
      A Model Context Protocol server that enables interaction with Yahoo Finance to retrieve stock pricing, company information, and historical financial data through natural language queries.
      21
      1,006 PyPI
      29
      MIT
    • A
      license
      C
      quality
      Not graded
      maintenance
      A Model Context Protocol server that provides tools for interacting with Yahoo Finance, allowing users to retrieve stock prices, company information, and perform financial data comparisons.
      11
      MIT
    • A
      license
      C
      quality
      D
      maintenance
      A Model Context Protocol server providing comprehensive financial data from Yahoo Finance, allowing users to retrieve detailed stock information, financial statements, options data, and market news.
      34
      MIT
    • F
      license
      Not graded
      quality
      Not graded
      maintenance
      Financial MCP server providing 15 tools for stock quotes, financials, risk metrics, news sentiment, SEC filings, and session summaries via Yahoo Finance data.
      -