Skip to main content
Glama
wallacetju

Stock Data MCP Server

by wallacetju

Stock Data MCP Server

Production-ready aggregated MCP server for stock market data combining Finnhub (fundamentals), Yahoo Finance (quotes/history), Tushare (China A-shares), and Futu OpenAPI (HK/US/CN Real-time).

Perfect for building value investing agents, financial analysis tools, and portfolio management systems.

🎯 Features

πŸ” 9 Powerful Tools

  1. search_symbol - Search stocks across all markets

  2. resolve_symbol - normalize symbols between Yahoo (0700.HK) and Futu (HK.00700) formats

  3. get_quote - Real-time quotes (Futu Snapshot / Yahoo Delay)

  4. get_history - Historical OHLCV data (Futu K-line / Yahoo History)

  5. get_fundamentals - ROE, margins, ratios, valuations

  6. get_financial_statements - Income/Balance/Cashflow statements

  7. subscribe_quote - Subscribe to real-time pushes (Futu)

  8. get_order_book - Real-time market depth (Futu)

  9. get_ticker - Real-time trade ticks (Futu)

Intelligent Data Routing

Market

Primary

Fallback

πŸ‡­πŸ‡° ζΈ―θ‚‘

Futu OpenAPI

Yahoo Finance

πŸ‡¨πŸ‡³ Aθ‚‘

Tushare Pro

Yahoo Finance

πŸ‡ΊπŸ‡Έ ηΎŽθ‚‘

Yahoo Finance

-

  • Fundamentals/Financials:

    • China (A-shares): Tushare Pro.

    • Global: Finnhub.

  • Smart Caching: 5s for quotes, 1h for fundamentals, 24h for statements.

Multi-Market Support

Market

Symbol Format (Yahoo)

Futu Format

Examples

πŸ‡ΊπŸ‡Έ US Stocks

SYMBOL

US.SYMBOL

AAPL, MSFT

πŸ‡­πŸ‡° Hong Kong

CODE.HK

HK.CODE

0700.HK (HK.00700)

πŸ‡¨πŸ‡³ Shanghai

CODE.SS

SH.CODE

600519.SS (SH.600519)

πŸ‡¨πŸ‡³ Shenzhen

CODE.SZ

SZ.CODE

000001.SZ (SZ.000001)

πŸ“¦ Installation

Prerequisites

  1. Python 3.10+

  2. Finnhub API Key (Free tier ok) - Register

  3. Tushare Token (Optional, for A-share fundamentals) - Register

  4. FutuOpenD (Optional, for Real-time HK/US/CN data)

    • Download and install FutuOpenD.

    • Login with your Futu account.

    • Keep it running (default port 11111).

Quick Start

# Clone or navigate to the project
cd stock-data-mcp

# Install with valid tools (uv recommended)
uv sync

# Set up environment
cp .env.example .env
# Edit .env and add your API keys

Environment Variables

Create a .env file:

# Data Provider Keys
FINNHUB_API_KEY=your_key_here
TUSHARE_TOKEN=your_token_here

# Futu Configuration (Optional)
FUTU_OPEND_HOST=127.0.0.1
FUTU_OPEND_PORT=11111

# Cache Settings
STOCK_MCP_TIMEOUT_SECONDS=10
STOCK_MCP_CACHE_TTL_QUOTE=5
STOCK_MCP_CACHE_TTL_FUNDAMENTALS=3600
STOCK_MCP_CACHE_TTL_STATEMENTS=86400

πŸš€ Usage

Running the Server

# Start the MCP server (stdio mode)
python -m stock_data_mcp

Claude Desktop Integration

macOS Configuration: Edit: ~/Library/Application Support/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "stock-data": {
      "command": "/absolute/path/to/venv/bin/python",
      "args": ["-m", "stock_data_mcp"],
      "cwd": "/absolute/path/to/stock-data-mcp",
      "env": {
        "FINNHUB_API_KEY": "...",
        "TUSHARE_TOKEN": "...",
        "FUTU_OPEND_HOST": "127.0.0.1",
        "FUTU_OPEND_PORT": "11111"
      }
    }
  }
}

πŸ“š API Reference Examples

Real-time Quotes (Futu/Yahoo)

// get_quote
{
  "symbol": "0700.HK",
  "prefer": "auto" // tries Futu -> Yahoo
}

Order Book (Futu Only)

