caelus-mcp 0.15.0 → 0.16.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  # caelus-mcp
2
2
 
3
3
  MCP server for the [caelus](https://github.com/heavyblotto/caelus) ephemeris
4
- engine: twenty-two chart tools over stdio. Computation only — positions, houses,
4
+ engine: twenty-seven chart tools over stdio. Computation only — positions, houses,
5
5
  aspects with orbs, event search, electional, returns, progressions, composite,
6
6
  dignities, Hermetic lots, the Hellenistic time-lords (profections, firdaria,
7
7
  zodiacal releasing), primary directions, and the Vedic layer (nakshatras,
@@ -1312,26 +1312,34 @@ export declare const dignitiesOut: z.ZodObject<{
1312
1312
  bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
1313
1313
  sign: z.ZodString;
1314
1314
  dignity: z.ZodArray<z.ZodEnum<["domicile", "exaltation", "detriment", "fall"]>, "many">;
1315
+ score: z.ZodNumber;
1316
+ peregrine: z.ZodOptional<z.ZodBoolean>;
1315
1317
  planetary_sect: z.ZodNullable<z.ZodEnum<["diurnal", "nocturnal"]>>;
1316
1318
  in_sect: z.ZodNullable<z.ZodBoolean>;
1317
1319
  }, "strip", z.ZodTypeAny, {
1318
1320
  dignity: ("domicile" | "exaltation" | "detriment" | "fall")[];
1319
1321
  sign: string;
1322
+ score: number;
1320
1323
  planetary_sect: "diurnal" | "nocturnal" | null;
1321
1324
  in_sect: boolean | null;
1325
+ peregrine?: boolean | undefined;
1322
1326
  }, {
1323
1327
  dignity: ("domicile" | "exaltation" | "detriment" | "fall")[];
1324
1328
  sign: string;
1329
+ score: number;
1325
1330
  planetary_sect: "diurnal" | "nocturnal" | null;
1326
1331
  in_sect: boolean | null;
1332
+ peregrine?: boolean | undefined;
1327
1333
  }>>;
1328
1334
  }, "strip", z.ZodTypeAny, {
1329
1335
  utc: string;
1330
1336
  bodies: Record<string, {
1331
1337
  dignity: ("domicile" | "exaltation" | "detriment" | "fall")[];
1332
1338
  sign: string;
1339
+ score: number;
1333
1340
  planetary_sect: "diurnal" | "nocturnal" | null;
1334
1341
  in_sect: boolean | null;
1342
+ peregrine?: boolean | undefined;
1335
1343
  }>;
1336
1344
  sect: "day" | "night";
1337
1345
  }, {
@@ -1339,8 +1347,10 @@ export declare const dignitiesOut: z.ZodObject<{
1339
1347
  bodies: Record<string, {
1340
1348
  dignity: ("domicile" | "exaltation" | "detriment" | "fall")[];
1341
1349
  sign: string;
1350
+ score: number;
1342
1351
  planetary_sect: "diurnal" | "nocturnal" | null;
1343
1352
  in_sect: boolean | null;
1353
+ peregrine?: boolean | undefined;
1344
1354
  }>;
1345
1355
  sect: "day" | "night";
1346
1356
  }>;
@@ -1960,6 +1970,317 @@ export declare const yogasOut: z.ZodObject<{
1960
1970
  }[];
1961
1971
  yogakarakas: string[];
1962
1972
  }>;
1973
+ export declare const patternsOut: z.ZodObject<{
1974
+ utc: z.ZodString;
1975
+ houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>;
1976
+ zodiac: z.ZodOptional<z.ZodEnum<["tropical", "sidereal:lahiri", "sidereal:fagan_bradley", "sidereal:krishnamurti", "sidereal:raman", "sidereal:yukteshwar", "sidereal:galcent_0sag", "sidereal:true_citra"]>>;
1977
+ patterns: z.ZodArray<z.ZodObject<{
1978
+ kind: z.ZodString;
1979
+ bodies: z.ZodArray<z.ZodString, "many">;
1980
+ apex: z.ZodOptional<z.ZodString>;
1981
+ sign: z.ZodOptional<z.ZodString>;
1982
+ house: z.ZodOptional<z.ZodNumber>;
1983
+ orb: z.ZodNumber;
1984
+ }, "strip", z.ZodTypeAny, {
1985
+ orb: number;
1986
+ bodies: string[];
1987
+ kind: string;
1988
+ house?: number | undefined;
1989
+ sign?: string | undefined;
1990
+ apex?: string | undefined;
1991
+ }, {
1992
+ orb: number;
1993
+ bodies: string[];
1994
+ kind: string;
1995
+ house?: number | undefined;
1996
+ sign?: string | undefined;
1997
+ apex?: string | undefined;
1998
+ }>, "many">;
1999
+ }, "strip", z.ZodTypeAny, {
2000
+ utc: string;
2001
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
2002
+ patterns: {
2003
+ orb: number;
2004
+ bodies: string[];
2005
+ kind: string;
2006
+ house?: number | undefined;
2007
+ sign?: string | undefined;
2008
+ apex?: string | undefined;
2009
+ }[];
2010
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | "sidereal:galcent_0sag" | "sidereal:true_citra" | undefined;
2011
+ }, {
2012
+ utc: string;
2013
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
2014
+ patterns: {
2015
+ orb: number;
2016
+ bodies: string[];
2017
+ kind: string;
2018
+ house?: number | undefined;
2019
+ sign?: string | undefined;
2020
+ apex?: string | undefined;
2021
+ }[];
2022
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | "sidereal:galcent_0sag" | "sidereal:true_citra" | undefined;
2023
+ }>;
2024
+ export declare const signatureOut: z.ZodObject<{
2025
+ utc: z.ZodString;
2026
+ houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>;
2027
+ zodiac: z.ZodOptional<z.ZodEnum<["tropical", "sidereal:lahiri", "sidereal:fagan_bradley", "sidereal:krishnamurti", "sidereal:raman", "sidereal:yukteshwar", "sidereal:galcent_0sag", "sidereal:true_citra"]>>;
2028
+ signature: z.ZodObject<{
2029
+ elements: z.ZodRecord<z.ZodString, z.ZodNumber>;
2030
+ modalities: z.ZodRecord<z.ZodString, z.ZodNumber>;
2031
+ angularity: z.ZodRecord<z.ZodString, z.ZodNumber>;
2032
+ quadrants: z.ZodRecord<z.ZodString, z.ZodNumber>;
2033
+ hemispheres: z.ZodRecord<z.ZodString, z.ZodNumber>;
2034
+ dominant: z.ZodObject<{
2035
+ element: z.ZodString;
2036
+ modality: z.ZodString;
2037
+ sign: z.ZodNullable<z.ZodString>;
2038
+ }, "strip", z.ZodTypeAny, {
2039
+ sign: string | null;
2040
+ element: string;
2041
+ modality: string;
2042
+ }, {
2043
+ sign: string | null;
2044
+ element: string;
2045
+ modality: string;
2046
+ }>;
2047
+ ruler: z.ZodNullable<z.ZodString>;
2048
+ bodies: z.ZodArray<z.ZodString, "many">;
2049
+ }, "strip", z.ZodTypeAny, {
2050
+ bodies: string[];
2051
+ ruler: string | null;
2052
+ elements: Record<string, number>;
2053
+ modalities: Record<string, number>;
2054
+ angularity: Record<string, number>;
2055
+ quadrants: Record<string, number>;
2056
+ hemispheres: Record<string, number>;
2057
+ dominant: {
2058
+ sign: string | null;
2059
+ element: string;
2060
+ modality: string;
2061
+ };
2062
+ }, {
2063
+ bodies: string[];
2064
+ ruler: string | null;
2065
+ elements: Record<string, number>;
2066
+ modalities: Record<string, number>;
2067
+ angularity: Record<string, number>;
2068
+ quadrants: Record<string, number>;
2069
+ hemispheres: Record<string, number>;
2070
+ dominant: {
2071
+ sign: string | null;
2072
+ element: string;
2073
+ modality: string;
2074
+ };
2075
+ }>;
2076
+ }, "strip", z.ZodTypeAny, {
2077
+ utc: string;
2078
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
2079
+ signature: {
2080
+ bodies: string[];
2081
+ ruler: string | null;
2082
+ elements: Record<string, number>;
2083
+ modalities: Record<string, number>;
2084
+ angularity: Record<string, number>;
2085
+ quadrants: Record<string, number>;
2086
+ hemispheres: Record<string, number>;
2087
+ dominant: {
2088
+ sign: string | null;
2089
+ element: string;
2090
+ modality: string;
2091
+ };
2092
+ };
2093
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | "sidereal:galcent_0sag" | "sidereal:true_citra" | undefined;
2094
+ }, {
2095
+ utc: string;
2096
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
2097
+ signature: {
2098
+ bodies: string[];
2099
+ ruler: string | null;
2100
+ elements: Record<string, number>;
2101
+ modalities: Record<string, number>;
2102
+ angularity: Record<string, number>;
2103
+ quadrants: Record<string, number>;
2104
+ hemispheres: Record<string, number>;
2105
+ dominant: {
2106
+ sign: string | null;
2107
+ element: string;
2108
+ modality: string;
2109
+ };
2110
+ };
2111
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | "sidereal:galcent_0sag" | "sidereal:true_citra" | undefined;
2112
+ }>;
2113
+ export declare const similarSkiesOut: z.ZodObject<{
2114
+ reference_utc: z.ZodString;
2115
+ matches: z.ZodArray<z.ZodObject<{
2116
+ utc: z.ZodString;
2117
+ similarity: z.ZodNumber;
2118
+ }, "strip", z.ZodTypeAny, {
2119
+ utc: string;
2120
+ similarity: number;
2121
+ }, {
2122
+ utc: string;
2123
+ similarity: number;
2124
+ }>, "many">;
2125
+ }, "strip", z.ZodTypeAny, {
2126
+ reference_utc: string;
2127
+ matches: {
2128
+ utc: string;
2129
+ similarity: number;
2130
+ }[];
2131
+ }, {
2132
+ reference_utc: string;
2133
+ matches: {
2134
+ utc: string;
2135
+ similarity: number;
2136
+ }[];
2137
+ }>;
2138
+ export declare const electionalOut: z.ZodObject<{
2139
+ start: z.ZodString;
2140
+ end: z.ZodString;
2141
+ moments: z.ZodArray<z.ZodObject<{
2142
+ utc: z.ZodString;
2143
+ score: z.ZodNumber;
2144
+ matched: z.ZodArray<z.ZodObject<{
2145
+ a: z.ZodString;
2146
+ b: z.ZodString;
2147
+ aspect: z.ZodEnum<["conjunction", "sextile", "square", "trine", "opposition"]>;
2148
+ orb: z.ZodNumber;
2149
+ applying: z.ZodBoolean;
2150
+ }, "strip", z.ZodTypeAny, {
2151
+ applying: boolean;
2152
+ a: string;
2153
+ b: string;
2154
+ aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
2155
+ orb: number;
2156
+ }, {
2157
+ applying: boolean;
2158
+ a: string;
2159
+ b: string;
2160
+ aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
2161
+ orb: number;
2162
+ }>, "many">;
2163
+ }, "strip", z.ZodTypeAny, {
2164
+ utc: string;
2165
+ score: number;
2166
+ matched: {
2167
+ applying: boolean;
2168
+ a: string;
2169
+ b: string;
2170
+ aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
2171
+ orb: number;
2172
+ }[];
2173
+ }, {
2174
+ utc: string;
2175
+ score: number;
2176
+ matched: {
2177
+ applying: boolean;
2178
+ a: string;
2179
+ b: string;
2180
+ aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
2181
+ orb: number;
2182
+ }[];
2183
+ }>, "many">;
2184
+ }, "strip", z.ZodTypeAny, {
2185
+ start: string;
2186
+ end: string;
2187
+ moments: {
2188
+ utc: string;
2189
+ score: number;
2190
+ matched: {
2191
+ applying: boolean;
2192
+ a: string;
2193
+ b: string;
2194
+ aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
2195
+ orb: number;
2196
+ }[];
2197
+ }[];
2198
+ }, {
2199
+ start: string;
2200
+ end: string;
2201
+ moments: {
2202
+ utc: string;
2203
+ score: number;
2204
+ matched: {
2205
+ applying: boolean;
2206
+ a: string;
2207
+ b: string;
2208
+ aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
2209
+ orb: number;
2210
+ }[];
2211
+ }[];
2212
+ }>;
2213
+ export declare const cosmicWeatherOut: z.ZodObject<{
2214
+ utc: z.ZodString;
2215
+ patterns: z.ZodArray<z.ZodObject<{
2216
+ kind: z.ZodString;
2217
+ bodies: z.ZodArray<z.ZodString, "many">;
2218
+ apex: z.ZodOptional<z.ZodString>;
2219
+ sign: z.ZodOptional<z.ZodString>;
2220
+ house: z.ZodOptional<z.ZodNumber>;
2221
+ orb: z.ZodNumber;
2222
+ }, "strip", z.ZodTypeAny, {
2223
+ orb: number;
2224
+ bodies: string[];
2225
+ kind: string;
2226
+ house?: number | undefined;
2227
+ sign?: string | undefined;
2228
+ apex?: string | undefined;
2229
+ }, {
2230
+ orb: number;
2231
+ bodies: string[];
2232
+ kind: string;
2233
+ house?: number | undefined;
2234
+ sign?: string | undefined;
2235
+ apex?: string | undefined;
2236
+ }>, "many">;
2237
+ stationing: z.ZodArray<z.ZodObject<{
2238
+ body: z.ZodString;
2239
+ utc: z.ZodString;
2240
+ direction: z.ZodEnum<["retrograde", "direct"]>;
2241
+ }, "strip", z.ZodTypeAny, {
2242
+ utc: string;
2243
+ body: string;
2244
+ direction: "retrograde" | "direct";
2245
+ }, {
2246
+ utc: string;
2247
+ body: string;
2248
+ direction: "retrograde" | "direct";
2249
+ }>, "many">;
2250
+ moon_void_of_course: z.ZodBoolean;
2251
+ }, "strip", z.ZodTypeAny, {
2252
+ utc: string;
2253
+ patterns: {
2254
+ orb: number;
2255
+ bodies: string[];
2256
+ kind: string;
2257
+ house?: number | undefined;
2258
+ sign?: string | undefined;
2259
+ apex?: string | undefined;
2260
+ }[];
2261
+ stationing: {
2262
+ utc: string;
2263
+ body: string;
2264
+ direction: "retrograde" | "direct";
2265
+ }[];
2266
+ moon_void_of_course: boolean;
2267
+ }, {
2268
+ utc: string;
2269
+ patterns: {
2270
+ orb: number;
2271
+ bodies: string[];
2272
+ kind: string;
2273
+ house?: number | undefined;
2274
+ sign?: string | undefined;
2275
+ apex?: string | undefined;
2276
+ }[];
2277
+ stationing: {
2278
+ utc: string;
2279
+ body: string;
2280
+ direction: "retrograde" | "direct";
2281
+ }[];
2282
+ moon_void_of_course: boolean;
2283
+ }>;
1963
2284
  export declare const OUTPUT_SCHEMAS: {
1964
2285
  readonly natal_chart: z.ZodObject<{
1965
2286
  utc: z.ZodString;
@@ -3389,26 +3710,34 @@ export declare const OUTPUT_SCHEMAS: {
3389
3710
  bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
3390
3711
  sign: z.ZodString;
3391
3712
  dignity: z.ZodArray<z.ZodEnum<["domicile", "exaltation", "detriment", "fall"]>, "many">;
3713
+ score: z.ZodNumber;
3714
+ peregrine: z.ZodOptional<z.ZodBoolean>;
3392
3715
  planetary_sect: z.ZodNullable<z.ZodEnum<["diurnal", "nocturnal"]>>;
3393
3716
  in_sect: z.ZodNullable<z.ZodBoolean>;
3394
3717
  }, "strip", z.ZodTypeAny, {
3395
3718
  dignity: ("domicile" | "exaltation" | "detriment" | "fall")[];
3396
3719
  sign: string;
3720
+ score: number;
3397
3721
  planetary_sect: "diurnal" | "nocturnal" | null;
3398
3722
  in_sect: boolean | null;
3723
+ peregrine?: boolean | undefined;
3399
3724
  }, {
3400
3725
  dignity: ("domicile" | "exaltation" | "detriment" | "fall")[];
3401
3726
  sign: string;
3727
+ score: number;
3402
3728
  planetary_sect: "diurnal" | "nocturnal" | null;
3403
3729
  in_sect: boolean | null;
3730
+ peregrine?: boolean | undefined;
3404
3731
  }>>;
3405
3732
  }, "strip", z.ZodTypeAny, {
3406
3733
  utc: string;
3407
3734
  bodies: Record<string, {
3408
3735
  dignity: ("domicile" | "exaltation" | "detriment" | "fall")[];
3409
3736
  sign: string;
3737
+ score: number;
3410
3738
  planetary_sect: "diurnal" | "nocturnal" | null;
3411
3739
  in_sect: boolean | null;
3740
+ peregrine?: boolean | undefined;
3412
3741
  }>;
3413
3742
  sect: "day" | "night";
3414
3743
  }, {
@@ -3416,8 +3745,10 @@ export declare const OUTPUT_SCHEMAS: {
3416
3745
  bodies: Record<string, {
3417
3746
  dignity: ("domicile" | "exaltation" | "detriment" | "fall")[];
3418
3747
  sign: string;
3748
+ score: number;
3419
3749
  planetary_sect: "diurnal" | "nocturnal" | null;
3420
3750
  in_sect: boolean | null;
3751
+ peregrine?: boolean | undefined;
3421
3752
  }>;
3422
3753
  sect: "day" | "night";
3423
3754
  }>;
@@ -4037,6 +4368,317 @@ export declare const OUTPUT_SCHEMAS: {
4037
4368
  }[];
4038
4369
  yogakarakas: string[];
4039
4370
  }>;
4371
+ readonly aspect_patterns: z.ZodObject<{
4372
+ utc: z.ZodString;
4373
+ houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>;
4374
+ zodiac: z.ZodOptional<z.ZodEnum<["tropical", "sidereal:lahiri", "sidereal:fagan_bradley", "sidereal:krishnamurti", "sidereal:raman", "sidereal:yukteshwar", "sidereal:galcent_0sag", "sidereal:true_citra"]>>;
4375
+ patterns: z.ZodArray<z.ZodObject<{
4376
+ kind: z.ZodString;
4377
+ bodies: z.ZodArray<z.ZodString, "many">;
4378
+ apex: z.ZodOptional<z.ZodString>;
4379
+ sign: z.ZodOptional<z.ZodString>;
4380
+ house: z.ZodOptional<z.ZodNumber>;
4381
+ orb: z.ZodNumber;
4382
+ }, "strip", z.ZodTypeAny, {
4383
+ orb: number;
4384
+ bodies: string[];
4385
+ kind: string;
4386
+ house?: number | undefined;
4387
+ sign?: string | undefined;
4388
+ apex?: string | undefined;
4389
+ }, {
4390
+ orb: number;
4391
+ bodies: string[];
4392
+ kind: string;
4393
+ house?: number | undefined;
4394
+ sign?: string | undefined;
4395
+ apex?: string | undefined;
4396
+ }>, "many">;
4397
+ }, "strip", z.ZodTypeAny, {
4398
+ utc: string;
4399
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
4400
+ patterns: {
4401
+ orb: number;
4402
+ bodies: string[];
4403
+ kind: string;
4404
+ house?: number | undefined;
4405
+ sign?: string | undefined;
4406
+ apex?: string | undefined;
4407
+ }[];
4408
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | "sidereal:galcent_0sag" | "sidereal:true_citra" | undefined;
4409
+ }, {
4410
+ utc: string;
4411
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
4412
+ patterns: {
4413
+ orb: number;
4414
+ bodies: string[];
4415
+ kind: string;
4416
+ house?: number | undefined;
4417
+ sign?: string | undefined;
4418
+ apex?: string | undefined;
4419
+ }[];
4420
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | "sidereal:galcent_0sag" | "sidereal:true_citra" | undefined;
4421
+ }>;
4422
+ readonly chart_signature: z.ZodObject<{
4423
+ utc: z.ZodString;
4424
+ houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry", "koch", "regiomontanus", "campanus", "alcabitius", "morinus", "meridian", "polich_page", "vehlow"]>;
4425
+ zodiac: z.ZodOptional<z.ZodEnum<["tropical", "sidereal:lahiri", "sidereal:fagan_bradley", "sidereal:krishnamurti", "sidereal:raman", "sidereal:yukteshwar", "sidereal:galcent_0sag", "sidereal:true_citra"]>>;
4426
+ signature: z.ZodObject<{
4427
+ elements: z.ZodRecord<z.ZodString, z.ZodNumber>;
4428
+ modalities: z.ZodRecord<z.ZodString, z.ZodNumber>;
4429
+ angularity: z.ZodRecord<z.ZodString, z.ZodNumber>;
4430
+ quadrants: z.ZodRecord<z.ZodString, z.ZodNumber>;
4431
+ hemispheres: z.ZodRecord<z.ZodString, z.ZodNumber>;
4432
+ dominant: z.ZodObject<{
4433
+ element: z.ZodString;
4434
+ modality: z.ZodString;
4435
+ sign: z.ZodNullable<z.ZodString>;
4436
+ }, "strip", z.ZodTypeAny, {
4437
+ sign: string | null;
4438
+ element: string;
4439
+ modality: string;
4440
+ }, {
4441
+ sign: string | null;
4442
+ element: string;
4443
+ modality: string;
4444
+ }>;
4445
+ ruler: z.ZodNullable<z.ZodString>;
4446
+ bodies: z.ZodArray<z.ZodString, "many">;
4447
+ }, "strip", z.ZodTypeAny, {
4448
+ bodies: string[];
4449
+ ruler: string | null;
4450
+ elements: Record<string, number>;
4451
+ modalities: Record<string, number>;
4452
+ angularity: Record<string, number>;
4453
+ quadrants: Record<string, number>;
4454
+ hemispheres: Record<string, number>;
4455
+ dominant: {
4456
+ sign: string | null;
4457
+ element: string;
4458
+ modality: string;
4459
+ };
4460
+ }, {
4461
+ bodies: string[];
4462
+ ruler: string | null;
4463
+ elements: Record<string, number>;
4464
+ modalities: Record<string, number>;
4465
+ angularity: Record<string, number>;
4466
+ quadrants: Record<string, number>;
4467
+ hemispheres: Record<string, number>;
4468
+ dominant: {
4469
+ sign: string | null;
4470
+ element: string;
4471
+ modality: string;
4472
+ };
4473
+ }>;
4474
+ }, "strip", z.ZodTypeAny, {
4475
+ utc: string;
4476
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
4477
+ signature: {
4478
+ bodies: string[];
4479
+ ruler: string | null;
4480
+ elements: Record<string, number>;
4481
+ modalities: Record<string, number>;
4482
+ angularity: Record<string, number>;
4483
+ quadrants: Record<string, number>;
4484
+ hemispheres: Record<string, number>;
4485
+ dominant: {
4486
+ sign: string | null;
4487
+ element: string;
4488
+ modality: string;
4489
+ };
4490
+ };
4491
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | "sidereal:galcent_0sag" | "sidereal:true_citra" | undefined;
4492
+ }, {
4493
+ utc: string;
4494
+ houses: "placidus" | "whole_sign" | "equal" | "porphyry" | "koch" | "regiomontanus" | "campanus" | "alcabitius" | "morinus" | "meridian" | "polich_page" | "vehlow";
4495
+ signature: {
4496
+ bodies: string[];
4497
+ ruler: string | null;
4498
+ elements: Record<string, number>;
4499
+ modalities: Record<string, number>;
4500
+ angularity: Record<string, number>;
4501
+ quadrants: Record<string, number>;
4502
+ hemispheres: Record<string, number>;
4503
+ dominant: {
4504
+ sign: string | null;
4505
+ element: string;
4506
+ modality: string;
4507
+ };
4508
+ };
4509
+ zodiac?: "tropical" | "sidereal:lahiri" | "sidereal:fagan_bradley" | "sidereal:krishnamurti" | "sidereal:raman" | "sidereal:yukteshwar" | "sidereal:galcent_0sag" | "sidereal:true_citra" | undefined;
4510
+ }>;
4511
+ readonly similar_skies: z.ZodObject<{
4512
+ reference_utc: z.ZodString;
4513
+ matches: z.ZodArray<z.ZodObject<{
4514
+ utc: z.ZodString;
4515
+ similarity: z.ZodNumber;
4516
+ }, "strip", z.ZodTypeAny, {
4517
+ utc: string;
4518
+ similarity: number;
4519
+ }, {
4520
+ utc: string;
4521
+ similarity: number;
4522
+ }>, "many">;
4523
+ }, "strip", z.ZodTypeAny, {
4524
+ reference_utc: string;
4525
+ matches: {
4526
+ utc: string;
4527
+ similarity: number;
4528
+ }[];
4529
+ }, {
4530
+ reference_utc: string;
4531
+ matches: {
4532
+ utc: string;
4533
+ similarity: number;
4534
+ }[];
4535
+ }>;
4536
+ readonly electional_search: z.ZodObject<{
4537
+ start: z.ZodString;
4538
+ end: z.ZodString;
4539
+ moments: z.ZodArray<z.ZodObject<{
4540
+ utc: z.ZodString;
4541
+ score: z.ZodNumber;
4542
+ matched: z.ZodArray<z.ZodObject<{
4543
+ a: z.ZodString;
4544
+ b: z.ZodString;
4545
+ aspect: z.ZodEnum<["conjunction", "sextile", "square", "trine", "opposition"]>;
4546
+ orb: z.ZodNumber;
4547
+ applying: z.ZodBoolean;
4548
+ }, "strip", z.ZodTypeAny, {
4549
+ applying: boolean;
4550
+ a: string;
4551
+ b: string;
4552
+ aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
4553
+ orb: number;
4554
+ }, {
4555
+ applying: boolean;
4556
+ a: string;
4557
+ b: string;
4558
+ aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
4559
+ orb: number;
4560
+ }>, "many">;
4561
+ }, "strip", z.ZodTypeAny, {
4562
+ utc: string;
4563
+ score: number;
4564
+ matched: {
4565
+ applying: boolean;
4566
+ a: string;
4567
+ b: string;
4568
+ aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
4569
+ orb: number;
4570
+ }[];
4571
+ }, {
4572
+ utc: string;
4573
+ score: number;
4574
+ matched: {
4575
+ applying: boolean;
4576
+ a: string;
4577
+ b: string;
4578
+ aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
4579
+ orb: number;
4580
+ }[];
4581
+ }>, "many">;
4582
+ }, "strip", z.ZodTypeAny, {
4583
+ start: string;
4584
+ end: string;
4585
+ moments: {
4586
+ utc: string;
4587
+ score: number;
4588
+ matched: {
4589
+ applying: boolean;
4590
+ a: string;
4591
+ b: string;
4592
+ aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
4593
+ orb: number;
4594
+ }[];
4595
+ }[];
4596
+ }, {
4597
+ start: string;
4598
+ end: string;
4599
+ moments: {
4600
+ utc: string;
4601
+ score: number;
4602
+ matched: {
4603
+ applying: boolean;
4604
+ a: string;
4605
+ b: string;
4606
+ aspect: "conjunction" | "sextile" | "square" | "trine" | "opposition";
4607
+ orb: number;
4608
+ }[];
4609
+ }[];
4610
+ }>;
4611
+ readonly cosmic_weather: z.ZodObject<{
4612
+ utc: z.ZodString;
4613
+ patterns: z.ZodArray<z.ZodObject<{
4614
+ kind: z.ZodString;
4615
+ bodies: z.ZodArray<z.ZodString, "many">;
4616
+ apex: z.ZodOptional<z.ZodString>;
4617
+ sign: z.ZodOptional<z.ZodString>;
4618
+ house: z.ZodOptional<z.ZodNumber>;
4619
+ orb: z.ZodNumber;
4620
+ }, "strip", z.ZodTypeAny, {
4621
+ orb: number;
4622
+ bodies: string[];
4623
+ kind: string;
4624
+ house?: number | undefined;
4625
+ sign?: string | undefined;
4626
+ apex?: string | undefined;
4627
+ }, {
4628
+ orb: number;
4629
+ bodies: string[];
4630
+ kind: string;
4631
+ house?: number | undefined;
4632
+ sign?: string | undefined;
4633
+ apex?: string | undefined;
4634
+ }>, "many">;
4635
+ stationing: z.ZodArray<z.ZodObject<{
4636
+ body: z.ZodString;
4637
+ utc: z.ZodString;
4638
+ direction: z.ZodEnum<["retrograde", "direct"]>;
4639
+ }, "strip", z.ZodTypeAny, {
4640
+ utc: string;
4641
+ body: string;
4642
+ direction: "retrograde" | "direct";
4643
+ }, {
4644
+ utc: string;
4645
+ body: string;
4646
+ direction: "retrograde" | "direct";
4647
+ }>, "many">;
4648
+ moon_void_of_course: z.ZodBoolean;
4649
+ }, "strip", z.ZodTypeAny, {
4650
+ utc: string;
4651
+ patterns: {
4652
+ orb: number;
4653
+ bodies: string[];
4654
+ kind: string;
4655
+ house?: number | undefined;
4656
+ sign?: string | undefined;
4657
+ apex?: string | undefined;
4658
+ }[];
4659
+ stationing: {
4660
+ utc: string;
4661
+ body: string;
4662
+ direction: "retrograde" | "direct";
4663
+ }[];
4664
+ moon_void_of_course: boolean;
4665
+ }, {
4666
+ utc: string;
4667
+ patterns: {
4668
+ orb: number;
4669
+ bodies: string[];
4670
+ kind: string;
4671
+ house?: number | undefined;
4672
+ sign?: string | undefined;
4673
+ apex?: string | undefined;
4674
+ }[];
4675
+ stationing: {
4676
+ utc: string;
4677
+ body: string;
4678
+ direction: "retrograde" | "direct";
4679
+ }[];
4680
+ moon_void_of_course: boolean;
4681
+ }>;
4040
4682
  };
4041
4683
  export interface BuildServerOptions {
4042
4684
  version?: string;
@@ -17,7 +17,7 @@ import { dirname, join } from "node:path";
17
17
  import { fileURLToPath } from "node:url";
18
18
  import { createRequire } from "node:module";
19
19
  import { realpathSync } from "node:fs";
20
- import { Engine, BODIES, julianDay, mod, riseSet, crossings, lunarPhases, stations, lunarEclipses, solarEclipses, ASPECTS, DEFAULT_ORBS, SIGNS as SIGN_NAMES, dignities, normalizeHouseSystem, solarPhase, aspectPhase, planetaryHour, voidOfCourse, CAZIMI_DEG, COMBUST_DEG, UNDER_BEAMS_DEG, solarReturn, lunarReturn, progressedLongitude, directedLongitude, solarArc, progressedJd, compositeLongitudes, davisonParams, midpointLon, dignityOf, isDayChart, planetarySect, inSect, lots, HERMETIC_LOTS, profectionAt, firdaria, firdariaActive, zrRelease, zrActive, lotSpirit, lotFortune, primaryDirections, mundaneDirections, nakshatra, vimshottariDashas, vimshottariAt, yoginiDashas, yoginiAt, ashtottariDashas, ashtottariAt, varga, VARGA_DIVISIONS, yogasAt, kemadrumaAt, rajaYogasAt, dhanaYogasAt, } from "caelus";
20
+ import { Engine, BODIES, julianDay, mod, riseSet, crossings, lunarPhases, stations, lunarEclipses, solarEclipses, ASPECTS, DEFAULT_ORBS, SIGNS as SIGN_NAMES, dignities, normalizeHouseSystem, solarPhase, aspectPhase, planetaryHour, voidOfCourse, CAZIMI_DEG, COMBUST_DEG, UNDER_BEAMS_DEG, solarReturn, lunarReturn, progressedLongitude, directedLongitude, solarArc, progressedJd, compositeLongitudes, davisonParams, midpointLon, dignityOf, isDayChart, planetarySect, inSect, lots, HERMETIC_LOTS, profectionAt, firdaria, firdariaActive, zrRelease, zrActive, lotSpirit, lotFortune, primaryDirections, mundaneDirections, nakshatra, vimshottariDashas, vimshottariAt, yoginiDashas, yoginiAt, ashtottariDashas, ashtottariAt, varga, VARGA_DIVISIONS, yogasAt, kemadrumaAt, rajaYogasAt, dhanaYogasAt, detectPatterns, detectPatternsIn, chartSignature, chartFeatures, searchConfigurations, dignityScore, aspectBetween, } from "caelus";
21
21
  import { loadNodeData } from "caelus/node";
22
22
  const require = createRequire(import.meta.url);
23
23
  // Read our own version relative to this file (dist/src/server.js -> the package
@@ -339,6 +339,8 @@ export const compositeOut = z.object({
339
339
  const dignityBody = z.object({
340
340
  sign: z.string(),
341
341
  dignity: z.array(z.enum(["domicile", "exaltation", "detriment", "fall"])),
342
+ score: z.number(),
343
+ peregrine: z.boolean().optional(),
342
344
  planetary_sect: z.enum(["diurnal", "nocturnal"]).nullable(),
343
345
  in_sect: z.boolean().nullable(),
344
346
  });
@@ -482,6 +484,62 @@ export const yogasOut = z.object({
482
484
  dhana_yogas: z.array(lordPairOut),
483
485
  yogakarakas: z.array(z.string()),
484
486
  });
487
+ export const patternsOut = z.object({
488
+ utc: z.string(),
489
+ houses: z.enum(HOUSE_SYSTEMS),
490
+ zodiac: z.enum(ZODIACS).optional(),
491
+ patterns: z.array(z.object({
492
+ kind: z.string(),
493
+ bodies: z.array(z.string()),
494
+ apex: z.string().optional(),
495
+ sign: z.string().optional(),
496
+ house: z.number().int().optional(),
497
+ orb: z.number(),
498
+ })),
499
+ });
500
+ const countMap = z.record(z.string(), z.number().int());
501
+ export const signatureOut = z.object({
502
+ utc: z.string(),
503
+ houses: z.enum(HOUSE_SYSTEMS),
504
+ zodiac: z.enum(ZODIACS).optional(),
505
+ signature: z.object({
506
+ elements: countMap,
507
+ modalities: countMap,
508
+ angularity: countMap,
509
+ quadrants: countMap,
510
+ hemispheres: countMap,
511
+ dominant: z.object({ element: z.string(), modality: z.string(), sign: z.string().nullable() }),
512
+ ruler: z.string().nullable(),
513
+ bodies: z.array(z.string()),
514
+ }),
515
+ });
516
+ export const similarSkiesOut = z.object({
517
+ reference_utc: z.string(),
518
+ matches: z.array(z.object({ utc: z.string(), similarity: z.number() })),
519
+ });
520
+ export const electionalOut = z.object({
521
+ start: z.string(),
522
+ end: z.string(),
523
+ moments: z.array(z.object({
524
+ utc: z.string(),
525
+ score: z.number(),
526
+ matched: z.array(z.object({
527
+ a: z.string(), b: z.string(), aspect: aspectName, orb: z.number(),
528
+ applying: z.boolean(),
529
+ })),
530
+ })),
531
+ });
532
+ const patternRow = z.object({
533
+ kind: z.string(), bodies: z.array(z.string()),
534
+ apex: z.string().optional(), sign: z.string().optional(),
535
+ house: z.number().int().optional(), orb: z.number(),
536
+ });
537
+ export const cosmicWeatherOut = z.object({
538
+ utc: z.string(),
539
+ patterns: z.array(patternRow),
540
+ stationing: z.array(z.object({ body: z.string(), utc: z.string(), direction: z.enum(["retrograde", "direct"]) })),
541
+ moon_void_of_course: z.boolean(),
542
+ });
485
543
  export const OUTPUT_SCHEMAS = {
486
544
  natal_chart: chartOut,
487
545
  current_sky: chartOut,
@@ -505,6 +563,11 @@ export const OUTPUT_SCHEMAS = {
505
563
  dasha: dashaOut,
506
564
  vargas: vargasOut,
507
565
  yogas: yogasOut,
566
+ aspect_patterns: patternsOut,
567
+ chart_signature: signatureOut,
568
+ similar_skies: similarSkiesOut,
569
+ electional_search: electionalOut,
570
+ cosmic_weather: cosmicWeatherOut,
508
571
  };
509
572
  export function buildServer(engine = defaultEngine(), opts = {}) {
510
573
  const version = opts.version ?? VERSION;
@@ -903,7 +966,7 @@ export function buildServer(engine = defaultEngine(), opts = {}) {
903
966
  });
904
967
  });
905
968
  server.registerTool("dignities", {
906
- description: "Essential dignity and sect for the seven traditional planets at a moment and place. Per planet: its sign, any essential dignity (domicile/exaltation/detriment/fall), its planetary sect (diurnal/nocturnal, null for Mercury), and whether it is in sect given a day or night chart. The chart is day when the Sun is above the horizon — so lat+lon are required.",
969
+ description: "Essential dignity and sect for the seven traditional planets at a moment and place. Per planet: its sign, any essential dignity (domicile/exaltation/detriment/fall), its weighted essential-dignity score (Lilly: rulership 5, exaltation 4, triplicity 3, term 2, face 1; detriment -5, fall -4) with a peregrine flag, its planetary sect (diurnal/nocturnal, null for Mercury), and whether it is in sect given a day or night chart. The chart is day when the Sun is above the horizon — so lat+lon are required.",
907
970
  inputSchema: { ...birth, zodiac: zodiacSchema },
908
971
  }, async ({ date, lat, lon, zodiac }) => {
909
972
  const jd = jdFromIso(date);
@@ -911,9 +974,13 @@ export function buildServer(engine = defaultEngine(), opts = {}) {
911
974
  const bodies = {};
912
975
  for (const b of TRADITIONAL) {
913
976
  const lonB = engine.longitude(b, jd, { zodiac });
977
+ // Weighted essential-dignity score (Lilly) for this planet at its place.
978
+ const ds = dignityScore(b, lonB, dayChart ? "day" : "night");
914
979
  bodies[b] = {
915
980
  sign: SIGNS[Math.floor(lonB / 30)],
916
981
  dignity: dignityOf(engine, b, jd, zodiac),
982
+ score: ds.total,
983
+ ...(ds.peregrine ? { peregrine: true } : {}),
917
984
  planetary_sect: planetarySect(b),
918
985
  in_sect: inSect(b, dayChart),
919
986
  };
@@ -1179,6 +1246,120 @@ export function buildServer(engine = defaultEngine(), opts = {}) {
1179
1246
  yogakarakas,
1180
1247
  });
1181
1248
  });
1249
+ server.registerTool("aspect_patterns", {
1250
+ description: "Classical aspect configurations in a chart: T-squares, grand trines, grand crosses, yods, kites, mystic rectangles, and stelliums by sign and by house. Each is a structured object with the participating bodies and the worst defining-aspect orb; T-squares and yods also name the apex, stelliums their sign or house. Reported patterns are maximal — a grand cross hides the T-squares it contains, a kite its grand trine. Pure geometry (engine orbs plus a quincunx for yods), no interpretation. Needs date, lat, lon.",
1251
+ inputSchema: { ...birth, house_system: houseSys, zodiac: zodiacSchema },
1252
+ }, async ({ date, lat, lon, house_system, zodiac }) => {
1253
+ const d = new Date(date);
1254
+ if (Number.isNaN(d.getTime()))
1255
+ throw new Error(`Invalid date: ${date}`);
1256
+ const c = engine.chart(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), lat, lon, { houseSystem: normalizeHouseSystem(house_system), zodiac });
1257
+ return text({
1258
+ utc: date, houses: c.houseSystem,
1259
+ ...(zodiac !== "tropical" ? { zodiac } : {}),
1260
+ patterns: detectPatterns(c),
1261
+ });
1262
+ });
1263
+ server.registerTool("chart_signature", {
1264
+ description: "A chart's structural signature as plain counts: element, modality, angularity, quadrant, and hemisphere distributions over the bodies; the dominant element, modality, and most-occupied sign; and the classical chart ruler (the ruler of the Ascendant's sign). Counts only, no interpretation — a compact summary for emphasis and comparison. Needs date, lat, lon.",
1265
+ inputSchema: { ...birth, house_system: houseSys, zodiac: zodiacSchema },
1266
+ }, async ({ date, lat, lon, house_system, zodiac }) => {
1267
+ const d = new Date(date);
1268
+ if (Number.isNaN(d.getTime()))
1269
+ throw new Error(`Invalid date: ${date}`);
1270
+ const c = engine.chart(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), lat, lon, { houseSystem: normalizeHouseSystem(house_system), zodiac });
1271
+ return text({
1272
+ utc: date, houses: c.houseSystem,
1273
+ ...(zodiac !== "tropical" ? { zodiac } : {}),
1274
+ signature: chartSignature(c),
1275
+ });
1276
+ });
1277
+ server.registerTool("similar_skies", {
1278
+ description: "Find when the sky most resembled a reference moment. Builds a feature vector for the reference date's planetary configuration and scans a window for the closest matches by cosine similarity (1.0 = identical configuration). Answers 'when did the sky last look like this?' for transit echoes and historical analogues. Returns the top matches with their similarity, highest first.",
1279
+ inputSchema: {
1280
+ reference_date: z.string().describe("UTC ISO date whose sky is the target to match"),
1281
+ start: z.string().describe("UTC ISO start of the search window"),
1282
+ end: z.string().describe("UTC ISO end of the search window"),
1283
+ step_days: z.number().positive().default(1).describe("sampling step in days (default 1)"),
1284
+ limit: z.number().int().positive().default(10).describe("max matches to return (default 10)"),
1285
+ },
1286
+ }, async ({ reference_date, start, end, step_days, limit }) => {
1287
+ const target = chartFeatures(engine, jdFromIso(reference_date));
1288
+ const matches = searchConfigurations(engine, target, {
1289
+ start: jdFromIso(start), end: jdFromIso(end), step: step_days, limit,
1290
+ });
1291
+ return text({
1292
+ reference_utc: reference_date,
1293
+ matches: matches.map((m) => ({ utc: isoFromJd(m.jd), similarity: Math.round(m.score * 1e4) / 1e4 })),
1294
+ });
1295
+ });
1296
+ server.registerTool("electional_search", {
1297
+ description: "Rank moments in a window for an electional aim. Samples the window and scores each instant by how closely a set of wanted body-to-body aspects is satisfied (tighter and applying aspects score higher), optionally penalizing a void-of-course Moon. Returns the top moments with the aspects that matched. Body-to-body only; for aspects to the angles, compute the chart at a candidate moment.",
1298
+ inputSchema: {
1299
+ start: z.string().describe("UTC ISO start of the window"),
1300
+ end: z.string().describe("UTC ISO end of the window"),
1301
+ wanted: z.array(z.object({
1302
+ a: z.string().describe("first body, snake_case"),
1303
+ b: z.string().describe("second body, snake_case"),
1304
+ aspect: aspectName,
1305
+ })).min(1).describe("aspects to reward when close to exact"),
1306
+ step_hours: z.number().positive().default(6).describe("sampling step in hours (default 6)"),
1307
+ avoid_void_moon: z.boolean().default(false).describe("penalize a void-of-course Moon"),
1308
+ limit: z.number().int().positive().default(10).describe("max moments to return (default 10)"),
1309
+ zodiac: zodiacSchema,
1310
+ },
1311
+ }, async ({ start, end, wanted, step_hours, avoid_void_moon, limit, zodiac }) => {
1312
+ const startJd = jdFromIso(start);
1313
+ const endJd = jdFromIso(end);
1314
+ const stepJd = step_hours / 24;
1315
+ const moments = [];
1316
+ for (let jd = startJd; jd <= endJd + 1e-9; jd += stepJd) {
1317
+ const matched = [];
1318
+ let score = 0;
1319
+ for (const w of wanted) {
1320
+ const m = aspectBetween(engine, w.a, w.b, jd, zodiac);
1321
+ if (m && m.aspect === w.aspect) {
1322
+ const maxOrb = DEFAULT_ORBS[w.aspect] ?? 6;
1323
+ const orb = Math.abs(m.orb); // aspectBetween returns a signed orb
1324
+ const applying = m.phase === "applying";
1325
+ score += Math.max(0, 1 - orb / maxOrb) + (applying ? 0.3 : 0);
1326
+ matched.push({ a: w.a, b: w.b, aspect: w.aspect, orb: r2(orb), applying });
1327
+ }
1328
+ }
1329
+ if (avoid_void_moon && voidOfCourse(engine, jd, zodiac).isVoid)
1330
+ score -= 1;
1331
+ if (matched.length > 0)
1332
+ moments.push({ utc: isoFromJd(jd), score: r2(score), matched });
1333
+ }
1334
+ moments.sort((a, b) => b.score - a.score);
1335
+ return text({ start, end, moments: moments.slice(0, limit) });
1336
+ });
1337
+ server.registerTool("cosmic_weather", {
1338
+ description: "The mundane sky on a date: the active aspect configurations among the transiting planets (T-squares, grand trines, grand crosses, yods, kites, mystic rectangles, stelliums by sign), any planet stationing within a window, and whether the Moon is void of course. A 'cosmic weather' snapshot; no birth chart or location needed.",
1339
+ inputSchema: {
1340
+ date: z.string().describe("UTC ISO date"),
1341
+ window_days: z.number().positive().default(7).describe("days either side to scan for stations (default 7)"),
1342
+ zodiac: zodiacSchema,
1343
+ },
1344
+ }, async ({ date, window_days, zodiac }) => {
1345
+ const jd = jdFromIso(date);
1346
+ const bodies = {};
1347
+ for (const b of BODIES)
1348
+ bodies[b] = { lon: engine.longitude(b, jd, { zodiac }) };
1349
+ const stationing = [];
1350
+ for (const b of ["mercury", "venus", "mars", "jupiter", "saturn", "uranus", "neptune", "pluto"]) {
1351
+ for (const [sjd, direction] of stations(engine, b, jd - window_days, jd + window_days, 2)) {
1352
+ stationing.push({ body: b, utc: isoFromJd(sjd), direction });
1353
+ }
1354
+ }
1355
+ stationing.sort((x, y) => (x.utc < y.utc ? -1 : 1));
1356
+ return text({
1357
+ utc: date,
1358
+ patterns: detectPatternsIn(bodies),
1359
+ stationing,
1360
+ moon_void_of_course: voidOfCourse(engine, jd, zodiac).isVoid,
1361
+ });
1362
+ });
1182
1363
  // --------------------------------------------------------- resources
1183
1364
  // Chart wheel widget (MCP Apps / Apps SDK). The CSP allowlists the embed
1184
1365
  // origin only for loading the widget script (resourceDomains) — no
@@ -1259,6 +1440,16 @@ if (isMain) {
1259
1440
  const server = buildServer();
1260
1441
  const transport = new StdioServerTransport();
1261
1442
  await server.connect(transport);
1262
- console.error("caelus-mcp listening on stdio");
1443
+ // Caelus under the velificatio, in stderr's ASCII. stdout is the protocol
1444
+ // channel, so the banner goes to stderr where hosts collect logs.
1445
+ const arch = String.raw `
1446
+ .-~~~~~-.
1447
+ .' * . '.
1448
+ / ( o o ) \
1449
+ | > |
1450
+ \ \___/ /
1451
+ '. .'
1452
+ '-_____-'`;
1453
+ console.error(`${arch}\n caelus-mcp v${VERSION} · western + vedic ephemeris · MIT\n listening on stdio\n`);
1263
1454
  })();
1264
1455
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "caelus-mcp",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "mcpName": "io.github.heavyblotto/caelus-mcp",
5
5
  "description": "MCP server for caelus chart computation.",
6
6
  "type": "module",
@@ -15,7 +15,7 @@
15
15
  "dependencies": {
16
16
  "@modelcontextprotocol/sdk": "^1.26.0",
17
17
  "zod": "^3.24.0",
18
- "caelus": "^0.15.0"
18
+ "caelus": "^0.16.0"
19
19
  },
20
20
  "devDependencies": {
21
21
  "ajv": "^8.17.1"