{"serverId":"mcp-registry/ai.masnavi/masnavi","tools":[{"name":"explain","fixed":{"name":"explain","description":"Get commentary (Persian + English) for a specific beyt of the Masnavi, attributed to a primary source (e.g. Abdolkarim Soroush's lectures). Returns the beyt text along with structured commentary entries. Each entry has source, author, language, body markdown, and confidence ('ai-draft' / 'reviewed' / 'verbatim'). Use this when a user asks 'what does this beyt mean' or 'what does <scholar> say about M1:1'.","inputSchema":{"type":"object","title":"tool_explainArguments","required":["citation"],"properties":{"citation":{"type":"string","title":"Citation","description":"Citation like 'M1:1' or 'M3:1278' or 'g:7421'."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":183,"tokensAfter":183},{"name":"find_sections","fixed":{"name":"find_sections","description":"Find sections (stories) by TITLE. Exact words first (phrase, then AND-of-tokens); when NO title contains the words, falls back to MEANING matches in any language (hits carry match='meaning' + a cosine score — verify with get_section before relying on one). Each match includes `first_citation` and `last_citation` — ready-to-use canonical citations (e.g. 'M2:2608'). To read a whole multi-section story, call get_range with the FIRST match's `first_citation` as start and the LAST match's `last_citat","inputSchema":{"type":"object","title":"tool_find_sectionsArguments","required":["query"],"properties":{"limit":{"type":"integer","title":"Limit","default":30,"maximum":100,"minimum":1},"query":{"type":"string","title":"Query","description":"story title words (Persian) or a description of the story in any language"},"daftar":{"anyOf":[{"type":"integer","maximum":6,"minimum":1},{"type":"null"}],"title":"Daftar","default":null}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":271,"tokensAfter":271},{"name":"get_ghazal","fixed":{"name":"get_ghazal","description":"Fetch ONE complete ghazal of the Divan-e Shams by its canonical number (1..3230) or citation ('G1393' / 'G1393:2'). Returns every beyt plus prev/next ghazal numbers. Famous example: get_ghazal(1393) = «مرده بدم زنده شدم…».","inputSchema":{"type":"object","title":"tool_get_ghazalArguments","properties":{"number":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Number","default":null,"description":"Ghazal number, e.g. 1393"},"citation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citation","default":null,"description":"Divan citation like 'G1393' or 'G1393:2'"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":176,"tokensAfter":176},{"name":"get_range","fixed":{"name":"get_range","description":"Fetch ALL beyts between two endpoints, inclusive, grouped by section. Use this — NOT many calls to get_section or lookup — when a user asks for a full story, a long passage, or a sequence of beyts spanning multiple sections. Endpoints are canonical citations like 'M2:2608' and 'M2:2775', or global indices via start_global / end_global. Max range: 500 beyts.","inputSchema":{"type":"object","title":"tool_rangeArguments","properties":{"end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End","default":null,"description":"End citation, e.g. 'M2:2775'"},"start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start","default":null,"description":"Start citation, e.g. 'M2:2608'"},"end_global":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"End Global","default":null},"start_global":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Start Global","default":null}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":265,"tokensAfter":265},{"name":"get_section","fixed":{"name":"get_section","description":"Retrieve a full section (story / بخش) with all its beyts.","inputSchema":{"type":"object","title":"tool_get_sectionArguments","properties":{"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug","default":null,"description":"Stable URL slug"},"section_id":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Section Id","default":null}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":112,"tokensAfter":112},{"name":"lookup","fixed":{"name":"lookup","description":"Fetch a specific beyt by its citation (e.g. 'M3:1278'), by daftar+beyt number, or by global beyt index. Optionally include surrounding beyts for context.","inputSchema":{"type":"object","title":"tool_lookupArguments","properties":{"after":{"type":"integer","title":"After","default":0,"maximum":20,"minimum":0},"before":{"type":"integer","title":"Before","default":0,"maximum":20,"minimum":0},"daftar":{"anyOf":[{"type":"integer","maximum":6,"minimum":1},{"type":"null"}],"title":"Daftar","default":null},"citation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citation","default":null,"description":"Citation like 'M3:1278' or 'g:7421'"},"beyt_global":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Beyt Global","default":null},"beyt_in_daftar":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Beyt In Daftar","default":null}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":253,"tokensAfter":253},{"name":"search","fixed":{"name":"search","description":"Full-text search across the Masnavi. Returns beyts that contain the query terms, ranked by relevance. Useful for finding where a theme, word, or phrase appears.","inputSchema":{"type":"object","title":"tool_searchArguments","required":["query"],"properties":{"limit":{"type":"integer","title":"Limit","default":10,"maximum":50,"minimum":1},"query":{"type":"string","title":"Query","description":"Persian text to search for"},"daftar":{"anyOf":[{"type":"integer","maximum":6,"minimum":1},{"type":"null"}],"title":"Daftar","default":null,"description":"Restrict to a single daftar (1-6)"},"offset":{"type":"integer","title":"Offset","default":0,"minimum":0}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":192,"tokensAfter":192},{"name":"search_divan","fixed":{"name":"search_divan","description":"Full-text search across the 34,603 beyts of the ghazals of the Divan-e Shams (Divan-e Kabir) — Rumi's lyric work, distinct from the Masnavi. Returns beyts with divan citations (G{ghazal}:{beyt}, e.g. G1393:1). Use when you know the exact Persian words; use search_divan_meaning for a theme in any language.","inputSchema":{"type":"object","title":"tool_search_divanArguments","required":["query"],"properties":{"limit":{"type":"integer","title":"Limit","default":10,"maximum":50,"minimum":1},"query":{"type":"string","title":"Query","description":"Persian text to search for"},"offset":{"type":"integer","title":"Offset","default":0,"minimum":0}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":191,"tokensAfter":191},{"name":"search_divan_meaning","fixed":{"name":"search_divan_meaning","description":"Semantic search over the Divan-e Shams ghazals: given a theme, feeling, or idea in ANY language, returns the GHAZALS closest in meaning — each with its best-matching couplet as a preview and a cosine score. Both couplet-level and whole-ghazal vectors are searched, so a ghazal whose overall theme matches is found even when no single couplet does. Fetch a full ghazal with get_ghazal. status='unavailable' means the index is not built — fall back to search_divan.","inputSchema":{"type":"object","title":"tool_search_divan_meaningArguments","required":["query"],"properties":{"limit":{"type":"integer","title":"Limit","default":8,"maximum":30,"minimum":1},"query":{"type":"string","title":"Query","description":"What the ghazal should be ABOUT, in any language"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":226,"tokensAfter":226},{"name":"search_meaning","fixed":{"name":"search_meaning","description":"Semantic search: find the beyts closest in MEANING to the query, in ANY language — English, Persian, Spanish, Turkish, Arabic, … . Use this when you have a theme, feeling, or idea rather than exact Persian words (e.g. 'feeling separated from your origin' → M1:1). Each hit carries a cosine-similarity score. status='unavailable' means the vector index is not built yet — fall back to `search`.","inputSchema":{"type":"object","title":"tool_search_meaningArguments","required":["query"],"properties":{"limit":{"type":"integer","title":"Limit","default":10,"maximum":50,"minimum":1},"query":{"type":"string","title":"Query","description":"What the verse should MEAN, in any language"},"daftar":{"anyOf":[{"type":"integer","maximum":6,"minimum":1},{"type":"null"}],"title":"Daftar","default":null,"description":"Restrict to a single daftar (1-6)"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":247,"tokensAfter":247}],"toolsChanged":10,"tokensSaved":0,"todo":[{"tool":"find_sections","params":["limit","daftar"]},{"tool":"get_range","params":["end_global","start_global"]},{"tool":"get_section","params":["section_id"]},{"tool":"lookup","params":["after","before","daftar","beyt_global","beyt_in_daftar"]},{"tool":"random_beyt","params":["daftar"]},{"tool":"search","params":["limit","offset"]},{"tool":"search_divan","params":["limit","offset"]},{"tool":"search_divan_meaning","params":["limit"]},{"tool":"search_meaning","params":["limit"]},{"tool":"table_of_contents","params":["daftar"]},{"tool":"verify","params":["fuzzy_threshold"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}