// get_order_book
{
  "symbol": "0700.HK",
  "num": 10
}

Historical Data

// get_history
{
  "symbol": "600519.SS",
  "start_date": "2024-01-01",
  "end_date": "2024-01-31",
  "interval": "1d",
  "adjust": "qfq" // Forward adjusted
}

πŸ”§ Error Handling

Errors return structured JSON with specific codes:

  • PROVIDER_CONNECT_FAILED: FutuOpenD not reachable.

  • HISTORY_NOT_AVAILABLE: Permission denied or no data.

  • SUBSCRIPTION_LIMIT: Futu subscription quota exceeded.

🀝 Contributing

To add a new provider:

  1. Create providers/new_provider.py

  2. Implement provider interface

  3. Add routing logic in server.py

  4. Update tests and README

πŸ“„ License

MIT

Production-ready aggregated MCP server for stock market data combining Finnhub (fundamentals) and Yahoo Finance (quotes/history).

Perfect for building value investing agents, financial analysis tools, and portfolio management systems.

🎯 Features

5 Powerful Tools

  1. search_symbol - Search stocks across all markets

  2. get_quote - Real-time quotes with 5s caching

  3. get_history - Historical OHLCV data

  4. get_fundamentals - ROE, margins, ratios, valuations

  5. get_financial_statements - Income/Balance/Cashflow statements

Intelligent Data Routing

  • Quotes/History: Yahoo Finance (free, fast, no limits)

  • Fundamentals/Financials: Finnhub (professional-grade data)

  • Automatic Fallback: If primary source fails, tries backup

  • Smart Caching: 5s for quotes, 1h for fundamentals, 24h for statements

Multi-Market Support

Market

Symbol Format

Examples

πŸ‡ΊπŸ‡Έ US Stocks

SYMBOL

AAPL, MSFT, GOOGL

πŸ‡­πŸ‡° Hong Kong

CODE.HK

0700.HK (Tencent), 9988.HK (Alibaba)

πŸ‡¨πŸ‡³ Shanghai

CODE.SS

600519.SS (Moutai), 600036.SS (CMB)

πŸ‡¨πŸ‡³ Shenzhen

CODE.SZ

000001.SZ (Pingan), 300750.SZ (CATL)

πŸ“¦ Installation

Prerequisites

  1. Python 3.10+

  2. Finnhub API Key (free tier is fine)

Quick Start

# Clone or navigate to the project
cd stock-data-mcp

# Install with pip
pip install -e .

# Or with uv (faster)
uv pip install -e .

# Set up environment
cp .env.example .env
# Edit .env and add your FINNHUB_API_KEY

Environment Variables

Create a .env file:

# Required
FINNHUB_API_KEY=your_actual_api_key_here

# Optional (with defaults)
STOCK_MCP_TIMEOUT_SECONDS=10
STOCK_MCP_CACHE_TTL_QUOTE=5
STOCK_MCP_CACHE_TTL_FUNDAMENTALS=3600
STOCK_MCP_CACHE_TTL_STATEMENTS=86400

πŸš€ Usage

Running the Server

# Start the MCP server (stdio mode)
python -m stock_data_mcp

Testing Locally

# Run comprehensive tests
python quick_test.py

# Expected output:
# βœ“ PASS: Yahoo Quote
# βœ“ PASS: Yahoo History
# βœ“ PASS: Finnhub Fundamentals
# βœ“ PASS: Finnhub Statements

Claude Desktop Integration

macOS Configuration:

Edit: ~/Library/Application Support/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "stock-data": {
      "command": "/absolute/path/to/venv/bin/python",
      "args": ["-m", "stock_data_mcp"],
      "cwd": "/absolute/path/to/stock-data-mcp",
      "env": {
        "FINNHUB_API_KEY": "your_api_key_here"
      }
    }
  }
}

Windows Configuration:

Edit: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "stock-data": {
      "command": "C:\\path\\to\\venv\\Scripts\\python.exe",
      "args": ["-m", "stock_data_mcp"],
      "cwd": "C:\\path\\to\\stock-data-mcp",
      "env": {
        "FINNHUB_API_KEY": "your_api_key_here"
      }
    }
  }
}

After configuration:

  1. Completely quit Claude Desktop

  2. Restart Claude Desktop

  3. The tools will appear in your conversations

πŸ“š API Reference

1. search_symbol

Search for stock symbols across markets.

Input:

