Skip to main content
Glama
neeraj-somani

Tavily Web Search MCP Server

get_stock_ohlc

Retrieve Open, High, Low, Close stock price data for a specific symbol on a given date or the last trading day.

Instructions

Get Open, High, Low, Close (OHLC) data for a stock symbol for the last working day or specified date

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
symbolYes
dateNo

Implementation Reference

  • server.py:25-29 (handler)
    MCP tool handler for 'get_stock_ohlc', registered via @mcp.tool() decorator. Executes by calling get_stock_data from polygon_api.
    @mcp.tool()
    def get_stock_ohlc(symbol: str, date: str = None) -> str:
        """Get Open, High, Low, Close (OHLC) data for a stock symbol for the last working day or specified date"""
        return get_stock_data(symbol, date)
  • Core helper method in PolygonStockAPI class that performs the actual API call to Polygon.io to retrieve OHLC stock data.
    def get_stock_ohlc(self, symbol: str, date: Optional[str] = None) -> Dict:
        """
        Fetch Open, High, Low, Close (OHLC) data for a stock symbol.
        
        Args:
            symbol: Stock symbol (e.g., 'AAPL', 'MSFT', 'GOOGL')
            date: Date in YYYY-MM-DD format. If not provided, uses last working day.
        
        Returns:
            Dictionary containing OHLC data and metadata
        """
        if not date:
            date = self.get_last_working_day()
        
        # Validate symbol format
        symbol = symbol.upper().strip()
        
        # Polygon.io API endpoint for daily bars
        url = f"{self.base_url}/v2/aggs/ticker/{symbol}/prev"
        
        params = {
            "adjusted": "true",
            "apikey": self.api_key
        }
        
        try:
            response = requests.get(url, params=params, timeout=10)
            response.raise_for_status()
            
            data = response.json()
            
            if data.get("status") != "OK":
                return {
                    "error": f"API Error: {data.get('status', 'Unknown error')}",
                    "symbol": symbol,
                    "date": date
                }
            
            results = data.get("results", [])
            if not results:
                return {
                    "error": f"No data found for symbol {symbol}",
                    "symbol": symbol,
                    "date": date
                }
            
            # Extract OHLC data from the first result
            result = results[0]
            
            return {
                "symbol": symbol,
                "date": date,
                "open": result.get("o"),
                "high": result.get("h"),
                "low": result.get("l"),
                "close": result.get("c"),
                "volume": result.get("v"),
                "volume_weighted_average_price": result.get("vw"),
                "number_of_transactions": result.get("n"),
                "status": "success"
            }
            
        except requests.exceptions.RequestException as e:
            return {
                "error": f"Network error: {str(e)}",
                "symbol": symbol,
                "date": date
            }
        except Exception as e:
            return {
                "error": f"Unexpected error: {str(e)}",
                "symbol": symbol,
                "date": date
            }
  • Wrapper function imported by server.py that instantiates the API client, fetches data, formats it, and returns the string result.
    def get_stock_data(symbol: str, date: Optional[str] = None) -> str:
        """
        Convenience function to get formatted stock data.
        
        Args:
            symbol: Stock symbol (e.g., 'AAPL', 'MSFT', 'GOOGL')
            date: Date in YYYY-MM-DD format. If not provided, uses last working day.
        
        Returns:
            Formatted string with stock OHLC data
        """
        try:
            api = PolygonStockAPI()
            data = api.get_stock_ohlc(symbol, date)
            return api.format_stock_data(data)
        except Exception as e:
            return f"Error initializing API: {str(e)}"
  • Helper method to determine the last working day (weekday) if no date is specified.
    def get_last_working_day(self) -> str:
        """
        Get the last working day (excluding weekends).
        
        Returns:
            Date string in YYYY-MM-DD format
        """
        today = datetime.now()
        
        # Go back to find the last working day
        days_back = 1
        while True:
            check_date = today - timedelta(days=days_back)
            # Monday = 0, Sunday = 6
            if check_date.weekday() < 5:  # Monday to Friday
                return check_date.strftime("%Y-%m-%d")
            days_back += 1
  • Helper method to format the raw stock data dictionary into a human-readable string.
        def format_stock_data(self, data: Dict) -> str:
            """
            Format stock data into a readable string.
            
            Args:
                data: Stock data dictionary from get_stock_ohlc
                
            Returns:
                Formatted string with stock information
            """
            if "error" in data:
                return f"Error fetching data for {data.get('symbol', 'Unknown')}: {data['error']}"
            
            return f"""
    Stock Symbol: {data['symbol']}
    Date: {data['date']}
    Open: ${data['open']:.2f}
    High: ${data['high']:.2f}
    Low: ${data['low']:.2f}
    Close: ${data['close']:.2f}
    Volume: {data['volume']:,}
    VWAP: ${data['volume_weighted_average_price']:.2f}
    Transactions: {data['number_of_transactions']:,}
    """
Install Server

Other Tools

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/neeraj-somani/AIE8-MCP-S13'

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