masnavi

Rumi's complete Masnavi (25,635 beyts) — search, quote, verify and explain. Free, no auth.

Should I use this

Quality & Safety

A
Description quality
93%
Schema completeness
74%
Naming quality
94%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'random_beyt' description lacks action verbin random_beyt

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~6,395Tokens (tool definitions)
~4.4 KBTypical response size
Significant attention impact (5.00% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "masnavi": {
      "url": "https://masnavi.ai/mcp"
    }
  }
}

Remote endpoints

https://masnavi.ai/mcpstreamable-http

What it can do

Tool inventory

Tools (13)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢search(query, daftar, limit, offset)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Persian text to search for",
      "title": "Query",
      "type": "string"
    },
    "daftar": {
      "anyOf": [
        {
          "maximum": 6,
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Restrict to a single daftar (1-6)",
      "title": "Daftar"
    },
    "limit": {
      "default": 10,
      "maximum": 50,
      "minimum": 1,
      "title": "Limit",
      "type": "integer"
    },
    "offset": {
      "default": 0,
      "minimum": 0,
      "title": "Offset",
      "type": "integer"
    }
  },
  "required": [
    "query"
  ],
  "title": "tool_searchArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "query": {
      "title": "Query",
      "type": "string"
    },
    "total": {
      "title": "Total",
      "type": "integer"
    },
    "results": {
      "items": {
        "$ref": "#/$defs/SearchHit"
      },
      "title": "Results",
      "type": "array"
    },
    "match": {
      "default": "exact",
      "title": "Match",
      "type": "string"
    }
  },
  "required": [
    "query",
    "total",
    "results"
  ],
  "$defs": {
    "SearchHit": {
      "properties": {
        "citation": {
          "description": "Canonical citation, e.g. 'M3:1278'",
          "title": "Citation",
          "type": "string"
        },
        "daftar": {
          "title": "Daftar",
          "type": "integer"
        },
        "beyt_in_daftar": {
          "title": "Beyt In Daftar",
          "type": "integer"
        },
        "beyt_global": {
          "title": "Beyt Global",
          "type": "integer"
        },
        "mesra1": {
          "description": "First hemistich (with diacritics)",
          "title": "Mesra1",
          "type": "string"
        },
        "mesra2": {
          "description": "Second hemistich",
          "title": "Mesra2",
          "type": "string"
        },
        "section_id": {
          "title": "Section Id",
          "type": "integer"
        },
        "section_title": {
          "title": "Section Title",
          "type": "string"
        },
        "section_slug": {
          "title": "Section Slug",
          "type": "string"
        },
        "rank": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Rank"
        }
      },
      "required": [
        "citation",
        "daftar",
        "beyt_in_daftar",
        "beyt_global",
        "mesra1",
        "mesra2",
        "section_id",
        "section_title",
        "section_slug"
      ],
      "title": "SearchHit",
      "type": "object"
    }
  },
  "title": "SearchResponse"
}
🟢search_meaning(query, daftar, limit)

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`.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "description": "What the verse should MEAN, in any language",
      "title": "Query",
      "type": "string"
    },
    "daftar": {
      "anyOf": [
        {
          "maximum": 6,
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Restrict to a single daftar (1-6)",
      "title": "Daftar"
    },
    "limit": {
      "default": 10,
      "maximum": 50,
      "minimum": 1,
      "title": "Limit",
      "type": "integer"
    }
  },
  "required": [
    "query"
  ],
  "title": "tool_search_meaningArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "query": {
      "title": "Query",
      "type": "string"
    },
    "status": {
      "default": "ok",
      "description": "'ok' | 'unavailable' (index not built / no key) | 'error'",
      "title": "Status",
      "type": "string"
    },
    "total_indexed": {
      "default": 0,
      "title": "Total Indexed",
      "type": "integer"
    },
    "results": {
      "default": [],
      "items": {
        "$ref": "#/$defs/MeaningHit"
      },
      "title": "Results",
      "type": "array"
    },
    "note": {
      "default": "",
      "title": "Note",
      "type": "string"
    }
  },
  "required": [
    "query"
  ],
  "$defs": {
    "MeaningHit": {
      "properties": {
        "citation": {
          "description": "Canonical citation, e.g. 'M3:1278'",
          "title": "Citation",
          "type": "string"
        },
        "daftar": {
          "title": "Daftar",
          "type": "integer"
        },
        "beyt_in_daftar": {
          "title": "Beyt In Daftar",
          "type": "integer"
        },
        "beyt_global": {
          "title": "Beyt Global",
          "type": "integer"
        },
        "mesra1": {
          "description": "First hemistich (with diacritics)",
          "title": "Mesra1",
          "type": "string"
        },
        "mesra2": {
          "description": "Second hemistich",
          "title": "Mesra2",
          "type": "string"
        },
        "section_id": {
          "title": "Section Id",
          "type": "integer"
        },
        "section_title": {
          "title": "Section Title",
          "type": "string"
        },
        "section_slug": {
          "title": "Section Slug",
          "type": "string"
        },
        "score": {
          "description": "Cosine similarity between query and beyt, 0..1",
          "title": "Score",
          "type": "number"
        }
      },
      "required": [
        "citation",
        "daftar",
        "beyt_in_daftar",
        "beyt_global",
        "mesra1",
        "mesra2",
        "section_id",
        "section_title",
        "section_slug",
        "score"
      ],
      "title": "MeaningHit",
      "type": "object"
    }
  },
  "title": "MeaningSearchResponse"
}
🟢lookup(citation, daftar, beyt_in_daftar, beyt_global, before, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "citation": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Citation like 'M3:1278' or 'g:7421'",
      "title": "Citation"
    },
    "daftar": {
      "anyOf": [
        {
          "maximum": 6,
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Daftar"
    },
    "beyt_in_daftar": {
      "anyOf": [
        {
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Beyt In Daftar"
    },
    "beyt_global": {
      "anyOf": [
        {
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Beyt Global"
    },
    "before": {
      "default": 0,
      "maximum": 20,
      "minimum": 0,
      "title": "Before",
      "type": "integer"
    },
    "after": {
      "default": 0,
      "maximum": 20,
      "minimum": 0,
      "title": "After",
      "type": "integer"
    }
  },
  "title": "tool_lookupArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "primary": {
      "$ref": "#/$defs/Beyt"
    },
    "context_before": {
      "default": [],
      "items": {
        "$ref": "#/$defs/Beyt"
      },
      "title": "Context Before",
      "type": "array"
    },
    "context_after": {
      "default": [],
      "items": {
        "$ref": "#/$defs/Beyt"
      },
      "title": "Context After",
      "type": "array"
    }
  },
  "required": [
    "primary"
  ],
  "$defs": {
    "Beyt": {
      "properties": {
        "citation": {
          "description": "Canonical citation, e.g. 'M3:1278'",
          "title": "Citation",
          "type": "string"
        },
        "daftar": {
          "title": "Daftar",
          "type": "integer"
        },
        "beyt_in_daftar": {
          "title": "Beyt In Daftar",
          "type": "integer"
        },
        "beyt_global": {
          "title": "Beyt Global",
          "type": "integer"
        },
        "mesra1": {
          "description": "First hemistich (with diacritics)",
          "title": "Mesra1",
          "type": "string"
        },
        "mesra2": {
          "description": "Second hemistich",
          "title": "Mesra2",
          "type": "string"
        },
        "section_id": {
          "title": "Section Id",
          "type": "integer"
        },
        "section_title": {
          "title": "Section Title",
          "type": "string"
        },
        "section_slug": {
          "title": "Section Slug",
          "type": "string"
        }
      },
      "required": [
        "citation",
        "daftar",
        "beyt_in_daftar",
        "beyt_global",
        "mesra1",
        "mesra2",
        "section_id",
        "section_title",
        "section_slug"
      ],
      "title": "Beyt",
      "type": "object"
    }
  },
  "title": "LookupResponse"
}
🟢verify(text, fuzzy_threshold)

Given a candidate quote attributed to Rumi's Masnavi, check whether it actually appears. Returns status='exact' (with citation), 'fuzzy' (with similar candidates), or 'not_found'. USE THIS BEFORE QUOTING RUMI to avoid hallucination.

Input Schema

{
  "type": "object",
  "properties": {
    "text": {
      "description": "Candidate Rumi quote in Persian",
      "title": "Text",
      "type": "string"
    },
    "fuzzy_threshold": {
      "default": 0.82,
      "maximum": 1,
      "minimum": 0.5,
      "title": "Fuzzy Threshold",
      "type": "number"
    }
  },
  "required": [
    "text"
  ],
  "title": "tool_verifyArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "status": {
      "description": "'exact', 'fuzzy', or 'not_found'",
      "title": "Status",
      "type": "string"
    },
    "matches": {
      "default": [],
      "items": {
        "$ref": "#/$defs/VerifyMatch"
      },
      "title": "Matches",
      "type": "array"
    },
    "notes": {
      "default": "",
      "title": "Notes",
      "type": "string"
    },
    "query_normalized": {
      "default": "",
      "title": "Query Normalized",
      "type": "string"
    }
  },
  "required": [
    "status"
  ],
  "$defs": {
    "VerifyMatch": {
      "properties": {
        "citation": {
          "title": "Citation",
          "type": "string"
        },
        "mesra1": {
          "title": "Mesra1",
          "type": "string"
        },
        "mesra2": {
          "title": "Mesra2",
          "type": "string"
        },
        "similarity": {
          "title": "Similarity",
          "type": "number"
        },
        "match_kind": {
          "description": "'exact' or 'fuzzy'",
          "title": "Match Kind",
          "type": "string"
        }
      },
      "required": [
        "citation",
        "mesra1",
        "mesra2",
        "similarity",
        "match_kind"
      ],
      "title": "VerifyMatch",
      "type": "object"
    }
  },
  "title": "VerifyResponse"
}
🟢get_section(section_id, slug)

Retrieve a full section (story / بخش) with all its beyts.

Input Schema

{
  "type": "object",
  "properties": {
    "section_id": {
      "anyOf": [
        {
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Section Id"
    },
    "slug": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Stable URL slug",
      "title": "Slug"
    }
  },
  "title": "tool_get_sectionArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "id": {
      "title": "Id",
      "type": "integer"
    },
    "slug": {
      "title": "Slug",
      "type": "string"
    },
    "title_fa": {
      "title": "Title Fa",
      "type": "string"
    },
    "daftar": {
      "title": "Daftar",
      "type": "integer"
    },
    "first_beyt_global": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "First Beyt Global"
    },
    "last_beyt_global": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Last Beyt Global"
    },
    "beyt_count": {
      "default": 0,
      "title": "Beyt Count",
      "type": "integer"
    },
    "beyts": {
      "default": [],
      "items": {
        "$ref": "#/$defs/Beyt"
      },
      "title": "Beyts",
      "type": "array"
    }
  },
  "required": [
    "id",
    "slug",
    "title_fa",
    "daftar"
  ],
  "$defs": {
    "Beyt": {
      "properties": {
        "citation": {
          "description": "Canonical citation, e.g. 'M3:1278'",
          "title": "Citation",
          "type": "string"
        },
        "daftar": {
          "title": "Daftar",
          "type": "integer"
        },
        "beyt_in_daftar": {
          "title": "Beyt In Daftar",
          "type": "integer"
        },
        "beyt_global": {
          "title": "Beyt Global",
          "type": "integer"
        },
        "mesra1": {
          "description": "First hemistich (with diacritics)",
          "title": "Mesra1",
          "type": "string"
        },
        "mesra2": {
          "description": "Second hemistich",
          "title": "Mesra2",
          "type": "string"
        },
        "section_id": {
          "title": "Section Id",
          "type": "integer"
        },
        "section_title": {
          "title": "Section Title",
          "type": "string"
        },
        "section_slug": {
          "title": "Section Slug",
          "type": "string"
        }
      },
      "required": [
        "citation",
        "daftar",
        "beyt_in_daftar",
        "beyt_global",
        "mesra1",
        "mesra2",
        "section_id",
        "section_title",
        "section_slug"
      ],
      "title": "Beyt",
      "type": "object"
    }
  },
  "title": "SectionDetail"
}
⚪table_of_contents(daftar)

Browse the Masnavi's section list. Returns titled sections per daftar with beyt counts and ranges.

Input Schema

{
  "type": "object",
  "properties": {
    "daftar": {
      "anyOf": [
        {
          "maximum": 6,
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Daftar"
    }
  },
  "title": "tool_tocArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "daftar": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Daftar"
    },
    "nodes": {
      "items": {
        "$ref": "#/$defs/TocNode"
      },
      "title": "Nodes",
      "type": "array"
    }
  },
  "required": [
    "nodes"
  ],
  "$defs": {
    "TocNode": {
      "properties": {
        "id": {
          "title": "Id",
          "type": "integer"
        },
        "slug": {
          "title": "Slug",
          "type": "string"
        },
        "title_fa": {
          "title": "Title Fa",
          "type": "string"
        },
        "daftar": {
          "title": "Daftar",
          "type": "integer"
        },
        "first_beyt_global": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "First Beyt Global"
        },
        "last_beyt_global": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Last Beyt Global"
        },
        "beyt_count": {
          "default": 0,
          "title": "Beyt Count",
          "type": "integer"
        },
        "children": {
          "default": [],
          "items": {
            "$ref": "#/$defs/TocNode"
          },
          "title": "Children",
          "type": "array"
        }
      },
      "required": [
        "id",
        "slug",
        "title_fa",
        "daftar"
      ],
      "title": "TocNode",
      "type": "object"
    }
  },
  "title": "TocResponse"
}
⚪random_beyt(daftar)

Return a randomly-selected beyt, optionally restricted to a daftar.

Input Schema

{
  "type": "object",
  "properties": {
    "daftar": {
      "anyOf": [
        {
          "maximum": 6,
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Daftar"
    }
  },
  "title": "tool_randomArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "citation": {
      "description": "Canonical citation, e.g. 'M3:1278'",
      "title": "Citation",
      "type": "string"
    },
    "daftar": {
      "title": "Daftar",
      "type": "integer"
    },
    "beyt_in_daftar": {
      "title": "Beyt In Daftar",
      "type": "integer"
    },
    "beyt_global": {
      "title": "Beyt Global",
      "type": "integer"
    },
    "mesra1": {
      "description": "First hemistich (with diacritics)",
      "title": "Mesra1",
      "type": "string"
    },
    "mesra2": {
      "description": "Second hemistich",
      "title": "Mesra2",
      "type": "string"
    },
    "section_id": {
      "title": "Section Id",
      "type": "integer"
    },
    "section_title": {
      "title": "Section Title",
      "type": "string"
    },
    "section_slug": {
      "title": "Section Slug",
      "type": "string"
    }
  },
  "required": [
    "citation",
    "daftar",
    "beyt_in_daftar",
    "beyt_global",
    "mesra1",
    "mesra2",
    "section_id",
    "section_title",
    "section_slug"
  ],
  "title": "Beyt"
}
🟢get_range(start, end, start_global, end_global)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "start": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Start citation, e.g. 'M2:2608'",
      "title": "Start"
    },
    "end": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "End citation, e.g. 'M2:2775'",
      "title": "End"
    },
    "start_global": {
      "anyOf": [
        {
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Start Global"
    },
    "end_global": {
      "anyOf": [
        {
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "End Global"
    }
  },
  "title": "tool_rangeArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "start_citation": {
      "title": "Start Citation",
      "type": "string"
    },
    "end_citation": {
      "title": "End Citation",
      "type": "string"
    },
    "total_beyts": {
      "title": "Total Beyts",
      "type": "integer"
    },
    "total_sections": {
      "title": "Total Sections",
      "type": "integer"
    },
    "sections": {
      "default": [],
      "items": {
        "$ref": "#/$defs/RangeSection"
      },
      "title": "Sections",
      "type": "array"
    }
  },
  "required": [
    "start_citation",
    "end_citation",
    "total_beyts",
    "total_sections"
  ],
  "$defs": {
    "Beyt": {
      "properties": {
        "citation": {
          "description": "Canonical citation, e.g. 'M3:1278'",
          "title": "Citation",
          "type": "string"
        },
        "daftar": {
          "title": "Daftar",
          "type": "integer"
        },
        "beyt_in_daftar": {
          "title": "Beyt In Daftar",
          "type": "integer"
        },
        "beyt_global": {
          "title": "Beyt Global",
          "type": "integer"
        },
        "mesra1": {
          "description": "First hemistich (with diacritics)",
          "title": "Mesra1",
          "type": "string"
        },
        "mesra2": {
          "description": "Second hemistich",
          "title": "Mesra2",
          "type": "string"
        },
        "section_id": {
          "title": "Section Id",
          "type": "integer"
        },
        "section_title": {
          "title": "Section Title",
          "type": "string"
        },
        "section_slug": {
          "title": "Section Slug",
          "type": "string"
        }
      },
      "required": [
        "citation",
        "daftar",
        "beyt_in_daftar",
        "beyt_global",
        "mesra1",
        "mesra2",
        "section_id",
        "section_title",
        "section_slug"
      ],
      "title": "Beyt",
      "type": "object"
    },
    "RangeSection": {
      "properties": {
        "section_id": {
          "title": "Section Id",
          "type": "integer"
        },
        "slug": {
          "title": "Slug",
          "type": "string"
        },
        "title_fa": {
          "title": "Title Fa",
          "type": "string"
        },
        "daftar": {
          "title": "Daftar",
          "type": "integer"
        },
        "order_in_parent": {
          "title": "Order In Parent",
          "type": "integer"
        },
        "beyts": {
          "default": [],
          "items": {
            "$ref": "#/$defs/Beyt"
          },
          "title": "Beyts",
          "type": "array"
        }
      },
      "required": [
        "section_id",
        "slug",
        "title_fa",
        "daftar",
        "order_in_parent"
      ],
      "title": "RangeSection",
      "type": "object"
    }
  },
  "title": "RangeResponse"
}
🟢find_sections(query, daftar, limit)

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_citation` as end. Do NOT construct a citation from `first_beyt_global` — that is a GLOBAL index (1..25635), not a daftar-local beyt number. Example: find_sections('ابلیس معاویه', daftar=2).

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "description": "story title words (Persian) or a description of the story in any language",
      "title": "Query",
      "type": "string"
    },
    "daftar": {
      "anyOf": [
        {
          "maximum": 6,
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Daftar"
    },
    "limit": {
      "default": 30,
      "maximum": 100,
      "minimum": 1,
      "title": "Limit",
      "type": "integer"
    }
  },
  "required": [
    "query"
  ],
  "title": "tool_find_sectionsArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "query": {
      "title": "Query",
      "type": "string"
    },
    "total": {
      "title": "Total",
      "type": "integer"
    },
    "sections": {
      "default": [],
      "items": {
        "$ref": "#/$defs/SectionMatch"
      },
      "title": "Sections",
      "type": "array"
    },
    "note": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Note"
    }
  },
  "required": [
    "query",
    "total"
  ],
  "$defs": {
    "SectionMatch": {
      "properties": {
        "id": {
          "title": "Id",
          "type": "integer"
        },
        "slug": {
          "title": "Slug",
          "type": "string"
        },
        "title_fa": {
          "title": "Title Fa",
          "type": "string"
        },
        "daftar": {
          "title": "Daftar",
          "type": "integer"
        },
        "order_in_parent": {
          "title": "Order In Parent",
          "type": "integer"
        },
        "first_beyt_global": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "First Beyt Global"
        },
        "last_beyt_global": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Last Beyt Global"
        },
        "first_citation": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "First Citation"
        },
        "last_citation": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Last Citation"
        },
        "beyt_count": {
          "default": 0,
          "title": "Beyt Count",
          "type": "integer"
        },
        "match": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Match"
        },
        "score": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Score"
        }
      },
      "required": [
        "id",
        "slug",
        "title_fa",
        "daftar",
        "order_in_parent"
      ],
      "title": "SectionMatch",
      "type": "object"
    }
  },
  "title": "FindSectionsResponse"
}
🟢explain(citation)

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'.

