MCP server for Pakistan Stock Exchange data scraping
The PSX Data Scraper server provides 12 read-only financial tools with consistent naming and moderate description quality. However, it has critical gaps in parameter descriptions, output schema documentation, and error handling. Tool names follow verb_noun convention (e.g., get_market_data, search_by_sector) which is good, but parameter documentation is sparse. Most tools lack explicit descriptions of what data fields are returned, making it difficult for LLMs to compose downstream tool calls. No per-tool error recovery guidance is visible. The descriptions are adequate in length (100-250 chars) but lack actionable context for when to use each tool versus alternatives.
Get end-of-day data for a specific stock within a date range. Args: symbol: Stock symbol (e.g., 'HBL', 'OGDC', 'PTC') start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format Returns: JSON string containing EOD data within the specified date range
Get top gaining stocks from market watch data. Args: limit: Number of top gainers to return (default: 10) Returns: JSON string containing top gaining stocks sorted by change percentage
Get end-of-day time series data for a specific stock (past 5 years). Args: symbol: Stock symbol (e.g., 'HBL', 'OGDC', 'PTC') Returns: JSON string containing EOD data points with: - Unix timestamp - Close price - Volume traded - Open price
Get intraday time series data for a specific stock. Args: symbol: Stock symbol (e.g., 'HBL', 'OGDC', 'PTC') Returns: JSON string containing intraday data points with: - Unix timestamp - Price at that time - Volume traded
Get top losing stocks from market watch data. Args: limit: Number of top losers to return (default: 10) Returns: JSON string containing top losing stocks sorted by change percentage
Output schemas are not documented. Tool descriptions state 'Returns JSON string containing...' but do not specify the actual field names, types, or structure. LLMs cannot plan multi-step workflows or extract required IDs for chaining without knowing output schema.
Parameter descriptions lack formatting constraints and valid value ranges. For example, 'symbol' is described as 'Stock symbol (e.g., HBL, OGDC, PTC)' but does not specify: case sensitivity, valid length, whether lowercase is accepted, or how to discover valid symbols. The 'limit' parameter has no min/max bounds, LLMs could pass 1000000.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 47 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 35 | - | v1 |
Get current market watch data for all stocks listed on PSX. Returns: JSON string containing market data for all stocks including: - Symbol, Sector, Listed In, LDCP, Open, High, Low, Current prices - Change amount and percentage - Volume traded
Get OHLCV data for multiple stocks at once. Args: symbols: Comma-separated list of stock symbols (e.g., 'HBL,OGDC,PTC') Returns: JSON string containing OHLCV data for all requested stocks
Get OHLCV (Open, High, Low, Close, Volume) data for a specific stock. Args: symbol: Stock symbol (e.g., 'HBL', 'OGDC', 'PTC') Returns: JSON string containing OHLCV data from market watch
Get the closest price data for a stock at a specific timestamp. Args: symbol: Stock symbol (e.g., 'HBL', 'OGDC', 'PTC') timestamp: Unix timestamp to find closest price for Returns: JSON string containing the closest price data point
Search for stocks by sector from the market watch data. Args: sector: Sector name to search for (e.g., 'Banking', 'Technology', 'Energy') Returns: JSON string containing all stocks in the specified sector
Get intraday data for a specific stock within a time range. Args: symbol: Stock symbol (e.g., 'HBL', 'OGDC', 'PTC') start_time: Start time in YYYY-MM-DD HH:MM:SS format end_time: End time in YYYY-MM-DD HH:MM:SS format Returns: JSON string containing intraday data within the specified time range
Analyze volume patterns for a stock over a specified number of days. Args: symbol: Stock symbol (e.g., 'HBL', 'OGDC', 'PTC') days: Number of days to analyze (default: 30) Returns: JSON string containing volume analysis statistics
No pagination or result-limiting guidance in descriptions. Tools like 'market_data' and 'sector' could return large datasets but do not mention limits or pagination support. Per pattern baseline, tools should cap results at 20 - 50 items and support offset/limit parameters.
No error recovery guidance. Descriptions do not explain what errors might occur (invalid symbol, no data for date range) or how to recover. LLMs receive failures with no context for next steps.
Redundant or overlapping tools reduce clarity. 'intraday' and 'time_range' both return intraday data, differing only in filtering scope. 'history' and 'date_range' have the same issue. This forces LLMs to reason about which to use. Consider consolidating: 'get_intraday(symbol, start_time=optional, end_time=optional)' covers both.
Date/time parameter formats are documented as strings (YYYY-MM-DD, YYYY-MM-DD HH:MM:SS) but no validation or error message is described. If an LLM passes '2024-13-45' or uses a different locale, there is no guidance on the error or how to correct it.