MCP server providing access to the Shahnameh (Persian epic poetry) via API endpoints. Allows retrieval of chapters, verses, and explanations with search capabilities.
The server provides 6 READ_ONLY tools for querying the Shahnameh Persian epic. While all tools have descriptions and basic input schemas, there are significant quality gaps: (1) Parameter descriptions are minimal and lack detail about format/constraints; (2) Output schemas are completely undocumented, the code returns `Any` type with no schema specification; (3) Error handling is generic (returns plain text strings like 'Unable to fetch chapters or no chapters found' with no recovery guidance); (4) No pagination support despite tools that could return large result sets (get_chapters, list_verses_by_substrings); (5) Tool descriptions lack WHEN/WHY context for LLM selection; (6) No optional parameter validation or format constraints; (7) Descriptions present but below production baseline of 194 chars average. Tool naming is reasonable (get_*, list_*, search_*) but descriptions fail to meet the 'what, when, why' pattern expected for production tools.
Get a specific chapter of Shahnameh by its ID. Args: id: The id of the chapter to retrieve Persian explanation: هر بخش از شاهنامه یک شناسه یکتا دارد که با آن می توان بخش مورد نظر را دریافت کرد
Get all chapters of Shahnameh with their sub-chapters if exist. Args: title: If provided, filters chapters by title Persian explanation: شاهنامه فردوسی از بخش های مختلفی تشکیل شده است. اگر بخشی والد نداشت یعنی جزو بخش های اصلی کتاب است. هر بخش اصلی می تواند شامل زیر بخش هایی باشد می توان بخش ها را با عنوان آنها جستجو کرد
Get a specific verse of Shahnameh by its ID. Args: id: The id of the verse to retrieve Persian explanation: هر بیت از شاهنامه یک شناسه یکتا دارد که با آن می توان بیت مورد نظر را دریافت کرد
List all verses of a specific chapter in the Shahnameh. Args: chapter_id: The id of the chapter to retrieve verses for Persian explanation: هر بخش از شاهنامه شامل چندین بیت است. این متد تمام بیت های یک بخش را بر می گرداند.
List all verses containing all of the specified substrings. Args: Filter verses by substrings (at least one required) Persian explanation: می توان بیت های شاهنامه را با زیر رشته هایی که در آنها وجود دارد فیلتر کرد. این متد تمام بیت هایی که شامل تمام زیر رشته های داده شده باشد را بر می گرداند.
Output schemas completely undocumented. All 6 tools return `Any` type with no schema specification. LLMs cannot plan downstream operations or extract data without knowing what fields to expect.
Parameter descriptions lack detail and constraints. 'id' parameter in get_chapter_by_id has description 'The id of the chapter to retrieve' but no guidance on format, length, or example. 'query' parameter in search_explanations lacks constraint detail.
No pagination support for tools returning potentially large result sets. get_chapters, list_chapter_verses, and list_verses_by_substrings can return many items but lack limit/offset/page_size parameters. Could exhaust context window.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 42 | 2026-07-28+ | v2 |
Search for explanations of the Shahnameh's chapters as vector embeddings. Each chapter might have multiple explanations and this method embeds the given query, to search for relevant explanations. Args: query: The query string to search for explanations Persian explanation: هر بخش از شاهنامه درای یک یا چند توضیح به زبان پارسی و با حالت فارسی مدرن دارد که به صورت امبدینگ در دیتابیس ذخیره شده است. متد حاضر یک رشته را به امبدینگ تبدیل میکند و به دنبال نزدیک ترین توضیحات می گردد و آن را باز می گرداند.
Error handling provides no recovery guidance. Generic error strings like 'Unable to fetch chapters or no chapters found' tell the LLM nothing about what to do next. Should indicate retry eligibility, alternative approaches, or required user action.
Tool descriptions lack WHEN/WHY context. Descriptions state WHAT each tool does but don't explain when to call it instead of similar tools, or what prerequisites apply. Example: search_explanations describes vector embedding search but doesn't explain when to use it vs get_chapter_by_id.
No validation or format constraints on parameters. Optional parameters (title, id, query) have no validation logic. make_http_request() catches all exceptions silently, returning None without distinguishing 404 (not found) from 500 (server error) or timeout.