Rumi's complete Masnavi (25,635 beyts) — search, quote, verify and explain. Free, no auth.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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'.
Citation like 'M1:1' or 'M3:1278' or 'g:7421'.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
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'.
| Argument | Type | Description |
|---|---|---|
| citation* | string | Citation like 'M1:1' or 'M3:1278' or 'g:7421'. |
{
"type": "object",
"title": "tool_explainArguments",
"required": [
"citation"
],
"properties": {
"citation": {
"type": "string",
"title": "Citation",
"description": "Citation like 'M1:1' or 'M3:1278' or 'g:7421'."
}
}
}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).
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | story title words (Persian) or a description of the story in any language |
| daftar | any |
{
"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
}
}
}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) = «مرده بدم زنده شدم…».
| Argument | Type | Description |
|---|---|---|
| number | any | Ghazal number, e.g. 1393 |
| citation | any | Divan citation like 'G1393' or 'G1393:2' |
{
"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'"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| end | any | End citation, e.g. 'M2:2775' |
| start | any | Start citation, e.g. 'M2:2608' |
| end_global | any | |
| start_global | any |
{
"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
}
}
}Retrieve a full section (story / بخش) with all its beyts.
| Argument | Type | Description |
|---|---|---|
| slug | any | Stable URL slug |
| section_id | any |
{
"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
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| after | integer | |
| before | integer | |
| daftar | any | |
| citation | any | Citation like 'M3:1278' or 'g:7421' |
| beyt_global | any | |
| beyt_in_daftar | any |
{
"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
}
}
}Return a randomly-selected beyt, optionally restricted to a daftar.
| Argument | Type | Description |
|---|---|---|
| daftar | any |
{
"type": "object",
"title": "tool_randomArguments",
"properties": {
"daftar": {
"anyOf": [
{
"type": "integer",
"maximum": 6,
"minimum": 1
},
{
"type": "null"
}
],
"title": "Daftar",
"default": null
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | Persian text to search for |
| daftar | any | Restrict to a single daftar (1-6) |
| offset | integer |
{
"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
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | Persian text to search for |
| offset | integer |
{
"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
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | What the ghazal should be ABOUT, in any language |
{
"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"
}
}
}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`.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | What the verse should MEAN, in any language |
| daftar | any | Restrict to a single daftar (1-6) |
{
"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)"
}
}
}Browse the Masnavi's section list. Returns titled sections per daftar with beyt counts and ranges.
| Argument | Type | Description |
|---|---|---|
| daftar | any |
{
"type": "object",
"title": "tool_tocArguments",
"properties": {
"daftar": {
"anyOf": [
{
"type": "integer",
"maximum": 6,
"minimum": 1
},
{
"type": "null"
}
],
"title": "Daftar",
"default": null
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| text* | string | Candidate Rumi quote in Persian |
| fuzzy_threshold | number |
{
"type": "object",
"title": "tool_verifyArguments",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"title": "Text",
"description": "Candidate Rumi quote in Persian"
},
"fuzzy_threshold": {
"type": "number",
"title": "Fuzzy Threshold",
"default": 0.82,
"maximum": 1,
"minimum": 0.5
}
}
}