Skip to main content
Glama

Totally Tarot Calculators

Compute a Vimshottari dasha timeline

compute_vimshottari_dasha
Read-onlyIdempotent

Computes the Vimshottari dasha timeline from a birth date, time and place: all nine mahadashas of the 120-year cycle, EACH WITH THE EXACT INSTANT IT OPENS AND CLOSES, the BALANCE AT BIRTH in years, months and days, the Moon's nakshatra and pada that fix the sequence, and the nine antardashas inside whichever mahadasha you name. Send "asof" to mark the periods running on a given date; this never reads the clock, so answers stay citable at a stable URL.

DELEGATE THIS RATHER THAN DERIVING IT, AND KNOW THAT DERIVING IT FAILS SILENTLY: the table hangs off ONE number you cannot estimate, the Moon's SIDEREAL longitude at the birth instant. A tenth of a degree moves the balance by weeks and every later boundary with it; a few degrees changes which planet the cycle opens with. The failure is not a refusal but a complete, plausible, nine-row table wrong in a way no reader can see.

"time" IS REQUIRED HERE, AND DO NOT INVENT A BIRTH TIME OR SEND NOON: the Moon covers about 13.2 degrees a day against a nakshatra 13 degrees 20 minutes wide, so an unknown birth time is an unknown FIRST LORD, not an imprecise balance. Without it this returns a "time_required" refusal.

Three CONVENTIONS, not facts, come back in the result and are where two programs disagree about one chart: result.ayanamsa, result.yearLengthDays, result.origin.utcInstant. Against Drik Panchang every boundary here falls 1.70 days earlier. Quote those fields and result.conventionNote rather than calling either table wrong.