Input Schema

{
  "type": "object",
  "properties": {
    "citation": {
      "description": "Citation like 'M1:1' or 'M3:1278' or 'g:7421'.",
      "title": "Citation",
      "type": "string"
    }
  },
  "required": [
    "citation"
  ],
  "title": "tool_explainArguments"
}
🟢search_divan(query, limit, offset)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Persian text to search for",
      "title": "Query",
      "type": "string"
    },
    "limit": {
      "default": 10,
      "maximum": 50,
      "minimum": 1,
      "title": "Limit",
      "type": "integer"
    },
    "offset": {
      "default": 0,
      "minimum": 0,
      "title": "Offset",
      "type": "integer"
    }
  },
  "required": [
    "query"
  ],
  "title": "tool_search_divanArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "query": {
      "title": "Query",
      "type": "string"
    },
    "total": {
      "title": "Total",
      "type": "integer"
    },
    "results": {
      "items": {
        "$ref": "#/$defs/DivanSearchHit"
      },
      "title": "Results",
      "type": "array"
    },
    "match": {
      "default": "exact",
      "title": "Match",
      "type": "string"
    }
  },
  "required": [
    "query",
    "total",
    "results"
  ],
  "$defs": {
    "DivanSearchHit": {
      "properties": {
        "citation": {
          "description": "Canonical divan citation, e.g. 'G1393:1'",
          "title": "Citation",
          "type": "string"
        },
        "ghazal": {
          "title": "Ghazal",
          "type": "integer"
        },
        "beyt_in_ghazal": {
          "title": "Beyt In Ghazal",
          "type": "integer"
        },
        "mesra1": {
          "title": "Mesra1",
          "type": "string"
        },
        "mesra2": {
          "title": "Mesra2",
          "type": "string"
        },
        "ghazal_title": {
          "title": "Ghazal Title",
          "type": "string"
        },
        "rank": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Rank"
        }
      },
      "required": [
        "citation",
        "ghazal",
        "beyt_in_ghazal",
        "mesra1",
        "mesra2",
        "ghazal_title"
      ],
      "title": "DivanSearchHit",
      "type": "object"
    }
  },
  "title": "DivanSearchResponse"
}
🟢search_divan_meaning(query, limit)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "description": "What the ghazal should be ABOUT, in any language",
      "title": "Query",
      "type": "string"
    },
    "limit": {
      "default": 8,
      "maximum": 30,
      "minimum": 1,
      "title": "Limit",
      "type": "integer"
    }
  },
  "required": [
    "query"
  ],
  "title": "tool_search_divan_meaningArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "query": {
      "title": "Query",
      "type": "string"
    },
    "status": {
      "default": "ok",
      "title": "Status",
      "type": "string"
    },
    "total_indexed_beyts": {
      "default": 0,
      "title": "Total Indexed Beyts",
      "type": "integer"
    },
    "total_indexed_ghazals": {
      "default": 0,
      "title": "Total Indexed Ghazals",
      "type": "integer"
    },
    "results": {
      "default": [],
      "items": {
        "$ref": "#/$defs/DivanMeaningHit"
      },
      "title": "Results",
      "type": "array"
    },
    "note": {
      "default": "",
      "title": "Note",
      "type": "string"
    }
  },
  "required": [
    "query"
  ],
  "$defs": {
    "DivanMeaningHit": {
      "properties": {
        "ghazal": {
          "title": "Ghazal",
          "type": "integer"
        },
        "citation": {
          "title": "Citation",
          "type": "string"
        },
        "slug": {
          "title": "Slug",
          "type": "string"
        },
        "title_fa": {
          "title": "Title Fa",
          "type": "string"
        },
        "beyt_count": {
          "title": "Beyt Count",
          "type": "integer"
        },
        "score": {
          "description": "Best cosine similarity for this ghazal, 0..1",
          "title": "Score",
          "type": "number"
        },
        "match_kind": {
          "description": "'beyt' (a couplet matched), 'ghazal' (the whole ghazal's theme matched), or 'both'",
          "title": "Match Kind",
          "type": "string"
        },
        "best_beyt": {
          "anyOf": [
            {
              "$ref": "#/$defs/GhazalBeyt"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "best_beyt_score": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Best Beyt Score"
        }
      },
      "required": [
        "ghazal",
        "citation",
        "slug",
        "title_fa",
        "beyt_count",
        "score",
        "match_kind"
      ],
      "title": "DivanMeaningHit",
      "type": "object"
    },
    "GhazalBeyt": {
      "properties": {
        "citation": {
          "description": "Canonical divan citation, e.g. 'G1393:1'",
          "title": "Citation",
          "type": "string"
        },
        "ghazal": {
          "title": "Ghazal",
          "type": "integer"
        },
        "beyt_in_ghazal": {
          "title": "Beyt In Ghazal",
          "type": "integer"
        },
        "mesra1": {
          "title": "Mesra1",
          "type": "string"
        },
        "mesra2": {
          "title": "Mesra2",
          "type": "string"
        }
      },
      "required": [
        "citation",
        "ghazal",
        "beyt_in_ghazal",
        "mesra1",
        "mesra2"
      ],
      "title": "GhazalBeyt",
      "type": "object"
    }
  },
  "title": "DivanMeaningResponse"
}
🟢get_ghazal(number, citation)

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) = «مرده بدم زنده شدم…».

