Skip to main content
Glama

Totally Tarot Calculators

Find the transits to a birth chart on a date

compute_transits
Read-onlyIdempotent

Computes where the sky is on a chosen date against where it was at somebody's birth: ten transiting bodies with longitude, sign, degree, speed and retrograde state, and every aspect they make to the natal planets and angles, each with its orb, the orb allowed, the natal longitude measured against, and whether the contact is applying or separating. It covers what is transiting a chart, whether a transit is active on a date, a Saturn return, or whether a contact has perfected.

The computation takes two full sets of ecliptic longitudes (the birth instant, at the historic UTC offset of that place and date, and the target instant), then the angle between every pair taken the short way round the circle: about a hundred and fifty separations, each with a wrap case at 0 Aries. A contact is applying when its orb shrinks over the following hour, and separating when it grows.

The orb convention is in result.orbConvention. How close a transit has to be to count is a convention, and an aspect list without its orb cannot be checked. Here: 3 degrees for conjunction, opposition, trine and square, 2 for sextile, deliberately tighter than a natal chart's 8.

With "time" left out for an unknown birth time, the ascendant and midheaven are dropped entirely, because a transit to an angle cast for an arbitrary noon has no meaning. The Moon is included, where most software excludes it; the lunar nodes are excluded. Significance is interpretation and is not computed here.

Results include an attribution line and a permalink.

Input Schema