{
  "query": "tencent",
  "limit": 10,
  "market_hint": "HK"
}

Output:

{
  "results": [
    {
      "symbol": "0700.HK",
      "name": "Tencent Holdings Ltd",
      "market": "HK",
      "exchange": "HKG",
      "source": "finnhub"
    }
  ]
}

Data Source: Finnhub β†’ Yahoo (fallback)


2. get_quote

Get real-time market data.

Input:

{
  "symbol": "0700.HK",
  "prefer": "yahoo"
}

Output:

{
  "symbol": "0700.HK",
  "name": "Tencent Holdings Ltd",
  "market": "HK",
  "exchange": "HKG",
  "currency": "HKD",
  "price": 385.60,
  "change": 4.20,
  "change_pct": 1.10,
  "open": 382.00,
  "high": 387.20,
  "low": 380.50,
  "prev_close": 381.40,
  "volume": 15234000,
  "timestamp": "2025-12-12T14:30:00Z",
  "source": "yahoo"
}

Data Source: Yahoo (default) β†’ Finnhub (fallback) Cache: 5 seconds


3. get_history

Get historical OHLCV data.

Input:

{
  "symbol": "600519.SS",
  "start_date": "2024-01-01",
  "end_date": "2024-12-31",
  "interval": "1d"
}

Intervals: 1d (daily), 1wk (weekly), 1mo (monthly)

Output:

{
  "symbol": "600519.SS",
  "records": [
    {
      "date": "2024-01-02",
      "open": 1650.00,
      "high": 1680.50,
      "low": 1645.00,
      "close": 1672.30,
      "volume": 8234500
    }
  ]
}

Data Source: Yahoo Finance Cache: 5 minutes


4. get_fundamentals

Get fundamental metrics (ROE, margins, ratios).

Input:

{
  "symbol": "AAPL",
  "period": "ttm"
}

Output:

{
  "symbol": "AAPL",
  "currency": "USD",
  "market_cap": 2890000000000,
  "pe": 29.45,
  "pb": 45.32,
  "ps": 7.58,
  "dividend_yield": 0.52,
  "roe": 147.25,
  "roa": 22.58,
  "gross_margin": 44.13,
  "operating_margin": 30.74,
  "net_margin": 25.31,
  "debt_to_equity": 1.96,
  "current_ratio": 0.98,
  "quick_ratio": 0.82,
  "revenue_ttm": 385603000000,
  "net_income_ttm": 97606000000,
  "free_cash_flow_ttm": 99584000000,
  "updated_at": "2025-12-12T14:30:00Z",
  "source": "finnhub"
}

Data Source: Finnhub (requires API key) Cache: 1 hour


5. get_financial_statements

Get income statement, balance sheet, or cashflow.

Input:

{
  "symbol": "AAPL",
  "statement": "income",
  "period": "annual"
}

Statement Types: income, balance, cashflow Periods: annual, quarterly

Output:

{
  "symbol": "AAPL",
  "statement": "income",
  "period": "annual",
  "currency": "USD",
  "items": [
    {
      "period_end": "2023-09-30",
      "revenue": 383285000000,
      "gross_profit": 169148000000,
      "operating_income": 114301000000,
      "net_income": 96995000000,
      "eps": 6.16
    }
  ],
  "source": "finnhub"
}

Data Source: Finnhub (requires API key) Cache: 24 hours

πŸ—οΈ Architecture

stock-data-mcp/
β”œβ”€β”€ stock_data_mcp/
β”‚   β”œβ”€β”€ server.py              # MCP server + routing logic
β”‚   β”œβ”€β”€ schemas.py             # Unified Pydantic models
β”‚   β”œβ”€β”€ cache.py               # TTL caching system
β”‚   β”œβ”€β”€ util.py                # Helper functions
β”‚   └── providers/
β”‚       β”œβ”€β”€ finnhub_provider.py    # Finnhub integration
β”‚       β”œβ”€β”€ yahoo_provider.py      # Yahoo Finance integration
β”‚       └── symbols.py             # Symbol normalization
β”œβ”€β”€ pyproject.toml
β”œβ”€β”€ .env.example
└── quick_test.py

Data Flow

User Request
    ↓
MCP Server (routing + caching)
    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Yahoo     β”‚  Finnhub    β”‚
β”‚  Provider   β”‚  Provider   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    ↓              ↓
Unified Schema Response

πŸ”§ Error Handling

All errors return structured JSON:

