Event timing
Elect a Contract or Agreement Signing
find_contract_signing_time
Elect the moment to sign an agreement, a lease, a deed or any contract. Elects on houses 2, 6 and 11 and excludes 5, 8 and 12, quoted from decoded KP Reader 5 p.229: "During the conjoined periods of such planets, which are not the significators of 5, 8, 12, but they are the significators of 6 and 11 or 2, 6,11, they must bring success and profit." That one sentence carries the elected group and the excluded group together. The response also carries 'cuspRule', Reader 6's "WHICH TIME IS GOOD?" rule for this event, pp.321-322: "The sub-lord of the third cusp is to be deposited fa a cons tellation, the lord of which is the significator of the houses 6 and 11." It is reported for the reader, not enforced as a filter. Pass 'person2' to run the two chart form when both signatories want their charts read. TWO CHART ELECTION IS A LUMIN EXTENSION, NOT KP CANON, and you must say so when you use it: the corpus holds exactly one worked two chart election and it is a single chart election with a post hoc check, with no rule for what to do when the two disagree. With 'person2' each window gains 'secondaryCheck' reading CONFIRMS, PARTIAL or CONTRADICTS. ASK FOR THE SIGNING'S USABLE HOURS AND PASS THEM AS 'preferred_time_of_day'. A registrar, a notary or an office closes, and KP elects inside the window the world has already fixed. It is the single biggest improvement to this answer. Returns '{ event, granularity, windows[], selection, significatorSet, scanSummary, provenanceSummary, relaxations[], cuspRule, disclaimer, summary }', or the joint shape with 'mode', 'primary', 'secondary' and 'extensionNote' when 'person2' is present. Each window carries startLocal, endLocal, durationMinutes, layersSatisfied, verdict, resolvingLayer, matchedConditions[], discriminator and rank. There is no score and no top ten: the single chart form returns ONE moment, or up to three when the tests cannot separate them, while the two chart form returns the wider pool, up to ten, because the second chart still has to filter what the first elected. A SECOND SCHOOL CAN CROSS-CHECK THIS, AND YOU SHOULD OFFER IT FOR ANY DATE THAT MATTERS. Pass 'bosmia_lens: true' only after the user agrees. Words that work: a second KP school reads the elected moment from the muhurta chart's own cusps rather than from your birth chart, and I can run it as a cross-check. It is not an upgrade and not a premium option, it is a different school reading the same moment. With it on, each window gains 'bosmiaLens' carrying 'verdict' and a one line 'verdictLine', plus 'checks[]' naming what passed and what did not. The two schools genuinely differ, so a disagreement is expected and is information, not a warning about the date, and where they conflict the KP books decide. It never removes or reorders a moment. Bosmia's own row for signing reads the 3rd cusp against houses 3, 1, 11 and 7, with 3 or 11 required, so on a contract the two schools read genuinely different house groups and can differ for that reason alone. Election in KP is read-only. It locates a moment this chart already points at and it does not make the counterparty keep the terms. Report windows in startLocal and endLocal, never in UTC.
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. |
| bosmia_lens | boolean | No | no description |
| scan_start | string | No | First moment to consider, ISO 8601. A bare datetime is read as local time at the place of the action. Defaults to now. |
| scan_days | number | No | Days to scan. Clamped by granularity: 365 for day, 90 for hour, 30 for minute. Default 7. |
| granularity | enum: day | hour | minute | No | Election precision. 'minute' runs the Ascendant layer and gives the narrowest window, 'hour' stops at the Moon sub, 'day' groups by local civil day. Defaults to this event's own default. |
| 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 action happens. Defaults to the birth latitude. KP computes the Ascendant for the place of the action, not the place of birth. |
| event_longitude | number | No | Longitude of where the action happens. Defaults to the birth longitude. |
| event_utc_offset_minutes | number | No | UTC offset at the place of the action, in minutes. Defaults to the birth offset. Drives every local time in the response. |
| max_windows | number | No | Override the default output shape and take a pool of up to 25 instead of the one elected moment. Only use this when the user explicitly asks to see the whole field. |
| person2 | object | No | The other signatory's birth chart. Optional. When given, the moment is elected from the FIRST chart and checked against this one. |
| primary_role | string | No | Label for the first signatory, for example 'buyer'. |
| secondary_role | string | No | Label for the second signatory, for example 'seller'. |
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_contract_signing_time",
"arguments": {
"birth_datetime": "1992-08-14T04:32:00",
"latitude": 6.927,
"longitude": 79.861,
"utc_offset_minutes": 330,
"ayanamsa": "kp"
}
}
}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.