Official SAHMK MCP server for Saudi market data in AI agents. Provides real-time and historical Saudi stock market (Tadawul) data for 350+ listed stocks.
Server provides 13 tools with consistent naming (verb_noun pattern: get_*, companies_list) and complete input schemas. All tools have descriptions (avg 95 chars, within 10-1024 range). However, descriptions are generic and lack LLM-optimization guidance (e.g., 'Get real-time price and market data' repeats across multiple tools without distinguishing when to use get_quote vs get_quotes). Parameter descriptions are minimal (e.g., 'Stock symbol (numeric or company name/alias)' lacks format constraints). Output schemas are not documented, LLMs cannot infer what fields to expect. Error handling is present but generic (ValueError, SahmkError) without recovery guidance. No tool annotations (readOnlyHint, destructiveHint). Composition is sound: tools are single-purpose and chainable (e.g., companies_list → get_financials). Security: API key injected via environment variable (correct pattern). Validation is present (date format, market enum normalization) but error messages could be more actionable.
Get a list of all available companies/stocks with their symbols and names.
Get detailed company information.
Get order-book depth (bid/ask ladder) for a stock. Requires exact exchange symbol.
Get dividend history for a stock. Requires exact exchange symbol.
Get AI stock event summaries (Pro+ subscription required).
Get financial statements and fundamentals for a stock. Requires exact exchange symbol.
Output schemas not documented. LLMs cannot infer what fields (price, change, volume, etc.) are returned by get_quote, get_market_summary, or other tools. This forces agents to guess field names for downstream processing.
Descriptions are generic and repetitive. 'Get real-time price and market data' appears in both get_quote and get_quotes without explaining when to use each. Descriptions lack LLM-optimization guidance (50-200 chars, actionable context).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Get historical price data for a stock. Requires exact exchange symbol.
Get top gainers, losers, and volume leaders in the market.
Get overall market summary data, optionally filtered by index (TASI or NOMU).
Get real-time price and market data for a single stock.
Get real-time price and market data for multiple stocks.
Get sector performance data.
Get recent live trade prints for a stock (Pro+ subscription required). Requires exact exchange symbol.
Parameter descriptions lack format constraints and validation rules. E.g., 'Stock symbol (numeric or company name/alias)' does not specify: numeric format (4 digits?), accepted name patterns, or what happens if ambiguous. Constraint descriptions should be explicit (e.g., '4-digit numeric symbol or exact company name; if ambiguous, returns candidates').
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All 13 tools are read-only, but this is not declared in the tool definition. Agents cannot infer safety properties without explicit annotations.
Error messages are generic (ValueError, SahmkError) without recovery guidance. E.g., ambiguity detection returns candidates but does not guide the agent to retry with a specific candidate. Error responses should state: 'Ambiguous identifier. Try one of: [candidates]. Call get_quote(identifier="<candidate>") to retry.'