Event timing
Two Chart Election (Lumin extension)
find_joint_election_window
Elect a moment against two charts, for a wedding, a jointly signed contract, a co-purchase, or an IVF transfer. IMPORTANT, SAY THIS WHEN YOU USE IT: two chart election is a LUMIN EXTENSION, not KP canon. The KP corpus contains exactly one worked two chart election in 6,465 pages and it is a single chart election with a post hoc check of the second chart, with no rule at all for what to do when the two disagree. The default mode 'single-chart-with-check' reproduces that pattern: the moment is elected from the primary chart, then the secondary chart is evaluated at the same instant and reported as CONFIRMS, PARTIAL or CONTRADICTS. The 'both-charts-must-agree' mode returns only mutually confirmed windows and is our invention. Returns '{ mode, primary, secondary, windows: [{ ...window, secondaryCheck: { layersSatisfied, agreement, note } }], extensionNote, disclaimer, summary }'.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| birth_datetime | string | Yes | Birth date and time in ISO 8601 format (e.g., "1990-05-15T14:30:00"). |
| latitude | number | Yes | Birth location latitude. Range: -90 to 90. |
| longitude | number | Yes | Birth location longitude. Range: -180 to 180. |
| utc_offset_minutes | number | Yes | UTC offset in minutes (e.g., 330 for IST, -300 for EST). |
| ayanamsa | enum: kp | kp_new | lahiri | raman | true_chitra | khullar | No | Ayanamsa system. Defaults to kp. |
| event | string | Yes | What is being elected, for example 'marriage' or 'sign an agreement'. |
| person2 | object | No | The second chart. The election is derived from the FIRST chart and checked against this one. |
| mode | enum: single-chart-with-check | both-charts-must-agree | No | Default single-chart-with-check, which is the only pattern the corpus actually works. |
| primary_role | string | No | Label for the first person, for example 'bride'. |
| secondary_role | string | No | Label for the second person, for example 'groom'. |
| scan_start | string | No | First moment to consider, ISO 8601. Defaults to now. |
| scan_days | number | No | Days to scan. Clamped by granularity: 365 day, 90 hour, 30 minute. Default 7. |
| granularity | enum: day | hour | minute | No | no description |
| preferred_time_of_day | object | No | What this window is, for example "office hours" or "before the registrar closes". Echoed back in the response. |
| event_latitude | number | No | Latitude of where the event happens. Defaults to the first person's birth latitude. |
| event_longitude | number | No | Longitude of where the event happens. |
| event_utc_offset_minutes | number | No | UTC offset at the event location, in minutes. |
| max_windows | number | No | no description |
Example call
Send the request as a standard MCP tools/call:
POST https://mcp.lumin.guru/mcp
Authorization: Bearer mcp_yourkey...
Accept: application/json, text/event-stream
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "find_joint_election_window",
"arguments": {
"birth_datetime": "1992-08-14T04:32:00",
"latitude": 6.927,
"longitude": 79.861,
"utc_offset_minutes": 330,
"ayanamsa": "kp",
"event": "Marriage"
}
}
}Birth data
This tool requires birth data on every call. The MCP server is stateless, so calling set_birth_profile first validates the data and returns the reading plan, but it does not store anything. Repeat the same five fields here.