Input Schema

{
  "type": "object",
  "properties": {
    "number": {
      "anyOf": [
        {
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Ghazal number, e.g. 1393",
      "title": "Number"
    },
    "citation": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Divan citation like 'G1393' or 'G1393:2'",
      "title": "Citation"
    }
  },
  "title": "tool_get_ghazalArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "ghazal": {
      "description": "Canonical ghazal number, 1..3230",
      "title": "Ghazal",
      "type": "integer"
    },
    "citation": {
      "description": "'G{n}' — cites the whole ghazal",
      "title": "Citation",
      "type": "string"
    },
    "slug": {
      "title": "Slug",
      "type": "string"
    },
    "title_fa": {
      "title": "Title Fa",
      "type": "string"
    },
    "beyt_count": {
      "title": "Beyt Count",
      "type": "integer"
    },
    "excerpt": {
      "default": "",
      "description": "First hemistich of the ghazal",
      "title": "Excerpt",
      "type": "string"
    },
    "beyts": {
      "default": [],
      "items": {
        "$ref": "#/$defs/GhazalBeyt"
      },
      "title": "Beyts",
      "type": "array"
    },
    "prev_ghazal": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Prev Ghazal"
    },
    "next_ghazal": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "title": "Next Ghazal"
    }
  },
  "required": [
    "ghazal",
    "citation",
    "slug",
    "title_fa",
    "beyt_count"
  ],
  "$defs": {
    "GhazalBeyt": {
      "properties": {
        "citation": {
          "description": "Canonical divan citation, e.g. 'G1393:1'",
          "title": "Citation",
          "type": "string"
        },
        "ghazal": {
          "title": "Ghazal",
          "type": "integer"
        },
        "beyt_in_ghazal": {
          "title": "Beyt In Ghazal",
          "type": "integer"
        },
        "mesra1": {
          "title": "Mesra1",
          "type": "string"
        },
        "mesra2": {
          "title": "Mesra2",
          "type": "string"
        }
      },
      "required": [
        "citation",
        "ghazal",
        "beyt_in_ghazal",
        "mesra1",
        "mesra2"
      ],
      "title": "GhazalBeyt",
      "type": "object"
    }
  },
  "title": "GhazalDetail"
}

Recommended Prompts

search_research
Search for information about [topic] using masnavi
Expected tools: search
find_specific
Find [specific item] using masnavi
Expected tools: search
retrieve_data
Get details about [item] from masnavi
Expected tools: get_section
fetch_info
Fetch [information type] using masnavi
Expected tools: get_section
research_workflow
Search for [topic], then get detailed information about the top results using masnavi
Expected tools: searchget_section

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded13 tools
verifiedversion not recorded13 tools