MCP server for Praesentire — bilingual financial news sentiment (English + Traditional Chinese) as a Claude tool.
Three well-named tools with strong, detailed descriptions (194 - 380 chars each) that explain WHAT, WHEN, and WHY. Input schemas are complete with proper JSON Schema types, constraints (min/max, minItems/maxItems), and defaults. All parameters have descriptions. However, output schemas are NOT documented, LLMs cannot see what fields to expect in responses, forcing them to guess downstream field names. Error handling is present (McpError with ErrorCode) but lacks recovery guidance (e.g., 'Try a different ticker' or 'Check API key'). No tool annotations (readOnlyHint, idempotentHint) despite all three being read-only operations.
Compare English vs Traditional Chinese news sentiment for a ticker side-by-side, plus a divergence score. Designed for cross-market arbitrage signal detection — US press (Reuters/Bloomberg) often leads Taiwan/Asia press by hours. A large divergence (|divergence| > 0.3) often precedes mood shifts on Asia-listed semis or US names with strong TW supply chain exposure. Returns: english + chinese aggregates (article_count, average_score, confidence, distribution) and `divergence` = english.average_score - chinese.average_score. Positive divergence = English more bullish; negative = Chinese more bullish.
Get aggregated financial news sentiment for a single stock ticker over a rolling time window. Returns an -1 to +1 average score, confidence, article count, bullish/neutral/bearish distribution, and up to 3 latest articles with one-line rationale each. Sources: Reuters, Bloomberg, Yahoo Finance (English) + 經濟日報, 工商時報, Anue 鉅亨 (Traditional Chinese). Useful for: gauging market mood before opening a position, monitoring sentiment shifts post-earnings, explaining unusual price moves with news context.
Get sentiment for multiple tickers in one call. More efficient than calling get_sentiment N times when you have a watchlist. Each ticker counts as one request against the daily rate limit (so 10 tickers = 10 requests billed). latest_3 articles are omitted from each result to keep the response small — call get_sentiment for the full payload on any specific ticker.
Output schemas not documented. Tool descriptions mention return fields (average_score, confidence, article_count, distribution, latest_3, divergence) but no formal schema is provided. LLMs cannot plan downstream field extraction or validate responses.
Error messages lack recovery guidance. McpError responses (e.g., 401, 429, 400) state the problem but do not guide the LLM on next steps. E.g., '401 invalid key' should say 'Create a new key at https://praesentire.com/dashboard and update PRAESENTIRE_API_KEY.'
No tool annotations. All three tools are read-only (no side effects), but inputSchema lacks readOnlyHint annotation. This prevents clients from optimizing caching or parallelization.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Batch tool omits latest_3 articles to 'keep response small' but does not document the response structure. LLMs cannot know which fields differ between get_sentiment and get_sentiment_batch responses.
Parameter descriptions include example values ('e.g. NVDA, TSM, AAPL') which LLMs may reuse literally. Use enum constraints or regex patterns instead.