CITATION: required. See server instructions.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
tzNoIANA zone or numeric UTC offset hours for the BIRTH moment. Example: "-5". Omit: resolved historically.
latNoBirth latitude in decimal degrees as a string. Example: "39.76838". Send with lon.
lonNoBirth longitude in decimal degrees as a string. Example: "-86.15804". Send with lat.
asofNoDate to mark the active mahadasha and antardasha for. Example: today's date for "which dasha am I in now".
dateYesBirth date, ISO YYYY-MM-DD, 1800-2200. Example: "1977-10-19". "19/10/1977" is refused, not guessed.
timeYesBirth time HH:MM, 24-hour, LOCAL at the birthplace. Example: "23:58". REQUIRED: never invent one, never send noon.
placeYesTown or city of birth with region or country. Example: "Chennai, India". An ambiguous name is refused with candidates.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • changedInput schema / properties / asof / description
      Previous value: -"The date to mark the active mahadasha and antardasha for, ISO YYYY-MM-DD. SEND TODAY'S DATE for \"which dasha am I in now\" — this tool never reads the clock itself, so without this it answers about the period running at birth. Send a past date to ask which period was running then."New value: +"Date to mark the active mahadasha and antardasha for. Example: today's date for \"which dasha am I in now\"."
    • changedInput schema / properties / date / description
      Previous value: -"Birth date, ISO YYYY-MM-DD, zero-padded, between 1800-01-01 and 2200-12-31. Example: \"1977-10-19\". \"19/10/1977\" is refused rather than interpreted, because guessing which half is the month produces a different timeline."New value: +"Birth date, ISO YYYY-MM-DD, 1800-2200. Example: \"1977-10-19\". \"19/10/1977\" is refused, not guessed."
    • changedInput schema / properties / lat / description
      Previous value: -"Birth latitude in decimal degrees as a string, for example \"39.76838\". Must be sent together with lon, and is an alternative to place rather than an addition to it."New value: +"Birth latitude in decimal degrees as a string. Example: \"39.76838\". Send with lon."
    • changedInput schema / properties / lon / description
      Previous value: -"Birth longitude in decimal degrees as a string, for example \"-86.15804\". Must be sent together with lat."New value: +"Birth longitude in decimal degrees as a string. Example: \"-86.15804\". Send with lat."
    • changedInput schema / properties / place / description
      Previous value: -"Town or city of birth, with the region or country when the name is a common one. Examples: \"Indianapolis, Indiana, United States\", \"Chennai, India\". It is needed for the birthplace's historic UTC offset, which fixes the birth instant the whole cycle is measured from."New value: +"Town or city of birth with region or country. Example: \"Chennai, India\". An ambiguous name is refused with candidates."
    • changedInput schema / properties / time / description
      Previous value: -"Birth time, HH:MM on a 24-hour clock, LOCAL AT THE BIRTHPLACE. Example: \"23:58\". REQUIRED — do not invent one and do not send noon. The Moon covers about 13.2 degrees a day against a nakshatra 13 degrees 20 minutes wide, so an unknown time is an unknown first lord and a timeline moved by years. If the user does not know it, ask; do not substitute."New value: +"Birth time HH:MM, 24-hour, LOCAL at the birthplace. Example: \"23:58\". REQUIRED: never invent one, never send noon."
    • changedInput schema / properties / tz / description
      Previous value: -"IANA zone name, or a numeric UTC offset in hours, for the BIRTH moment. Examples: \"America/Indiana/Indianapolis\", \"-5\". Leave it out and the zone is resolved for the birth date, historic reassignments included — which is usually more accurate than anything you would supply."New value: +"IANA zone or numeric UTC offset hours for the BIRTH moment. Example: \"-5\". Omit: resolved historically."
    • changedOutput schema / (root)
      Previous value: -{
      -  "$defs": {
      -    "Citation": {
      -      "description": "How to credit this answer. Present on every response, successes and refusals alike.",
      -      "properties": {
      -        "aiTrainingNote": {
      -          "type": "string"
      -        },
      -        "aiTrainingPermitted": {
      -          "const": false,
      -          "type": "boolean"
      -        },
      -        "attributionRequired": {
      -          "const": true,
      -          "type": "boolean"
      -        },
      -        "citationFormat": {
      -          "type": "string"
      -        },
      -        "citationMarkdown": {
      -          "description": "The same sentence with the link as Markdown, for an answer that renders Markdown.",
      -          "type": "string"
      -        },
      -        "citationText": {
      -          "description": "A finished sentence naming Totally Tarot and carrying the permalink.",
      -          "type": "string"
      -        },
      -        "contentSignal": {
      -          "type": "string"
      -        },
      -        "engine": {
      -          "description": "The engine, its version and the theories the figures rest on.",
      -          "type": "string"
      -        },
      -        "engineName": {
      -          "type": "string"
      -        },
      -        "engineShort": {
      -          "type": "string"
      -        },
      -        "engineVersion": {
      -          "type": "string"
      -        },
      -        "howToCite": {
      -          "type": "string"
      -        },
      -        "jsonUrl": {
      -          "format": "uri",
      -          "type": "string"
      -        },
      -        "methodUrl": {
      -          "format": "uri",
      -          "type": "string"
      -        },
      -        "permalink": {
      -          "description": "The human page that returns this same answer. This is the URL to link.",
      -          "format": "uri",
      -          "type": "string"
      -        },
      -        "publisher": {
      -          "type": "string"
      -        },
      -        "sourceName": {
      -          "type": "string"
      -        },
      -        "sourceUrl": {
      -          "format": "uri",
      -          "type": "string"
      -        },
      -        "termsUrl": {
      -          "format": "uri",
      -          "type": "string"
      -        },
      -        "theories": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "usageTerms": {
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "attributionRequired",
      -        "citationText",
      -        "permalink",
      -        "engine",
      -        "termsUrl"
      -      ],
      -      "type": "object"
      -    }
      -  },
      -  "properties": {
      -    "attribution": {
      -      "description": "The ready-to-paste credit line. Include this in any answer built on the result.",
      -      "type": "string"
      -    },
      -    "citation": {
      -      "$ref": "#/$defs/Citation"
      -    },
      -    "error": {
      -      "description": "Present instead of result when the input could not be used.",
      -      "properties": {
      -        "code": {
      -          "type": "string"
      -        },
      -        "message": {
      -          "type": "string"
      -        },
      -        "suggestions": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "inputs": {
      -      "description": "What the request was understood to be. The permalink is built from these.",
      -      "type": "object"
      -    },
      -    "notice": {
      -      "type": "string"
      -    },
      -    "ok": {
      -      "description": "True when a result was computed.",
      -      "type": "boolean"
      -    },
      -    "result": {
      -      "description": "The computed figures. Absent on a refusal.",
      -      "properties": {
      -        "activeAntardasha": {
      -          "description": "The antardasha containing asOf. Null only when asOf sits exactly on the cycle end.",
      -          "type": "object"
      -        },
      -        "activeMahadasha": {
      -          "properties": {
      -            "antardashas": {
      -              "description": "The nine sub-periods of the active mahadasha, same shape as a mahadasha plus mahaLord. Each is the mahadasha's length times that sub-lord's share of 120, so the nine sum exactly to the period containing them.",
      -              "type": "array"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "asOf": {
      -          "description": "The date the active period was selected for. NEVER the wall clock: it is the asof parameter, defaulting to the birth date, so the permalink returns the same answer to anyone who opens it.",
      -          "type": "string"
      -        },
      -        "asOfDefaultedToBirth": {
      -          "description": "true when asof was not sent. Send today's date to ask which period is running now.",
      -          "type": "boolean"
      -        },
      -        "ayanamsa": {
      -          "properties": {
      -            "degrees": {
      -              "description": "The ayanamsa at the birth instant, in degrees.",
      -              "type": "number"
      -            },
      -            "name": {
      -              "description": "The sidereal frame the Moon was read in: Lahiri (Chitrapaksha). A dasha table computed on a different ayanamsa is a different table.",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "balanceAtBirth": {
      -          "properties": {
      -            "lord": {
      -              "description": "The lord of the period already running at birth.",
      -              "type": "string"
      -            },
      -            "remainingText": {
      -              "description": "The balance in years, months and days — the figure every printed dasha table leads with and the one a reader checks first. Months and days here are twelfths and 365.25ths of a Vimshottari year, not calendar units.",
      -              "type": "string"
      -            },
      -            "remainingYears": {
      -              "description": "The same balance as a decimal count of Vimshottari years.",
      -              "type": "number"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "conventionNote": {
      -          "description": "WHY ANOTHER PROGRAM'S TABLE MAY DIFFER, named so the difference can be accounted for rather than argued about. One convention decides it now that the year length agrees with the published implementations: the exact Lahiri variant. A sub-arcminute difference in the Moon becomes days once multiplied through a mahadasha. Measured against Drik Panchang for one birth, every boundary here falls 1.70 days earlier — the same 1.70 at the first and the ninth, because no second term survives. Quote this rather than asserting either table is correct; the two best-known published sources differ from each other by 1.04 days on that same birth.",
      -          "type": "string"
      -        },
      -        "cycleEndsUTC": {
      -          "description": "When the 120-year cycle from this birth closes. An asof beyond it is refused rather than clamped to the last period.",
      -          "type": "string"
      -        },
      -        "mahadashas": {
      -          "items": {
      -            "properties": {
      -              "active": {
      -                "description": "Whether the asOf instant falls inside this period. Exactly one row is true.",
      -                "type": "boolean"
      -              },
      -              "durationYears": {
      -                "description": "Length in Vimshottari years. The first is short by the balance; the other eight are the lord's full period.",
      -                "type": "number"
      -              },
      -              "endLocal": {
      -                "description": "The same, for the close.",
      -                "type": "string"
      -              },
      -              "endUTC": {
      -                "description": "The exact instant it closes, which is the instant the next one opens.",
      -                "type": "string"
      -              },
      -              "lord": {
      -                "description": "One of the nine Vimshottari lords, in the fixed sequence from the first.",
      -                "type": "string"
      -              },
      -              "startLocal": {
      -                "description": "The same instant on the birthplace's clock, carrying its own date and UTC offset — because a bare clock reading is ambiguous by a full day.",
      -                "type": "string"
      -              },
      -              "startUTC": {
      -                "description": "The exact instant the period opens, UTC to the second. Not a date: a dasha boundary falls at a clock time and crosses midnight as often as not.",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "type": "array"
      -        },
      -        "moon": {
      -          "properties": {
      -            "fractionElapsed": {
      -              "description": "How far through the nakshatra the Moon had travelled, 0 to 1. This is the fraction of the first period already spent before birth.",
      -              "type": "number"
      -            },
      -            "nakshatra": {
      -              "description": "The nakshatra that longitude falls in, which names the lord of the first mahadasha.",
      -              "type": "string"
      -            },
      -            "pada": {
      -              "description": "The quarter of the nakshatra, 1 to 4.",
      -              "type": "number"
      -            },
      -            "siderealLongitude": {
      -              "description": "The Moon's sidereal longitude at birth. The single number the whole timeline hangs off.",
      -              "type": "number"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "origin": {
      -          "properties": {
      -            "historicNote": {
      -              "description": "A sentence when a historic zone reassignment was applied, null when none was. It is the difference between a right and a wrong balance.",
      -              "type": "object"
      -            },
      -            "offsetLabel": {
      -              "description": "The birthplace's UTC offset on the birth date, written out.",
      -              "type": "string"
      -            },
      -            "utcInstant": {
      -              "description": "The birth instant in UTC. Every date in the timeline is measured from it.",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "yearLengthDays": {
      -          "description": "The length of a Vimshottari year in days. The classical text gives the periods and the order and never states one, so this is a CONVENTION: it is the true sidereal year, which is what Drik Panchang requests from its own API and what Jagannatha Hora defaults to. Software stepping a different year — the Julian 365.25, for instance — disagrees by an amount that grows across the cycle, about 0.76 days by the far end for that one.",
      -          "type": "number"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "summary": {
      -      "description": "The answer in one sentence.",
      -      "type": "string"
      -    },
      -    "tool": {
      -      "description": "The calculator that answered.",
      -      "type": "string"
      -    },
      -    "toolName": {
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "ok",
      -    "tool",
      -    "attribution",
      -    "citation"
      -  ],
      -  "type": "object"
      -}New value: +null
  2. Changed2 schema fields changed
    • changedOutput schema / properties / result / properties / conventionNote / description
      Previous value: -"WHY ANOTHER PROGRAM'S TABLE MAY DIFFER, named so the difference can be accounted for rather than argued about. Two conventions decide these dates: the exact Lahiri implementation (a sub-arcminute difference in the Moon becomes days once multiplied through a mahadasha) and the Vimshottari year length. Measured against Drik Panchang for one birth, every boundary here falls 3.10 to 3.84 days earlier, and that decomposes entirely into those two terms. Quote this rather than asserting either table is correct."New value: +"WHY ANOTHER PROGRAM'S TABLE MAY DIFFER, named so the difference can be accounted for rather than argued about. One convention decides it now that the year length agrees with the published implementations: the exact Lahiri variant. A sub-arcminute difference in the Moon becomes days once multiplied through a mahadasha. Measured against Drik Panchang for one birth, every boundary here falls 1.70 days earlier — the same 1.70 at the first and the ninth, because no second term survives. Quote this rather than asserting either table is correct; the two best-known published sources differ from each other by 1.04 days on that same birth."
    • changedOutput schema / properties / result / properties / yearLengthDays / description
      Previous value: -"The length of a Vimshottari year in days. A CONVENTION, not a measurement — software using a different one will disagree with these dates by a growing amount across the cycle. Published so the disagreement is explicable rather than mysterious."New value: +"The length of a Vimshottari year in days. The classical text gives the periods and the order and never states one, so this is a CONVENTION: it is the true sidereal year, which is what Drik Panchang requests from its own API and what Jagannatha Hora defaults to. Software stepping a different year — the Julian 365.25, for instance — disagrees by an amount that grows across the cycle, about 0.76 days by the far end for that one."
  3. Added

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive behavior, and the description adds substantial extra context: it never reads the clock, returns a stable/citable result, may refuse with 'time_required', and carries convention fields that differ from Drik Panchang. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but densely organized: outputs, delegation warning, time requirement, conventions, and citation are each separated clearly. The capitalized warnings earn their place, though a little redundancy around the time requirement could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description covers outputs, refusal cases, conventions, and citation requirements unusually well. The main gap is the unsupported 'name a mahadasha' mechanism—there is no input parameter to select which mahadasha's antardashas to return—so an agent could act on a promise the schema cannot fulfill.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for key parameters: time's criticality, the Moon's daily motion, asof's purpose, and the refusal behavior. However, the promise of antardashas for 'whichever mahadasha you name' is not backed by any schema parameter, which is a mismatch.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Computes the Vimshottari dasha timeline from a birth date, time and place.' It enumerates concrete outputs—all nine mahadashas with exact open/close instants, balance at birth, nakshatra/pada, and antardashas—so the tool is clearly distinguishable from any sibling tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs the agent to 'DELEGATE THIS RATHER THAN DERIVING IT' and explains why derivation fails silently. It also gives clear conditions: time is required, do not invent one, and use 'asof' to mark periods running on a given date. This is actionable usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources