Skip to main content
Glama

chart_facts

A chart's validated facts as ranked, citable atoms for interpretation. Each fact has a stable id (e.g. "aspect:moon~neptune:conjunction"), the bodies it concerns, a salience score (luminaries, angular placements, the chart ruler, tight/hard aspects, configurations rank high), and a plain-language statement. Facts span placements, aspects, configurations, the structural signature, dispositors and receptions, a body's tight conjunction with a bright fixed star (e.g. "star:jupiter:Sirius"), and the Part of Fortune and Spirit (e.g. "lot:fortune"). Read the facts, write the interpretation in your own words, and cite the [id] each statement rests on — do not introduce facts not listed. Returns the ranked facts plus a ready-to-interpret brief.

By default a real birth chart: pass date+lat+lon. The chart's grounding is first-class via realm (what it is: observed/forecast/fictional/mythic/archetypal/…) and the time: an exact date, an uncertain earliest+latest range (the brief then frames it as provisional and trusts the Moon/angles/houses less), constraints for an archetypal chart with no time (synthesized via the compiler), or a full structured when (relative-to-another-event or a narrative calendar). A when of kind relative looks its anchorId up in anchors (a map of id → UTC instant supplied in the request). Omit lat+lon for a placeless chart (nominal houses).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
latNoLatitude, north positive
lonNoLongitude, EAST positive (Americas are negative)
dateNoExact UTC instant, ISO 8601 (e.g. 1990-06-10T14:30:00Z); convert local to UTC first
whenNoFull structured temporal anchor; overrides date/earliest/latest. Use for relative or narrative time.
limitNomax facts to return, highest salience first (default 24)
placeNoNamed place, e.g. "Paris" or "Springfield, US" — resolved to a city centroid via the bundled gazetteer (GeoNames) when lat/lon are not given. Resolution is approximate by construction and reported as such
realmNoWhat the chart is; frames the interpretation (default observed)observed
whereNoFull structured spatial anchor; overrides lat/lon and place. `fictional` carries the narrative value only — a fictional place never resolves to coordinates (the chart reads on the planetary layer, houseless), by design
latestNoEnd of an uncertain-time range (UTC ISO)
zodiacNotropical (default) or sidereal:<ayanamsa>tropical
anchorsNoReference instants for a `relative` when: { anchorId: UTC ISO }
earliestNoStart of an uncertain-time range (UTC ISO); use with `latest` instead of `date`
calendarsNoCalendar lookups for a `narrative` when: { calendarName: { value: UTC ISO } }. The caller owns the mapping (a regnal year, a story epoch, a game calendar) — the engine resolves through it, never invents it
constraintsNoGeometric constraints for an archetypal/conceptual chart with no time (compiler synthesis). Longitude kinds (aspect/sign/degree) plus the latitude-aware kinds: declination (via the fixed J2000 obliquity), parallel/contraparallel of declination, and separation3d (true great-circle separation)
target_dateNoUTC ISO instant for transits and time-lords vs this natal chart; omit for natal-only facts
house_systemNoHouse system (default placidus). Case- and spacing-insensitive; valid: placidus, whole_sign, equal, porphyry, koch, regiomontanus, campanus, alcabitius, morinus, meridian, polich_page, vehlow (aliases like "whole sign" also work).placidus
include_vedicNoWith target_date: project nakshatra/varga/yoga (default true when zodiac is sidereal)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • addedInput schema / properties / calendars
      Added value: +{
      +  "additionalProperties": {
      +    "additionalProperties": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  "description": "Calendar lookups for a `narrative` when: { calendarName: { value: UTC ISO } }. The caller owns the mapping (a regnal year, a story epoch, a game calendar) — the engine resolves through it, never invents it",
      +  "type": "object"
      +}
    • changedInput schema / properties / constraints / description
      Previous value: -"Geometric constraints for an archetypal/conceptual chart with no time (compiler synthesis)"New value: +"Geometric constraints for an archetypal/conceptual chart with no time (compiler synthesis). Longitude kinds (aspect/sign/degree) plus the latitude-aware kinds: declination (via the fixed J2000 obliquity), parallel/contraparallel of declination, and separation3d (true great-circle separation)"
    • changedInput schema / properties / constraints / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "a": {
      -        "type": "string"
      -      },
      -      "angle": {
      -        "type": "number"
      -      },
      -      "b": {
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "aspect",
      -        "type": "string"
      -      },
      -      "weight": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "a",
      -      "b",
      -      "angle"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "body": {
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "sign",
      -        "type": "string"
      -      },
      -      "sign": {
      -        "maximum": 11,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "weight": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "body",
      -      "sign"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "body": {
      -        "type": "string"
      -      },
      -      "degree": {
      -        "type": "number"
      -      },
      -      "kind": {
      -        "const": "degree",
      -        "type": "string"
      -      },
      -      "weight": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "body",
      -      "degree"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "a": {
      +        "type": "string"
      +      },
      +      "angle": {
      +        "type": "number"
      +      },
      +      "b": {
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "aspect",
      +        "type": "string"
      +      },
      +      "weight": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "a",
      +      "b",
      +      "angle"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "body": {
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "sign",
      +        "type": "string"
      +      },
      +      "sign": {
      +        "maximum": 11,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "weight": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "body",
      +      "sign"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "body": {
      +        "type": "string"
      +      },
      +      "degree": {
      +        "type": "number"
      +      },
      +      "kind": {
      +        "const": "degree",
      +        "type": "string"
      +      },
      +      "weight": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "body",
      +      "degree"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "body": {
      +        "type": "string"
      +      },
      +      "degree": {
      +        "maximum": 90,
      +        "minimum": -90,
      +        "type": "number"
      +      },
      +      "kind": {
      +        "const": "declination",
      +        "type": "string"
      +      },
      +      "weight": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "body",
      +      "degree"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "a": {
      +        "type": "string"
      +      },
      +      "b": {
      +        "type": "string"
      +      },
      +      "contra": {
      +        "type": "boolean"
      +      },
      +      "kind": {
      +        "const": "parallel",
      +        "type": "string"
      +      },
      +      "weight": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "a",
      +      "b"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "a": {
      +        "type": "string"
      +      },
      +      "angle": {
      +        "maximum": 180,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "b": {
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "separation3d",
      +        "type": "string"
      +      },
      +      "weight": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "a",
      +      "b",
      +      "angle"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / place
      Added value: +{
      +  "description": "Named place, e.g. \"Paris\" or \"Springfield, US\" — resolved to a city centroid via the bundled gazetteer (GeoNames) when lat/lon are not given. Resolution is approximate by construction and reported as such",
      +  "type": "string"
      +}
    • addedInput schema / properties / where
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "altM": {
      +          "type": "number"
      +        },
      +        "kind": {
      +          "const": "geo",
      +          "type": "string"
      +        },
      +        "lat": {
      +          "$ref": "#/properties/lat"
      +        },
      +        "lonEast": {
      +          "$ref": "#/properties/lon"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "lat",
      +        "lonEast"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "kind": {
      +          "const": "named",
      +          "type": "string"
      +        },
      +        "placeId": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "placeId"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "kind": {
      +          "const": "region",
      +          "type": "string"
      +        },
      +        "lat": {
      +          "$ref": "#/properties/lat"
      +        },
      +        "lonEast": {
      +          "$ref": "#/properties/lon"
      +        },
      +        "radiusKm": {
      +          "exclusiveMinimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "lat",
      +        "lonEast",
      +        "radiusKm"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "kind": {
      +          "const": "fictional",
      +          "type": "string"
      +        },
      +        "value": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "value"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "anchorId": {
      +          "type": "string"
      +        },
      +        "kind": {
      +          "const": "relative",
      +          "type": "string"
      +        },
      +        "relation": {
      +          "enum": [
      +            "near",
      +            "at"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "relation",
      +        "anchorId"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "kind": {
      +          "const": "none",
      +          "type": "string"
      +        },
      +        "reason": {
      +          "enum": [
      +            "heliocentric",
      +            "atemporal",
      +            "intentionally_unset"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "reason"
      +      ],
      +      "type": "object"
      +    }
      +  ],
      +  "description": "Full structured spatial anchor; overrides lat/lon and place. `fictional` carries the narrative value only — a fictional place never resolves to coordinates (the chart reads on the planetary layer, houseless), by design"
      +}
  2. Changed2 schema fields changed
    • addedInput schema / properties / include_vedic
      Added value: +{
      +  "description": "With target_date: project nakshatra/varga/yoga (default true when zodiac is sidereal)",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / target_date
      Added value: +{
      +  "description": "UTC ISO instant for transits and time-lords vs this natal chart; omit for natal-only facts",
      +  "type": "string"
      +}
  3. Added

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so richly: it discloses output shape ('ranked facts plus a ready-to-interpret brief'), the constraint 'do not introduce facts not listed', provisional trust for uncertain time ranges, compiler synthesis for constraints, and caller-owned calendar mappings. This is far beyond schema field semantics.

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

Conciseness5/5

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

The description is dense but purposeful, front-loading the tool's purpose before grounding details. Despite its length, every sentence contributes operational or interpretive context, and the structure logically moves from output semantics to input grounding — appropriate for a 17-parameter tool.

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?

Given no output schema and no annotations, the description compensates fully: it explains return values (ranked facts and brief), the fact structure, citation requirements, all major input modes, and special behaviors like fictional places resolving to no coordinates. An agent has enough information to select and invoke the tool correctly.

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 description coverage is 100%, so the baseline is 3, but the description adds meaningful cross-parameter context: constraints for archetypal charts, when/anchors for relative time, earliest/latest for provisional trust, and 'omit lat+lon for a placeless chart'. These connections are not present in the individual schema property descriptions.

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 chart's validated facts as ranked, citable atoms for interpretation' and specifies the exact output: stable ids, bodies, salience scores, and plain-language statements. It clearly differentiates from plain chart computation by instructing the agent to 'read the facts, write the interpretation... and cite the [id]', establishing a unique interpretive role among siblings.

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?

Provides clear context for when to use the tool and how to ground it: 'By default a real birth chart: pass date+lat+lon', archetypal constraints, relative anchors, and placeless charts with omitted lat/lon. However, it never explicitly names alternatives or states when NOT to use this tool versus a sibling like natal_chart or aspect_patterns.

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.