NameRequiredDescriptionDefault
atNoTime of day for the transit, HH:MM, read as UTC. Example: "12:00". Defaults to 00:00 UTC.
onYesDate to read the sky for, ISO YYYY-MM-DD, 1700-2200. Example: today's date for "what is transiting me now".
tzNoIANA zone or numeric UTC offset hours for the birth moment. Example: "-5". When absent, resolved historically.
latNoBirth latitude in decimal degrees as a string. Example: "39.76838". Paired with lon.
lonNoBirth longitude in decimal degrees as a string. Example: "-86.15804". Paired with lat.
dateYesBirth date, ISO YYYY-MM-DD, 1800-2200. Example: "1977-10-19". The sky is read for the date in "on".
timeNoBirth time HH:MM local at the birthplace. Example: "23:58". Optional; when it is absent the angles are dropped.
placeYesTown or city of birth with region or country. Example: "Indianapolis, Indiana, United States".

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • changedInput schema / properties / at / description
      Previous value: -"Time of day for the TRANSIT, HH:MM in UTC, not local and not the birth time. Example: \"12:00\". Omit for 00:00 UTC."New value: +"Time of day for the transit, HH:MM, read as UTC. Example: \"12:00\". Defaults to 00:00 UTC."
    • changedInput schema / properties / date / description
      Previous value: -"BIRTH date, ISO YYYY-MM-DD, 1800-2200. Example: \"1977-10-19\". The date to read the sky for is \"on\"."New value: +"Birth date, ISO YYYY-MM-DD, 1800-2200. Example: \"1977-10-19\". The sky is read for the date in \"on\"."
    • changedInput schema / properties / lat / description
      Previous value: -"Birth latitude in decimal degrees as a string. Example: \"39.76838\". Send with lon."New value: +"Birth latitude in decimal degrees as a string. Example: \"39.76838\". Paired with lon."
    • changedInput schema / properties / lon / description
      Previous value: -"Birth longitude in decimal degrees as a string. Example: \"-86.15804\". Send with lat."New value: +"Birth longitude in decimal degrees as a string. Example: \"-86.15804\". Paired with lat."
    • changedInput schema / properties / on / description
      Previous value: -"Date to READ THE SKY FOR, ISO YYYY-MM-DD, 1700-2200. Example: today's date for \"what is transiting me now\"."New value: +"Date to read the sky for, ISO YYYY-MM-DD, 1700-2200. Example: today's date for \"what is transiting me now\"."
    • changedInput schema / properties / place / description
      Previous value: -"Town or city of BIRTH with region or country. Example: \"Indianapolis, Indiana, United States\"."New value: +"Town or city of birth with region or country. Example: \"Indianapolis, Indiana, United States\"."
    • changedInput schema / properties / time / description
      Previous value: -"BIRTH time HH:MM local at the birthplace. Example: \"23:58\". Leave out if unknown; the angles are then left out."New value: +"Birth time HH:MM local at the birthplace. Example: \"23:58\". Optional; when it is absent the angles are dropped."
    • changedInput schema / properties / tz / description
      Previous value: -"IANA zone or numeric UTC offset hours for the BIRTH moment. Example: \"-5\". Omit: resolved historically."New value: +"IANA zone or numeric UTC offset hours for the birth moment. Example: \"-5\". When absent, resolved historically."
  2. Changed1 schema field changed
    • changedInput schema / properties / time / description
      Previous value: -"BIRTH time HH:MM local at the birthplace. Example: \"23:58\". OMIT if unknown; the angles are then left out."New value: +"BIRTH time HH:MM local at the birthplace. Example: \"23:58\". Leave out if unknown; the angles are then left out."
  3. Changed9 schema fields changed
    • changedInput schema / properties / at / description
      Previous value: -"Time of day for the TRANSIT, HH:MM in UTC — not a local time and not the birth time. Example: \"12:00\". Omit it for 00:00 UTC. It matters most for the Moon, whose contacts last about eleven hours."New value: +"Time of day for the TRANSIT, HH:MM in UTC, not local and not the birth time. Example: \"12:00\". Omit for 00:00 UTC."
    • changedInput schema / properties / date / description
      Previous value: -"BIRTH date, ISO YYYY-MM-DD, between 1800-01-01 and 2200-12-31. Example: \"1977-10-19\". This is the natal half; the date to read the sky for is \"on\"."New value: +"BIRTH date, ISO YYYY-MM-DD, 1800-2200. Example: \"1977-10-19\". The date to read the sky for is \"on\"."
    • changedInput schema / properties / lat / description
      Previous value: -"Birth latitude in decimal degrees as a string, e.g. \"39.76838\". Must be sent together with lon."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, e.g. \"-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 / on / description
      Previous value: -"The date to READ THE SKY FOR, ISO YYYY-MM-DD, between 1700 and 2200. REQUIRED. Send today's date for \"what is transiting my chart now\"; send a past date for \"what was transiting when X happened\". There is no default: the birth date would return every planet conjunct its own natal position, which is the chart compared with itself, and \"today\" is not a default this server will assume because the result is published at a permalink."New value: +"Date to READ THE SKY FOR, ISO YYYY-MM-DD, 1700-2200. Example: today's date for \"what is transiting me now\"."
    • changedInput schema / properties / place / description
      Previous value: -"Town or city of BIRTH, with the region or country when the name is a common one. Example: \"Indianapolis, Indiana, United States\"."New value: +"Town or city of BIRTH with region or country. Example: \"Indianapolis, Indiana, United States\"."
    • changedInput schema / properties / time / description
      Previous value: -"BIRTH time, HH:MM on a 24-hour clock, local at the birthplace. Example: \"23:58\". Optional — OMIT IT if the user does not know it rather than filling it in. Without it the ascendant and midheaven are left out of the natal points entirely rather than cast for an arbitrary noon."New value: +"BIRTH time HH:MM local at the birthplace. Example: \"23:58\". OMIT if unknown; the angles are then left out."
    • changedInput schema / properties / tz / description
      Previous value: -"IANA zone name or a numeric UTC offset in hours for the BIRTH moment, e.g. \"-5\". Leave it out and the zone is resolved for the birth date, historic reassignments included."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": {
      -        "aspectCount": {
      -          "description": "How many contacts are within orb. Zero is a real answer, not a failure.",
      -          "type": "number"
      -        },
      -        "aspects": {
      -          "items": {
      -            "properties": {
      -              "allowedOrb": {
      -                "description": "The width this aspect was allowed under the published convention, so a row can be checked against the table without cross-referencing.",
      -                "type": "number"
      -              },
      -              "applying": {
      -                "description": "true while the orb is still closing — the contact has not perfected. false once it has and is widening. Measured by re-reading the orb an hour later, which is correct for a retrograde body and for a pair straddling 0° Aries without a special case.",
      -                "type": "boolean"
      -              },
      -              "aspect": {
      -                "description": "Conjunction, Sextile, Square, Trine or Opposition. Major aspects only — those are the five TRANSIT_ORBS declares a width for.",
      -                "type": "string"
      -              },
      -              "natal": {
      -                "description": "The natal point contacted: a planet, or Ascendant or Midheaven when a birth time was given.",
      -                "type": "string"
      -              },
      -              "natalLongitude": {
      -                "description": "The natal longitude the aspect was measured against, so the row can be checked by hand.",
      -                "type": "number"
      -              },
      -              "orb": {
      -                "description": "Degrees off exact. Zero would be a perfect hit.",
      -                "type": "number"
      -              },
      -              "transiting": {
      -                "description": "The moving body.",
      -                "type": "string"
      -              },
      -              "transitingSpeedPerDay": {
      -                "description": "Degrees of longitude per day for the moving body, so a caller can see how long the contact has left. Negative while retrograde.",
      -                "type": "number"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "type": "array"
      -        },
      -        "emptyNote": {
      -          "description": "Said out loud when the list is empty, because an empty array reads like a failure. Null otherwise.",
      -          "type": "object"
      -        },
      -        "natal": {
      -          "properties": {
      -            "duplicatePointNote": {
      -              "description": "Non-null when the natal points contain two names for one physical point, which they do whenever the chart carries both the mean lunar nodes (North Node, South Node) and the True Node. They sit up to about 1°40' apart, so the same contact frequently appears twice under two names. Both are listed because the birth chart itself publishes both and dropping one here would make the two pages disagree about which points a chart has. Surface this rather than letting a reader count one contact as two.",
      -              "type": "string"
      -            },
      -            "points": {
      -              "description": "Every natal longitude the grid was measured against, so the answer can be checked without casting the chart again. Identical to what /api/public/birth-chart returns for the same inputs.",
      -              "type": "array"
      -            },
      -            "timeKnown": {
      -              "description": "false when no birth time was given. The ascendant and midheaven are then absent from natal.points entirely — not defaulted — because both sweep the whole zodiac in a day and a noon-cast angle is arbitrary rather than approximate.",
      -              "type": "boolean"
      -            },
      -            "timeUnknownNote": {
      -              "description": "The sentence explaining that absence, non-null exactly when timeKnown is false. Surface it: a reader who cannot see why the angles are missing will assume they were not aspected.",
      -              "type": "object"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "orbConvention": {
      -          "properties": {
      -            "natalComparison": {
      -              "description": "What the natal profile would have given instead, so a caller can see the size of the choice.",
      -              "type": "string"
      -            },
      -            "note": {
      -              "description": "Why these widths and not the natal ones, in a sentence.",
      -              "type": "string"
      -            },
      -            "table": {
      -              "description": "THE ORBS, in the payload. There is no fact of the matter about how close a transit has to be before it counts and practitioners differ by a lot, so an aspect grid without its orb is a list of opinions presented as measurements. Reproduce this wherever you reproduce the aspects.",
      -              "type": "object"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "positions": {
      -          "items": {
      -            "properties": {
      -              "body": {
      -                "description": "One of the ten transiting bodies. The Moon IS included — it moves about 13.2° a day so its contacts last about eleven hours, which is why a forecast drops it and why an instant answer should not. The lunar nodes are not included.",
      -                "type": "string"
      -              },
      -              "speedPerDay": {
      -                "description": "Degrees of ecliptic longitude per day. Negative means retrograde; that is the definition.",
      -                "type": "number"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "type": "array"
      -        },
      -        "tightest": {
      -          "description": "The closest contact, or null when nothing is within orb. Tightest is arithmetic; which contact MATTERS is an opinion and is not computed here.",
      -          "type": "object"
      -        },
      -        "transit": {
      -          "properties": {
      -            "instantUTC": {
      -              "description": "The instant the sky was read at, UTC to the second. It comes from the REQUIRED `on` parameter: there is no default, because the birth date would return every planet conjunct its own natal position and \"today\" would make the permalink answer differently tomorrow.",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        }
      -      },
      -      "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
  4. Added

TDQS

A4/5.0
Behavior3/5

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

The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds unusually valuable behavior that is not in the schema: the orb convention (3 degrees for conjunction, opposition, trine and square; 2 for sextile; tighter than natal), Moon included and nodes excluded, angles dropped when birth time is absent, and an attribution line plus permalink in results. It does not describe failure modes or invalid-input behavior, and the implementation detail about wrap cases adds bulk rather than actionable transparency; still, this is well above baseline.

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 first sentence leads with the output shape and scope, and each paragraph has a distinct job (returns, orb convention, special cases). A few sentences do not earn their place for an agent, notably the account of roughly 150 short-way separations with wrap cases at 0 Aries, which is implementation detail rather than invocation guidance.

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

Completeness5/5

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

There is no output schema, so the description must describe return values, and it does so thoroughly: transiting bodies with longitude, sign, degree, speed and retrograde state; every aspect with orb, allowed orb, natal longitude and applying/separating state; plus orbConvention, attribution and a permalink. Edge cases (unknown birth time, Moon/nodes policy, date range stated in the schema) are covered, so nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3, and the schema itself documents each of the 8 parameters with examples and patterns. The description does add non-obvious meaning for `time`: when omitted, the ascendant and midheaven are dropped because transits to an angle cast for an arbitrary noon are meaningless; and it explains that the birth instant is resolved at the historic UTC offset of that place and date, which clarifies `tz`. It gives no guidance on `place` versus `lat`/`lon` precedence, so credit is limited.

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 states a specific verb and resource: it computes transiting bodies against a natal chart instant, and it enumerates the returned fields (longitude, sign, degree, speed, retrograde state, aspects with orbs and applying/separating state). That is clearly distinct from compute_birth_chart (natal positions) and get_planetary_positions (sky only, no chart comparison), so an agent can route correctly without opening a schema.

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

Usage Guidelines4/5

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

It names concrete use cases: "what is transiting a chart, whether a transit is active on a date, a Saturn return, or whether a contact has perfected." This gives clear context for when to call it, but it never explicitly names an alternative tool or states when not to use this one, such as using get_planetary_positions when no birth data is available.

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