caelus-mcp 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,80 @@
1
+ # caelus-mcp
2
+
3
+ MCP server for the [caelus](https://github.com/heavyblotto/caelus) ephemeris
4
+ engine: six chart tools over stdio. Computation only — positions, houses,
5
+ aspects with orbs — the model does the interpreting. No API keys, no
6
+ ephemeris files, no network calls; the engine data ships inside the package.
7
+
8
+ ## Setup
9
+
10
+ Any MCP client that speaks stdio:
11
+
12
+ ```json
13
+ {
14
+ "mcpServers": {
15
+ "caelus": { "command": "npx", "args": ["caelus-mcp"] }
16
+ }
17
+ }
18
+ ```
19
+
20
+ - **Claude Desktop** — `claude_desktop_config.json`
21
+ - **Cursor** — `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global)
22
+ - **Anything else** — spawn `npx caelus-mcp` and speak JSON-RPC over stdio
23
+
24
+ ## Tools
25
+
26
+ | tool | what it answers |
27
+ |------|-----------------|
28
+ | `natal_chart` | A person's birth chart: 13 bodies with sign, house, retrograde, speed; ASC/MC; cusps; aspects |
29
+ | `current_sky` | The sky at a moment and place (defaults to now), not tied to a person |
30
+ | `transits` | Transiting planets vs a natal chart: aspects within orb, applying/separating, natal house per body |
31
+ | `synastry` | Two charts compared: inter-chart aspects, house overlays both ways |
32
+ | `find_aspect_dates` | Exact dates a transiting body aspects a longitude or another body, retrograde re-hits included |
33
+ | `rectification_grid` | ASC/MC sweep across a window of hours for birth-time rectification |
34
+
35
+ Bodies: sun through pluto, chiron, mean and true node. House systems:
36
+ placidus (default), whole_sign, equal, porphyry. Placidus falls back to
37
+ whole_sign above the polar circles and says so in the payload.
38
+
39
+ ## Output
40
+
41
+ Token-frugal JSON: terse keys, positions to 0.01°, a full natal chart is
42
+ ~2.5 KB. Each aspect is a structured object the client can use directly:
43
+
44
+ ```json
45
+ { "a": "moon", "b": "venus", "aspect": "trine", "orb": 2.09 }
46
+ ```
47
+
48
+ A `natal_chart` or `current_sky` response feeds
49
+ [caelus-wheel](https://www.npmjs.com/package/caelus-wheel)'s `<ChartWheel>`
50
+ directly — no adapter:
51
+
52
+ ```tsx
53
+ const payload = JSON.parse(result.content[0].text);
54
+ <ChartWheel chart={payload} size={520} />
55
+ ```
56
+
57
+ ## Dates are UT
58
+
59
+ Tools take ISO 8601 UTC date-times. Convert local birth times first — the
60
+ tool descriptions instruct the model to do this, and
61
+ [caelus-birth](https://www.npmjs.com/package/caelus-birth) does it correctly
62
+ in code (historical tzdb rules, DST edge cases flagged). Longitude is
63
+ east-positive everywhere; the Americas are negative.
64
+
65
+ ## Accuracy
66
+
67
+ Checked against Swiss Ephemeris across 1900–2099: Sun–Saturn ≤1″,
68
+ Uranus ≤1.9″, Neptune ≤4.6″, Moon ≤2.5″, Pluto ≤2.5″ (series valid
69
+ 1885–2099), Chiron ≤1″, nodes ≤1″. Tables:
70
+ [ephemengine.com/validation](https://ephemengine.com/validation).
71
+
72
+ ## The caelus packages
73
+
74
+ - [caelus](https://www.npmjs.com/package/caelus) — the engine
75
+ - [caelus-birth](https://www.npmjs.com/package/caelus-birth) — local birth time + place → UT
76
+ - [caelus-wheel](https://www.npmjs.com/package/caelus-wheel) — React SVG chart wheel
77
+ - caelus-mcp — this package
78
+
79
+ Spec and design notes:
80
+ [MCP_SPEC.md](https://github.com/heavyblotto/caelus/blob/main/MCP_SPEC.md).
@@ -14,8 +14,9 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
14
14
  import { z } from "zod";
15
15
  export declare const chartOut: z.ZodObject<{
16
16
  utc: z.ZodString;
17
- houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>;
18
- houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>>;
17
+ houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>;
18
+ zodiac: z.ZodOptional<z.ZodEnum<["tropical", "sidereal:lahiri", "sidereal:fagan_bradley", "sidereal:krishnamurti", "sidereal:raman", "sidereal:yukteshwar"]>>;
19
+ houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>>;
19
20
  houses_fallback_reason: z.ZodOptional<z.ZodString>;
20
21
  bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
21
22
  lon: z.ZodNumber;
@@ -71,7 +72,7 @@ export declare const chartOut: z.ZodObject<{
71
72
  }>, "many">;
72
73
  }, "strip", z.ZodTypeAny, {
73
74
  utc: string;
74
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
75
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
75
76
  bodies: Record<string, {
76
77
  lon: number;
77
78
  pos: string;
@@ -92,11 +93,12 @@ export declare const chartOut: z.ZodObject<{
92
93
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
93
94
  orb: number;
94
95
  }[];
95
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
96
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
97
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
96
98
  houses_fallback_reason?: string | undefined;
97
99
  }, {
98
100
  utc: string;
99
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
101
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
100
102
  bodies: Record<string, {
101
103
  lon: number;
102
104
  pos: string;
@@ -117,7 +119,8 @@ export declare const chartOut: z.ZodObject<{
117
119
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
118
120
  orb: number;
119
121
  }[];
120
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
122
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
123
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
121
124
  houses_fallback_reason?: string | undefined;
122
125
  }>;
123
126
  export declare const transitsOut: z.ZodObject<{
@@ -186,8 +189,9 @@ export declare const transitsOut: z.ZodObject<{
186
189
  export declare const synastryOut: z.ZodObject<{
187
190
  a: z.ZodObject<{
188
191
  utc: z.ZodString;
189
- houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>;
190
- houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>>;
192
+ houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>;
193
+ zodiac: z.ZodOptional<z.ZodEnum<["tropical", "sidereal:lahiri", "sidereal:fagan_bradley", "sidereal:krishnamurti", "sidereal:raman", "sidereal:yukteshwar"]>>;
194
+ houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>>;
191
195
  houses_fallback_reason: z.ZodOptional<z.ZodString>;
192
196
  bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
193
197
  lon: z.ZodNumber;
@@ -243,7 +247,7 @@ export declare const synastryOut: z.ZodObject<{
243
247
  }>, "many">;
244
248
  }, "strip", z.ZodTypeAny, {
245
249
  utc: string;
246
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
250
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
247
251
  bodies: Record<string, {
248
252
  lon: number;
249
253
  pos: string;
@@ -264,11 +268,12 @@ export declare const synastryOut: z.ZodObject<{
264
268
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
265
269
  orb: number;
266
270
  }[];
267
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
271
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
272
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
268
273
  houses_fallback_reason?: string | undefined;
269
274
  }, {
270
275
  utc: string;
271
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
276
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
272
277
  bodies: Record<string, {
273
278
  lon: number;
274
279
  pos: string;
@@ -289,13 +294,15 @@ export declare const synastryOut: z.ZodObject<{
289
294
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
290
295
  orb: number;
291
296
  }[];
292
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
297
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
298
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
293
299
  houses_fallback_reason?: string | undefined;
294
300
  }>;
295
301
  b: z.ZodObject<{
296
302
  utc: z.ZodString;
297
- houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>;
298
- houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>>;
303
+ houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>;
304
+ zodiac: z.ZodOptional<z.ZodEnum<["tropical", "sidereal:lahiri", "sidereal:fagan_bradley", "sidereal:krishnamurti", "sidereal:raman", "sidereal:yukteshwar"]>>;
305
+ houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>>;
299
306
  houses_fallback_reason: z.ZodOptional<z.ZodString>;
300
307
  bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
301
308
  lon: z.ZodNumber;
@@ -351,7 +358,7 @@ export declare const synastryOut: z.ZodObject<{
351
358
  }>, "many">;
352
359
  }, "strip", z.ZodTypeAny, {
353
360
  utc: string;
354
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
361
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
355
362
  bodies: Record<string, {
356
363
  lon: number;
357
364
  pos: string;
@@ -372,11 +379,12 @@ export declare const synastryOut: z.ZodObject<{
372
379
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
373
380
  orb: number;
374
381
  }[];
375
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
382
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
383
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
376
384
  houses_fallback_reason?: string | undefined;
377
385
  }, {
378
386
  utc: string;
379
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
387
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
380
388
  bodies: Record<string, {
381
389
  lon: number;
382
390
  pos: string;
@@ -397,7 +405,8 @@ export declare const synastryOut: z.ZodObject<{
397
405
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
398
406
  orb: number;
399
407
  }[];
400
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
408
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
409
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
401
410
  houses_fallback_reason?: string | undefined;
402
411
  }>;
403
412
  inter_aspects: z.ZodArray<z.ZodObject<{
@@ -421,7 +430,7 @@ export declare const synastryOut: z.ZodObject<{
421
430
  }, "strip", z.ZodTypeAny, {
422
431
  a: {
423
432
  utc: string;
424
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
433
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
425
434
  bodies: Record<string, {
426
435
  lon: number;
427
436
  pos: string;
@@ -442,12 +451,13 @@ export declare const synastryOut: z.ZodObject<{
442
451
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
443
452
  orb: number;
444
453
  }[];
445
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
454
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
455
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
446
456
  houses_fallback_reason?: string | undefined;
447
457
  };
448
458
  b: {
449
459
  utc: string;
450
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
460
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
451
461
  bodies: Record<string, {
452
462
  lon: number;
453
463
  pos: string;
@@ -468,7 +478,8 @@ export declare const synastryOut: z.ZodObject<{
468
478
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
469
479
  orb: number;
470
480
  }[];
471
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
481
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
482
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
472
483
  houses_fallback_reason?: string | undefined;
473
484
  };
474
485
  inter_aspects: {
@@ -482,7 +493,7 @@ export declare const synastryOut: z.ZodObject<{
482
493
  }, {
483
494
  a: {
484
495
  utc: string;
485
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
496
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
486
497
  bodies: Record<string, {
487
498
  lon: number;
488
499
  pos: string;
@@ -503,12 +514,13 @@ export declare const synastryOut: z.ZodObject<{
503
514
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
504
515
  orb: number;
505
516
  }[];
506
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
517
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
518
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
507
519
  houses_fallback_reason?: string | undefined;
508
520
  };
509
521
  b: {
510
522
  utc: string;
511
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
523
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
512
524
  bodies: Record<string, {
513
525
  lon: number;
514
526
  pos: string;
@@ -529,7 +541,8 @@ export declare const synastryOut: z.ZodObject<{
529
541
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
530
542
  orb: number;
531
543
  }[];
532
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
544
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
545
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
533
546
  houses_fallback_reason?: string | undefined;
534
547
  };
535
548
  inter_aspects: {
@@ -593,8 +606,9 @@ export declare const rectificationGridOut: z.ZodObject<{
593
606
  export declare const OUTPUT_SCHEMAS: {
594
607
  readonly natal_chart: z.ZodObject<{
595
608
  utc: z.ZodString;
596
- houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>;
597
- houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>>;
609
+ houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>;
610
+ zodiac: z.ZodOptional<z.ZodEnum<["tropical", "sidereal:lahiri", "sidereal:fagan_bradley", "sidereal:krishnamurti", "sidereal:raman", "sidereal:yukteshwar"]>>;
611
+ houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>>;
598
612
  houses_fallback_reason: z.ZodOptional<z.ZodString>;
599
613
  bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
600
614
  lon: z.ZodNumber;
@@ -650,7 +664,7 @@ export declare const OUTPUT_SCHEMAS: {
650
664
  }>, "many">;
651
665
  }, "strip", z.ZodTypeAny, {
652
666
  utc: string;
653
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
667
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
654
668
  bodies: Record<string, {
655
669
  lon: number;
656
670
  pos: string;
@@ -671,11 +685,12 @@ export declare const OUTPUT_SCHEMAS: {
671
685
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
672
686
  orb: number;
673
687
  }[];
674
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
688
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
689
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
675
690
  houses_fallback_reason?: string | undefined;
676
691
  }, {
677
692
  utc: string;
678
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
693
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
679
694
  bodies: Record<string, {
680
695
  lon: number;
681
696
  pos: string;
@@ -696,13 +711,15 @@ export declare const OUTPUT_SCHEMAS: {
696
711
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
697
712
  orb: number;
698
713
  }[];
699
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
714
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
715
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
700
716
  houses_fallback_reason?: string | undefined;
701
717
  }>;
702
718
  readonly current_sky: z.ZodObject<{
703
719
  utc: z.ZodString;
704
- houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>;
705
- houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>>;
720
+ houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>;
721
+ zodiac: z.ZodOptional<z.ZodEnum<["tropical", "sidereal:lahiri", "sidereal:fagan_bradley", "sidereal:krishnamurti", "sidereal:raman", "sidereal:yukteshwar"]>>;
722
+ houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>>;
706
723
  houses_fallback_reason: z.ZodOptional<z.ZodString>;
707
724
  bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
708
725
  lon: z.ZodNumber;
@@ -758,7 +775,7 @@ export declare const OUTPUT_SCHEMAS: {
758
775
  }>, "many">;
759
776
  }, "strip", z.ZodTypeAny, {
760
777
  utc: string;
761
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
778
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
762
779
  bodies: Record<string, {
763
780
  lon: number;
764
781
  pos: string;
@@ -779,11 +796,12 @@ export declare const OUTPUT_SCHEMAS: {
779
796
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
780
797
  orb: number;
781
798
  }[];
782
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
799
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
800
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
783
801
  houses_fallback_reason?: string | undefined;
784
802
  }, {
785
803
  utc: string;
786
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
804
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
787
805
  bodies: Record<string, {
788
806
  lon: number;
789
807
  pos: string;
@@ -804,7 +822,8 @@ export declare const OUTPUT_SCHEMAS: {
804
822
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
805
823
  orb: number;
806
824
  }[];
807
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
825
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
826
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
808
827
  houses_fallback_reason?: string | undefined;
809
828
  }>;
810
829
  readonly transits: z.ZodObject<{
@@ -873,8 +892,9 @@ export declare const OUTPUT_SCHEMAS: {
873
892
  readonly synastry: z.ZodObject<{
874
893
  a: z.ZodObject<{
875
894
  utc: z.ZodString;
876
- houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>;
877
- houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>>;
895
+ houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>;
896
+ zodiac: z.ZodOptional<z.ZodEnum<["tropical", "sidereal:lahiri", "sidereal:fagan_bradley", "sidereal:krishnamurti", "sidereal:raman", "sidereal:yukteshwar"]>>;
897
+ houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>>;
878
898
  houses_fallback_reason: z.ZodOptional<z.ZodString>;
879
899
  bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
880
900
  lon: z.ZodNumber;
@@ -930,7 +950,7 @@ export declare const OUTPUT_SCHEMAS: {
930
950
  }>, "many">;
931
951
  }, "strip", z.ZodTypeAny, {
932
952
  utc: string;
933
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
953
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
934
954
  bodies: Record<string, {
935
955
  lon: number;
936
956
  pos: string;
@@ -951,11 +971,12 @@ export declare const OUTPUT_SCHEMAS: {
951
971
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
952
972
  orb: number;
953
973
  }[];
954
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
974
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
975
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
955
976
  houses_fallback_reason?: string | undefined;
956
977
  }, {
957
978
  utc: string;
958
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
979
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
959
980
  bodies: Record<string, {
960
981
  lon: number;
961
982
  pos: string;
@@ -976,13 +997,15 @@ export declare const OUTPUT_SCHEMAS: {
976
997
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
977
998
  orb: number;
978
999
  }[];
979
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
1000
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
1001
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
980
1002
  houses_fallback_reason?: string | undefined;
981
1003
  }>;
982
1004
  b: z.ZodObject<{
983
1005
  utc: z.ZodString;
984
- houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>;
985
- houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>>;
1006
+ houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>;
1007
+ zodiac: z.ZodOptional<z.ZodEnum<["tropical", "sidereal:lahiri", "sidereal:fagan_bradley", "sidereal:krishnamurti", "sidereal:raman", "sidereal:yukteshwar"]>>;
1008
+ houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>>;
986
1009
  houses_fallback_reason: z.ZodOptional<z.ZodString>;
987
1010
  bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
988
1011
  lon: z.ZodNumber;
@@ -1038,7 +1061,7 @@ export declare const OUTPUT_SCHEMAS: {
1038
1061
  }>, "many">;
1039
1062
  }, "strip", z.ZodTypeAny, {
1040
1063
  utc: string;
1041
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
1064
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
1042
1065
  bodies: Record<string, {
1043
1066
  lon: number;
1044
1067
  pos: string;
@@ -1059,11 +1082,12 @@ export declare const OUTPUT_SCHEMAS: {
1059
1082
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
1060
1083
  orb: number;
1061
1084
  }[];
1062
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
1085
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
1086
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
1063
1087
  houses_fallback_reason?: string | undefined;
1064
1088
  }, {
1065
1089
  utc: string;
1066
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
1090
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
1067
1091
  bodies: Record<string, {
1068
1092
  lon: number;
1069
1093
  pos: string;
@@ -1084,7 +1108,8 @@ export declare const OUTPUT_SCHEMAS: {
1084
1108
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
1085
1109
  orb: number;
1086
1110
  }[];
1087
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
1111
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
1112
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
1088
1113
  houses_fallback_reason?: string | undefined;
1089
1114
  }>;
1090
1115
  inter_aspects: z.ZodArray<z.ZodObject<{
@@ -1108,7 +1133,7 @@ export declare const OUTPUT_SCHEMAS: {
1108
1133
  }, "strip", z.ZodTypeAny, {
1109
1134
  a: {
1110
1135
  utc: string;
1111
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
1136
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
1112
1137
  bodies: Record<string, {
1113
1138
  lon: number;
1114
1139
  pos: string;
@@ -1129,12 +1154,13 @@ export declare const OUTPUT_SCHEMAS: {
1129
1154
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
1130
1155
  orb: number;
1131
1156
  }[];
1132
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
1157
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
1158
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
1133
1159
  houses_fallback_reason?: string | undefined;
1134
1160
  };
1135
1161
  b: {
1136
1162
  utc: string;
1137
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
1163
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
1138
1164
  bodies: Record<string, {
1139
1165
  lon: number;
1140
1166
  pos: string;
@@ -1155,7 +1181,8 @@ export declare const OUTPUT_SCHEMAS: {
1155
1181
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
1156
1182
  orb: number;
1157
1183
  }[];
1158
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
1184
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
1185
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
1159
1186
  houses_fallback_reason?: string | undefined;
1160
1187
  };
1161
1188
  inter_aspects: {
@@ -1169,7 +1196,7 @@ export declare const OUTPUT_SCHEMAS: {
1169
1196
  }, {
1170
1197
  a: {
1171
1198
  utc: string;
1172
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
1199
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
1173
1200
  bodies: Record<string, {
1174
1201
  lon: number;
1175
1202
  pos: string;
@@ -1190,12 +1217,13 @@ export declare const OUTPUT_SCHEMAS: {
1190
1217
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
1191
1218
  orb: number;
1192
1219
  }[];
1193
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
1220
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
1221
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
1194
1222
  houses_fallback_reason?: string | undefined;
1195
1223
  };
1196
1224
  b: {
1197
1225
  utc: string;
1198
- houses: "placidus" | "whole_sign" | "equal" | "porphyry";
1226
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
1199
1227
  bodies: Record<string, {
1200
1228
  lon: number;
1201
1229
  pos: string;
@@ -1216,7 +1244,8 @@ export declare const OUTPUT_SCHEMAS: {
1216
1244
  aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
1217
1245
  orb: number;
1218
1246
  }[];
1219
- houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
1247
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | undefined;
1248
+ houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow" | undefined;
1220
1249
  houses_fallback_reason?: string | undefined;
1221
1250
  };
1222
1251
  inter_aspects: {
@@ -38,16 +38,26 @@ const birth = {
38
38
  lat: latSchema,
39
39
  lon: lonSchema,
40
40
  };
41
- const houseSys = z.enum(["placidus", "whole_sign", "equal", "porphyry"]).default("placidus");
41
+ const HOUSE_SYSTEMS = [
42
+ "placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus",
43
+ "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow",
44
+ ];
45
+ const houseSys = z.enum(HOUSE_SYSTEMS).default("placidus");
46
+ const ZODIACS = [
47
+ "tropical", "sidereal:lahiri", "sidereal:fagan_bradley",
48
+ "sidereal:krishnamurti", "sidereal:raman", "sidereal:yukteshwar",
49
+ ];
50
+ const zodiacSchema = z.enum(ZODIACS).default("tropical")
51
+ .describe("tropical (default) or sidereal:<ayanamsa>");
42
52
  function jdFromIso(iso) {
43
53
  const d = new Date(iso);
44
54
  if (Number.isNaN(d.getTime()))
45
55
  throw new Error(`Invalid date: ${iso}`);
46
56
  return julianDay(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds());
47
57
  }
48
- function chartPayload(iso, lat, lon, hs) {
58
+ function chartPayload(iso, lat, lon, hs, zodiac = "tropical") {
49
59
  const d = new Date(iso);
50
- const c = engine.chart(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), lat, lon, hs);
60
+ const c = engine.chart(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), lat, lon, { houseSystem: hs, zodiac });
51
61
  const cusps = c.cusps;
52
62
  const houseOf = (bl) => {
53
63
  for (let i = 0; i < 12; i++) {
@@ -68,7 +78,8 @@ function chartPayload(iso, lat, lon, hs) {
68
78
  }
69
79
  return {
70
80
  utc: iso, houses: c.houseSystem,
71
- ...(c.houseSystem !== hs ? { houses_requested: hs, houses_fallback_reason: "placidus undefined above polar circles" } : {}),
81
+ ...(zodiac !== "tropical" ? { zodiac } : {}),
82
+ ...(c.houseSystem !== hs ? { houses_requested: hs, houses_fallback_reason: `${hs} undefined above polar circles` } : {}),
72
83
  bodies,
73
84
  angles: { asc: r2(c.angles.asc), ascPos: fmt(c.angles.asc), mc: r2(c.angles.mc), mcPos: fmt(c.angles.mc) },
74
85
  cusps: cusps.map(r2),
@@ -91,8 +102,9 @@ const aspectOut = z.object({
91
102
  });
92
103
  export const chartOut = z.object({
93
104
  utc: z.string(),
94
- houses: z.enum(["placidus", "whole_sign", "equal", "porphyry"]),
95
- houses_requested: z.enum(["placidus", "whole_sign", "equal", "porphyry"]).optional(),
105
+ houses: z.enum(HOUSE_SYSTEMS),
106
+ zodiac: z.enum(ZODIACS).optional(),
107
+ houses_requested: z.enum(HOUSE_SYSTEMS).optional(),
96
108
  houses_fallback_reason: z.string().optional(),
97
109
  bodies: z.record(z.string(), bodyOut),
98
110
  angles: z.object({ asc: z.number(), ascPos: z.string(), mc: z.number(), mcPos: z.string() }),
@@ -137,8 +149,8 @@ export function buildServer() {
137
149
  const server = new McpServer({ name: "caelus", version: VERSION });
138
150
  server.registerTool("natal_chart", {
139
151
  description: "A person's birth chart. Requires their exact birth date+time and birthplace (all three: date, lat, lon). Use this — not current_sky — whenever the question is about someone's natal/birth chart. Returns 13 bodies (sun–pluto, chiron, nodes) with sign, house, retrograde, speed; ASC/MC; cusps; major aspects with orbs. Vs Swiss Ephemeris (1900–2099): Sun–Saturn ≤1″, Uranus ≤1.9″, Neptune ≤4.6″, Moon ≤2.5″, Pluto ≤2.5″ (series valid 1885–2099), Chiron ≤1″, nodes ≤1″.",
140
- inputSchema: { ...birth, house_system: houseSys },
141
- }, async ({ date, lat, lon, house_system }) => text(chartPayload(date, lat, lon, house_system)));
152
+ inputSchema: { ...birth, house_system: houseSys, zodiac: zodiacSchema },
153
+ }, async ({ date, lat, lon, house_system, zodiac }) => text(chartPayload(date, lat, lon, house_system, zodiac)));
142
154
  server.registerTool("current_sky", {
143
155
  description: "The sky at a moment and place — not tied to any person. Use for \"what's the sky/transits right now\" or the chart of a non-birth event. Date defaults to now; lat/lon default to 0,0 (geocentric on the equator at the prime meridian), where houses and ASC/MC are nominal — pass a real location if houses matter. For a specific person's birth chart use natal_chart instead. Returns positions, houses, retrogrades, aspects.",
144
156
  inputSchema: {
@@ -146,8 +158,9 @@ export function buildServer() {
146
158
  lat: latSchema.default(0).describe("Latitude, north positive; default 0 makes houses nominal"),
147
159
  lon: lonSchema.default(0).describe("Longitude, EAST positive (Americas are negative); default 0 makes houses nominal"),
148
160
  house_system: houseSys,
161
+ zodiac: zodiacSchema,
149
162
  },
150
- }, async ({ date, lat, lon, house_system }) => text(chartPayload(date ?? new Date().toISOString(), lat, lon, house_system)));
163
+ }, async ({ date, lat, lon, house_system, zodiac }) => text(chartPayload(date ?? new Date().toISOString(), lat, lon, house_system, zodiac)));
151
164
  server.registerTool("transits", {
152
165
  description: "Transiting planets vs natal chart: aspects within orb (applying/separating), natal house per transiting body.",
153
166
  inputSchema: {
@@ -155,9 +168,10 @@ export function buildServer() {
155
168
  transit_date: z.string().optional().describe("UTC ISO date-time of transit moment (convert from local first); omit for now"),
156
169
  orb: z.number().min(0.5).max(10).default(3).describe("Max orb in degrees"),
157
170
  house_system: houseSys,
171
+ zodiac: zodiacSchema,
158
172
  },
159
- }, async ({ date, lat, lon, transit_date, orb, house_system }) => {
160
- const natal = chartPayload(date, lat, lon, house_system);
173
+ }, async ({ date, lat, lon, transit_date, orb, house_system, zodiac }) => {
174
+ const natal = chartPayload(date, lat, lon, house_system, zodiac);
161
175
  const tIso = transit_date ?? new Date().toISOString();
162
176
  const jdT = jdFromIso(tIso);
163
177
  const ASP = [
@@ -174,7 +188,7 @@ export function buildServer() {
174
188
  };
175
189
  const transiting = {};
176
190
  for (const tb of BODIES) {
177
- const tp = engine.position(tb, jdT);
191
+ const tp = engine.position(tb, jdT, { zodiac });
178
192
  transiting[tb] = { pos: fmt(tp.lon), natal_house: houseOf(tp.lon), ...(tp.retrograde ? { rx: true } : {}) };
179
193
  for (const nb of BODIES) {
180
194
  const nLon = natal.bodies[nb].lon;
@@ -197,10 +211,11 @@ export function buildServer() {
197
211
  a: z.object(birth).describe("Person A birth data (UTC date, lat, lon)"),
198
212
  b: z.object(birth).describe("Person B birth data (UTC date, lat, lon)"),
199
213
  orb: z.number().min(0.5).max(10).default(4).describe("Max orb in degrees"),
214
+ zodiac: zodiacSchema,
200
215
  },
201
- }, async ({ a, b, orb }) => {
202
- const ca = chartPayload(a.date, a.lat, a.lon, "placidus");
203
- const cb = chartPayload(b.date, b.lat, b.lon, "placidus");
216
+ }, async ({ a, b, orb, zodiac }) => {
217
+ const ca = chartPayload(a.date, a.lat, a.lon, "placidus", zodiac);
218
+ const cb = chartPayload(b.date, b.lat, b.lon, "placidus", zodiac);
204
219
  const ASP = [
205
220
  ["conjunction", 0], ["sextile", 60], ["square", 90], ["trine", 120], ["opposition", 180],
206
221
  ];
@@ -246,8 +261,9 @@ export function buildServer() {
246
261
  target_body: z.enum(BODIES).optional().describe("Another transiting body. Provide this OR target_lon, not both."),
247
262
  start: z.string().describe("UTC ISO start date (convert from local first)"),
248
263
  end: z.string().describe("UTC ISO end date (convert from local first); range <= 50 years"),
264
+ zodiac: zodiacSchema.describe("Zodiac for body and target_lon longitudes; tropical (default) or sidereal:<ayanamsa>"),
249
265
  },
250
- }, async ({ body, aspect, target_lon, target_body, start, end }) => {
266
+ }, async ({ body, aspect, target_lon, target_body, start, end, zodiac }) => {
251
267
  const angle = { conjunction: 0, sextile: 60, square: 90, trine: 120, opposition: 180 }[aspect];
252
268
  const jd0 = jdFromIso(start);
253
269
  const jd1 = jdFromIso(end);
@@ -261,9 +277,9 @@ export function buildServer() {
261
277
  const offsets = angle === 0 || angle === 180 ? [angle] : [angle, -angle];
262
278
  const mkF = (off) => (jd) => {
263
279
  const tl = target_body !== undefined
264
- ? engine.longitude(target_body, jd)
280
+ ? engine.longitude(target_body, jd, { zodiac })
265
281
  : target_lon;
266
- return mod(engine.longitude(body, jd) - tl - off + 180, 360) - 180;
282
+ return mod(engine.longitude(body, jd, { zodiac }) - tl - off + 180, 360) - 180;
267
283
  };
268
284
  const hitsJd = [];
269
285
  const step = 1.0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "caelus-mcp",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "MCP server for caelus chart computation.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -14,7 +14,7 @@
14
14
  "dependencies": {
15
15
  "@modelcontextprotocol/sdk": "^1.12.0",
16
16
  "zod": "^3.24.0",
17
- "caelus": "^0.2.0"
17
+ "caelus": "^0.3.0"
18
18
  },
19
19
  "devDependencies": {
20
20
  "ajv": "^8.17.1"