{
  "error": {
    "code": "PROVIDER_RATE_LIMIT",
    "message": "Finnhub API rate limit exceeded",
    "details": {
      "provider": "finnhub",
      "symbol": "AAPL"
    }
  }
}

Error Codes:

  • PROVIDER_TIMEOUT - Request timed out

  • SYMBOL_NOT_FOUND - Invalid or unknown symbol

  • INVALID_ARGUMENT - Bad input parameters

  • PROVIDER_RATE_LIMIT - API rate limit hit

  • PROVIDER_ERROR - Provider-specific error

  • MISSING_API_KEY - Finnhub key not configured

  • NO_DATA - No data available for request

πŸ’‘ Usage Examples with Claude

Once integrated, you can ask Claude:

"Compare the fundamentals of Tencent (0700.HK) and Alibaba (9988.HK).
Show me ROE, profit margins, and debt ratios."
"Get the last 5 years of annual financial statements for AAPL.
Calculate revenue growth rate and profit margin trends."
"Find Chinese tech stocks with ROE > 15% and PE < 20.
Show me their recent price performance."

🎯 Use Cases

Value Investing Analysis

  • Screen stocks by ROE, margins, debt ratios

  • Compare fundamentals across markets

  • Track historical performance metrics

Portfolio Management

  • Monitor real-time quotes for watchlist

  • Analyze sector allocations

  • Track dividend yields

Financial Research

  • Pull complete financial statements

  • Calculate custom metrics

  • Build valuation models

βš™οΈ Configuration

Cache TTL Settings

Adjust in .env:

STOCK_MCP_CACHE_TTL_QUOTE=5          # Quote cache (seconds)
STOCK_MCP_CACHE_TTL_FUNDAMENTALS=3600 # Fundamentals (1 hour)
STOCK_MCP_CACHE_TTL_STATEMENTS=86400  # Statements (24 hours)

Rate Limits

Finnhub Free Tier:

  • 60 API calls/minute

  • 30 calls/second

Best Practices:

  • Enable caching (default)

  • Batch similar requests

  • Use Yahoo for high-frequency quote checks

πŸ› Troubleshooting

"MISSING_API_KEY" error

# Check if env var is set
echo $FINNHUB_API_KEY

# If using .env file, verify it's loaded
cat .env | grep FINNHUB

# Restart server after setting

Server not appearing in Claude Desktop

  1. Check JSON syntax in config file

  2. Use absolute paths (not ~ or relative paths)

  3. Verify Python path with which python in your venv

  4. Check logs:

    # macOS
    tail -f ~/Library/Logs/Claude/mcp*.log
    
    # Windows
    Get-Content $env:APPDATA\Claude\logs\mcp*.log -Wait

Symbol not found

  • Verify symbol format (e.g., 0700.HK not 700.HK)

  • Try searching first: search_symbol("tencent")

  • Check if market is supported

Rate limit exceeded

  • Increase cache TTL

  • Reduce request frequency

  • Consider Finnhub paid tier for higher limits

πŸ“Š Performance

Typical Response Times:

  • Quote (cached): <10ms

  • Quote (fresh): 200-500ms

  • History (1 year): 500-1000ms

  • Fundamentals (cached): <10ms

  • Fundamentals (fresh): 1-2s

  • Statements: 1-3s

Cache Hit Rates:

  • Quotes: ~80% (5s TTL)

  • Fundamentals: ~95% (1h TTL)

  • Statements: ~99% (24h TTL)

πŸš€ Roadmap

v0.2 (Planned)

  • Symbol mapping table (watchlist.csv)

  • Company profile tool

  • News & sentiment data

  • Insider trading data

v0.3 (Future)

  • Alternative data sources (Alpha Vantage, IEX)

  • Crypto support

  • Options data

  • Technical indicators

🀝 Contributing

This is a production-ready MVP. Extensions welcome!

To add a new provider:

  1. Create providers/new_provider.py

  2. Implement provider interface

  3. Add routing logic in server.py

  4. Update tests and README

πŸ“„ License

MIT

πŸ™ Acknowledgments

  • Finnhub - Professional-grade financial data API

  • Yahoo Finance (yfinance) - Free historical data

  • MCP - Model Context Protocol by Anthropic


Built for value investors who code. πŸš€πŸ“ˆ

-
security - not tested
F
license - not found
-
quality - not tested

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/wallacetju/myStockMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server