caelus-mcp 0.1.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/dist/src/server.d.ts +956 -0
- package/dist/src/server.js +320 -0
- package/package.json +39 -0
|
@@ -0,0 +1,956 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* caelus-mcp -- MCP server for the caelus ephemeris engine.
|
|
4
|
+
*
|
|
5
|
+
* Design (per 2026 MCP practice): one bounded context (chart computation),
|
|
6
|
+
* a small curated tool surface (6 outcome-level tools, not API wrappers),
|
|
7
|
+
* and token-frugal outputs (positions to 0.01 deg, terse keys, no prose --
|
|
8
|
+
* the model does the interpreting, the server does the math).
|
|
9
|
+
*
|
|
10
|
+
* Transport: stdio (this file). The same buildServer() can be mounted on
|
|
11
|
+
* Streamable HTTP for the hosted ephemengine.com deployment.
|
|
12
|
+
*/
|
|
13
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
14
|
+
import { z } from "zod";
|
|
15
|
+
export declare const chartOut: z.ZodObject<{
|
|
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"]>>;
|
|
19
|
+
houses_fallback_reason: z.ZodOptional<z.ZodString>;
|
|
20
|
+
bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
21
|
+
lon: z.ZodNumber;
|
|
22
|
+
pos: z.ZodString;
|
|
23
|
+
house: z.ZodNumber;
|
|
24
|
+
speed: z.ZodNumber;
|
|
25
|
+
rx: z.ZodOptional<z.ZodBoolean>;
|
|
26
|
+
}, "strip", z.ZodTypeAny, {
|
|
27
|
+
lon: number;
|
|
28
|
+
pos: string;
|
|
29
|
+
house: number;
|
|
30
|
+
speed: number;
|
|
31
|
+
rx?: boolean | undefined;
|
|
32
|
+
}, {
|
|
33
|
+
lon: number;
|
|
34
|
+
pos: string;
|
|
35
|
+
house: number;
|
|
36
|
+
speed: number;
|
|
37
|
+
rx?: boolean | undefined;
|
|
38
|
+
}>>;
|
|
39
|
+
angles: z.ZodObject<{
|
|
40
|
+
asc: z.ZodNumber;
|
|
41
|
+
ascPos: z.ZodString;
|
|
42
|
+
mc: z.ZodNumber;
|
|
43
|
+
mcPos: z.ZodString;
|
|
44
|
+
}, "strip", z.ZodTypeAny, {
|
|
45
|
+
asc: number;
|
|
46
|
+
ascPos: string;
|
|
47
|
+
mc: number;
|
|
48
|
+
mcPos: string;
|
|
49
|
+
}, {
|
|
50
|
+
asc: number;
|
|
51
|
+
ascPos: string;
|
|
52
|
+
mc: number;
|
|
53
|
+
mcPos: string;
|
|
54
|
+
}>;
|
|
55
|
+
cusps: z.ZodArray<z.ZodNumber, "many">;
|
|
56
|
+
aspects: z.ZodArray<z.ZodString, "many">;
|
|
57
|
+
}, "strip", z.ZodTypeAny, {
|
|
58
|
+
utc: string;
|
|
59
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
60
|
+
bodies: Record<string, {
|
|
61
|
+
lon: number;
|
|
62
|
+
pos: string;
|
|
63
|
+
house: number;
|
|
64
|
+
speed: number;
|
|
65
|
+
rx?: boolean | undefined;
|
|
66
|
+
}>;
|
|
67
|
+
angles: {
|
|
68
|
+
asc: number;
|
|
69
|
+
ascPos: string;
|
|
70
|
+
mc: number;
|
|
71
|
+
mcPos: string;
|
|
72
|
+
};
|
|
73
|
+
cusps: number[];
|
|
74
|
+
aspects: string[];
|
|
75
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
76
|
+
houses_fallback_reason?: string | undefined;
|
|
77
|
+
}, {
|
|
78
|
+
utc: string;
|
|
79
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
80
|
+
bodies: Record<string, {
|
|
81
|
+
lon: number;
|
|
82
|
+
pos: string;
|
|
83
|
+
house: number;
|
|
84
|
+
speed: number;
|
|
85
|
+
rx?: boolean | undefined;
|
|
86
|
+
}>;
|
|
87
|
+
angles: {
|
|
88
|
+
asc: number;
|
|
89
|
+
ascPos: string;
|
|
90
|
+
mc: number;
|
|
91
|
+
mcPos: string;
|
|
92
|
+
};
|
|
93
|
+
cusps: number[];
|
|
94
|
+
aspects: string[];
|
|
95
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
96
|
+
houses_fallback_reason?: string | undefined;
|
|
97
|
+
}>;
|
|
98
|
+
export declare const transitsOut: z.ZodObject<{
|
|
99
|
+
transit_utc: z.ZodString;
|
|
100
|
+
transiting: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
101
|
+
pos: z.ZodString;
|
|
102
|
+
natal_house: z.ZodNumber;
|
|
103
|
+
rx: z.ZodOptional<z.ZodBoolean>;
|
|
104
|
+
}, "strip", z.ZodTypeAny, {
|
|
105
|
+
pos: string;
|
|
106
|
+
natal_house: number;
|
|
107
|
+
rx?: boolean | undefined;
|
|
108
|
+
}, {
|
|
109
|
+
pos: string;
|
|
110
|
+
natal_house: number;
|
|
111
|
+
rx?: boolean | undefined;
|
|
112
|
+
}>>;
|
|
113
|
+
aspects_to_natal: z.ZodArray<z.ZodString, "many">;
|
|
114
|
+
}, "strip", z.ZodTypeAny, {
|
|
115
|
+
transit_utc: string;
|
|
116
|
+
transiting: Record<string, {
|
|
117
|
+
pos: string;
|
|
118
|
+
natal_house: number;
|
|
119
|
+
rx?: boolean | undefined;
|
|
120
|
+
}>;
|
|
121
|
+
aspects_to_natal: string[];
|
|
122
|
+
}, {
|
|
123
|
+
transit_utc: string;
|
|
124
|
+
transiting: Record<string, {
|
|
125
|
+
pos: string;
|
|
126
|
+
natal_house: number;
|
|
127
|
+
rx?: boolean | undefined;
|
|
128
|
+
}>;
|
|
129
|
+
aspects_to_natal: string[];
|
|
130
|
+
}>;
|
|
131
|
+
export declare const synastryOut: z.ZodObject<{
|
|
132
|
+
a: z.ZodObject<{
|
|
133
|
+
utc: z.ZodString;
|
|
134
|
+
houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>;
|
|
135
|
+
houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>>;
|
|
136
|
+
houses_fallback_reason: z.ZodOptional<z.ZodString>;
|
|
137
|
+
bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
138
|
+
lon: z.ZodNumber;
|
|
139
|
+
pos: z.ZodString;
|
|
140
|
+
house: z.ZodNumber;
|
|
141
|
+
speed: z.ZodNumber;
|
|
142
|
+
rx: z.ZodOptional<z.ZodBoolean>;
|
|
143
|
+
}, "strip", z.ZodTypeAny, {
|
|
144
|
+
lon: number;
|
|
145
|
+
pos: string;
|
|
146
|
+
house: number;
|
|
147
|
+
speed: number;
|
|
148
|
+
rx?: boolean | undefined;
|
|
149
|
+
}, {
|
|
150
|
+
lon: number;
|
|
151
|
+
pos: string;
|
|
152
|
+
house: number;
|
|
153
|
+
speed: number;
|
|
154
|
+
rx?: boolean | undefined;
|
|
155
|
+
}>>;
|
|
156
|
+
angles: z.ZodObject<{
|
|
157
|
+
asc: z.ZodNumber;
|
|
158
|
+
ascPos: z.ZodString;
|
|
159
|
+
mc: z.ZodNumber;
|
|
160
|
+
mcPos: z.ZodString;
|
|
161
|
+
}, "strip", z.ZodTypeAny, {
|
|
162
|
+
asc: number;
|
|
163
|
+
ascPos: string;
|
|
164
|
+
mc: number;
|
|
165
|
+
mcPos: string;
|
|
166
|
+
}, {
|
|
167
|
+
asc: number;
|
|
168
|
+
ascPos: string;
|
|
169
|
+
mc: number;
|
|
170
|
+
mcPos: string;
|
|
171
|
+
}>;
|
|
172
|
+
cusps: z.ZodArray<z.ZodNumber, "many">;
|
|
173
|
+
aspects: z.ZodArray<z.ZodString, "many">;
|
|
174
|
+
}, "strip", z.ZodTypeAny, {
|
|
175
|
+
utc: string;
|
|
176
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
177
|
+
bodies: Record<string, {
|
|
178
|
+
lon: number;
|
|
179
|
+
pos: string;
|
|
180
|
+
house: number;
|
|
181
|
+
speed: number;
|
|
182
|
+
rx?: boolean | undefined;
|
|
183
|
+
}>;
|
|
184
|
+
angles: {
|
|
185
|
+
asc: number;
|
|
186
|
+
ascPos: string;
|
|
187
|
+
mc: number;
|
|
188
|
+
mcPos: string;
|
|
189
|
+
};
|
|
190
|
+
cusps: number[];
|
|
191
|
+
aspects: string[];
|
|
192
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
193
|
+
houses_fallback_reason?: string | undefined;
|
|
194
|
+
}, {
|
|
195
|
+
utc: string;
|
|
196
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
197
|
+
bodies: Record<string, {
|
|
198
|
+
lon: number;
|
|
199
|
+
pos: string;
|
|
200
|
+
house: number;
|
|
201
|
+
speed: number;
|
|
202
|
+
rx?: boolean | undefined;
|
|
203
|
+
}>;
|
|
204
|
+
angles: {
|
|
205
|
+
asc: number;
|
|
206
|
+
ascPos: string;
|
|
207
|
+
mc: number;
|
|
208
|
+
mcPos: string;
|
|
209
|
+
};
|
|
210
|
+
cusps: number[];
|
|
211
|
+
aspects: string[];
|
|
212
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
213
|
+
houses_fallback_reason?: string | undefined;
|
|
214
|
+
}>;
|
|
215
|
+
b: z.ZodObject<{
|
|
216
|
+
utc: z.ZodString;
|
|
217
|
+
houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>;
|
|
218
|
+
houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>>;
|
|
219
|
+
houses_fallback_reason: z.ZodOptional<z.ZodString>;
|
|
220
|
+
bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
221
|
+
lon: z.ZodNumber;
|
|
222
|
+
pos: z.ZodString;
|
|
223
|
+
house: z.ZodNumber;
|
|
224
|
+
speed: z.ZodNumber;
|
|
225
|
+
rx: z.ZodOptional<z.ZodBoolean>;
|
|
226
|
+
}, "strip", z.ZodTypeAny, {
|
|
227
|
+
lon: number;
|
|
228
|
+
pos: string;
|
|
229
|
+
house: number;
|
|
230
|
+
speed: number;
|
|
231
|
+
rx?: boolean | undefined;
|
|
232
|
+
}, {
|
|
233
|
+
lon: number;
|
|
234
|
+
pos: string;
|
|
235
|
+
house: number;
|
|
236
|
+
speed: number;
|
|
237
|
+
rx?: boolean | undefined;
|
|
238
|
+
}>>;
|
|
239
|
+
angles: z.ZodObject<{
|
|
240
|
+
asc: z.ZodNumber;
|
|
241
|
+
ascPos: z.ZodString;
|
|
242
|
+
mc: z.ZodNumber;
|
|
243
|
+
mcPos: z.ZodString;
|
|
244
|
+
}, "strip", z.ZodTypeAny, {
|
|
245
|
+
asc: number;
|
|
246
|
+
ascPos: string;
|
|
247
|
+
mc: number;
|
|
248
|
+
mcPos: string;
|
|
249
|
+
}, {
|
|
250
|
+
asc: number;
|
|
251
|
+
ascPos: string;
|
|
252
|
+
mc: number;
|
|
253
|
+
mcPos: string;
|
|
254
|
+
}>;
|
|
255
|
+
cusps: z.ZodArray<z.ZodNumber, "many">;
|
|
256
|
+
aspects: z.ZodArray<z.ZodString, "many">;
|
|
257
|
+
}, "strip", z.ZodTypeAny, {
|
|
258
|
+
utc: string;
|
|
259
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
260
|
+
bodies: Record<string, {
|
|
261
|
+
lon: number;
|
|
262
|
+
pos: string;
|
|
263
|
+
house: number;
|
|
264
|
+
speed: number;
|
|
265
|
+
rx?: boolean | undefined;
|
|
266
|
+
}>;
|
|
267
|
+
angles: {
|
|
268
|
+
asc: number;
|
|
269
|
+
ascPos: string;
|
|
270
|
+
mc: number;
|
|
271
|
+
mcPos: string;
|
|
272
|
+
};
|
|
273
|
+
cusps: number[];
|
|
274
|
+
aspects: string[];
|
|
275
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
276
|
+
houses_fallback_reason?: string | undefined;
|
|
277
|
+
}, {
|
|
278
|
+
utc: string;
|
|
279
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
280
|
+
bodies: Record<string, {
|
|
281
|
+
lon: number;
|
|
282
|
+
pos: string;
|
|
283
|
+
house: number;
|
|
284
|
+
speed: number;
|
|
285
|
+
rx?: boolean | undefined;
|
|
286
|
+
}>;
|
|
287
|
+
angles: {
|
|
288
|
+
asc: number;
|
|
289
|
+
ascPos: string;
|
|
290
|
+
mc: number;
|
|
291
|
+
mcPos: string;
|
|
292
|
+
};
|
|
293
|
+
cusps: number[];
|
|
294
|
+
aspects: string[];
|
|
295
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
296
|
+
houses_fallback_reason?: string | undefined;
|
|
297
|
+
}>;
|
|
298
|
+
inter_aspects: z.ZodArray<z.ZodString, "many">;
|
|
299
|
+
a_planets_in_b_houses: z.ZodRecord<z.ZodString, z.ZodNumber>;
|
|
300
|
+
b_planets_in_a_houses: z.ZodRecord<z.ZodString, z.ZodNumber>;
|
|
301
|
+
}, "strip", z.ZodTypeAny, {
|
|
302
|
+
a: {
|
|
303
|
+
utc: string;
|
|
304
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
305
|
+
bodies: Record<string, {
|
|
306
|
+
lon: number;
|
|
307
|
+
pos: string;
|
|
308
|
+
house: number;
|
|
309
|
+
speed: number;
|
|
310
|
+
rx?: boolean | undefined;
|
|
311
|
+
}>;
|
|
312
|
+
angles: {
|
|
313
|
+
asc: number;
|
|
314
|
+
ascPos: string;
|
|
315
|
+
mc: number;
|
|
316
|
+
mcPos: string;
|
|
317
|
+
};
|
|
318
|
+
cusps: number[];
|
|
319
|
+
aspects: string[];
|
|
320
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
321
|
+
houses_fallback_reason?: string | undefined;
|
|
322
|
+
};
|
|
323
|
+
b: {
|
|
324
|
+
utc: string;
|
|
325
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
326
|
+
bodies: Record<string, {
|
|
327
|
+
lon: number;
|
|
328
|
+
pos: string;
|
|
329
|
+
house: number;
|
|
330
|
+
speed: number;
|
|
331
|
+
rx?: boolean | undefined;
|
|
332
|
+
}>;
|
|
333
|
+
angles: {
|
|
334
|
+
asc: number;
|
|
335
|
+
ascPos: string;
|
|
336
|
+
mc: number;
|
|
337
|
+
mcPos: string;
|
|
338
|
+
};
|
|
339
|
+
cusps: number[];
|
|
340
|
+
aspects: string[];
|
|
341
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
342
|
+
houses_fallback_reason?: string | undefined;
|
|
343
|
+
};
|
|
344
|
+
inter_aspects: string[];
|
|
345
|
+
a_planets_in_b_houses: Record<string, number>;
|
|
346
|
+
b_planets_in_a_houses: Record<string, number>;
|
|
347
|
+
}, {
|
|
348
|
+
a: {
|
|
349
|
+
utc: string;
|
|
350
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
351
|
+
bodies: Record<string, {
|
|
352
|
+
lon: number;
|
|
353
|
+
pos: string;
|
|
354
|
+
house: number;
|
|
355
|
+
speed: number;
|
|
356
|
+
rx?: boolean | undefined;
|
|
357
|
+
}>;
|
|
358
|
+
angles: {
|
|
359
|
+
asc: number;
|
|
360
|
+
ascPos: string;
|
|
361
|
+
mc: number;
|
|
362
|
+
mcPos: string;
|
|
363
|
+
};
|
|
364
|
+
cusps: number[];
|
|
365
|
+
aspects: string[];
|
|
366
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
367
|
+
houses_fallback_reason?: string | undefined;
|
|
368
|
+
};
|
|
369
|
+
b: {
|
|
370
|
+
utc: string;
|
|
371
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
372
|
+
bodies: Record<string, {
|
|
373
|
+
lon: number;
|
|
374
|
+
pos: string;
|
|
375
|
+
house: number;
|
|
376
|
+
speed: number;
|
|
377
|
+
rx?: boolean | undefined;
|
|
378
|
+
}>;
|
|
379
|
+
angles: {
|
|
380
|
+
asc: number;
|
|
381
|
+
ascPos: string;
|
|
382
|
+
mc: number;
|
|
383
|
+
mcPos: string;
|
|
384
|
+
};
|
|
385
|
+
cusps: number[];
|
|
386
|
+
aspects: string[];
|
|
387
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
388
|
+
houses_fallback_reason?: string | undefined;
|
|
389
|
+
};
|
|
390
|
+
inter_aspects: string[];
|
|
391
|
+
a_planets_in_b_houses: Record<string, number>;
|
|
392
|
+
b_planets_in_a_houses: Record<string, number>;
|
|
393
|
+
}>;
|
|
394
|
+
export declare const findAspectDatesOut: z.ZodObject<{
|
|
395
|
+
query: z.ZodString;
|
|
396
|
+
hits: z.ZodArray<z.ZodString, "many">;
|
|
397
|
+
}, "strip", z.ZodTypeAny, {
|
|
398
|
+
query: string;
|
|
399
|
+
hits: string[];
|
|
400
|
+
}, {
|
|
401
|
+
query: string;
|
|
402
|
+
hits: string[];
|
|
403
|
+
}>;
|
|
404
|
+
export declare const rectificationGridOut: z.ZodObject<{
|
|
405
|
+
date: z.ZodString;
|
|
406
|
+
lat: z.ZodNumber;
|
|
407
|
+
lon: z.ZodNumber;
|
|
408
|
+
asc_sign_changes: z.ZodArray<z.ZodString, "many">;
|
|
409
|
+
grid: z.ZodArray<z.ZodObject<{
|
|
410
|
+
utc: z.ZodString;
|
|
411
|
+
asc: z.ZodString;
|
|
412
|
+
mc: z.ZodString;
|
|
413
|
+
}, "strip", z.ZodTypeAny, {
|
|
414
|
+
utc: string;
|
|
415
|
+
asc: string;
|
|
416
|
+
mc: string;
|
|
417
|
+
}, {
|
|
418
|
+
utc: string;
|
|
419
|
+
asc: string;
|
|
420
|
+
mc: string;
|
|
421
|
+
}>, "many">;
|
|
422
|
+
}, "strip", z.ZodTypeAny, {
|
|
423
|
+
lon: number;
|
|
424
|
+
date: string;
|
|
425
|
+
lat: number;
|
|
426
|
+
asc_sign_changes: string[];
|
|
427
|
+
grid: {
|
|
428
|
+
utc: string;
|
|
429
|
+
asc: string;
|
|
430
|
+
mc: string;
|
|
431
|
+
}[];
|
|
432
|
+
}, {
|
|
433
|
+
lon: number;
|
|
434
|
+
date: string;
|
|
435
|
+
lat: number;
|
|
436
|
+
asc_sign_changes: string[];
|
|
437
|
+
grid: {
|
|
438
|
+
utc: string;
|
|
439
|
+
asc: string;
|
|
440
|
+
mc: string;
|
|
441
|
+
}[];
|
|
442
|
+
}>;
|
|
443
|
+
export declare const OUTPUT_SCHEMAS: {
|
|
444
|
+
readonly natal_chart: z.ZodObject<{
|
|
445
|
+
utc: z.ZodString;
|
|
446
|
+
houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>;
|
|
447
|
+
houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>>;
|
|
448
|
+
houses_fallback_reason: z.ZodOptional<z.ZodString>;
|
|
449
|
+
bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
450
|
+
lon: z.ZodNumber;
|
|
451
|
+
pos: z.ZodString;
|
|
452
|
+
house: z.ZodNumber;
|
|
453
|
+
speed: z.ZodNumber;
|
|
454
|
+
rx: z.ZodOptional<z.ZodBoolean>;
|
|
455
|
+
}, "strip", z.ZodTypeAny, {
|
|
456
|
+
lon: number;
|
|
457
|
+
pos: string;
|
|
458
|
+
house: number;
|
|
459
|
+
speed: number;
|
|
460
|
+
rx?: boolean | undefined;
|
|
461
|
+
}, {
|
|
462
|
+
lon: number;
|
|
463
|
+
pos: string;
|
|
464
|
+
house: number;
|
|
465
|
+
speed: number;
|
|
466
|
+
rx?: boolean | undefined;
|
|
467
|
+
}>>;
|
|
468
|
+
angles: z.ZodObject<{
|
|
469
|
+
asc: z.ZodNumber;
|
|
470
|
+
ascPos: z.ZodString;
|
|
471
|
+
mc: z.ZodNumber;
|
|
472
|
+
mcPos: z.ZodString;
|
|
473
|
+
}, "strip", z.ZodTypeAny, {
|
|
474
|
+
asc: number;
|
|
475
|
+
ascPos: string;
|
|
476
|
+
mc: number;
|
|
477
|
+
mcPos: string;
|
|
478
|
+
}, {
|
|
479
|
+
asc: number;
|
|
480
|
+
ascPos: string;
|
|
481
|
+
mc: number;
|
|
482
|
+
mcPos: string;
|
|
483
|
+
}>;
|
|
484
|
+
cusps: z.ZodArray<z.ZodNumber, "many">;
|
|
485
|
+
aspects: z.ZodArray<z.ZodString, "many">;
|
|
486
|
+
}, "strip", z.ZodTypeAny, {
|
|
487
|
+
utc: string;
|
|
488
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
489
|
+
bodies: Record<string, {
|
|
490
|
+
lon: number;
|
|
491
|
+
pos: string;
|
|
492
|
+
house: number;
|
|
493
|
+
speed: number;
|
|
494
|
+
rx?: boolean | undefined;
|
|
495
|
+
}>;
|
|
496
|
+
angles: {
|
|
497
|
+
asc: number;
|
|
498
|
+
ascPos: string;
|
|
499
|
+
mc: number;
|
|
500
|
+
mcPos: string;
|
|
501
|
+
};
|
|
502
|
+
cusps: number[];
|
|
503
|
+
aspects: string[];
|
|
504
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
505
|
+
houses_fallback_reason?: string | undefined;
|
|
506
|
+
}, {
|
|
507
|
+
utc: string;
|
|
508
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
509
|
+
bodies: Record<string, {
|
|
510
|
+
lon: number;
|
|
511
|
+
pos: string;
|
|
512
|
+
house: number;
|
|
513
|
+
speed: number;
|
|
514
|
+
rx?: boolean | undefined;
|
|
515
|
+
}>;
|
|
516
|
+
angles: {
|
|
517
|
+
asc: number;
|
|
518
|
+
ascPos: string;
|
|
519
|
+
mc: number;
|
|
520
|
+
mcPos: string;
|
|
521
|
+
};
|
|
522
|
+
cusps: number[];
|
|
523
|
+
aspects: string[];
|
|
524
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
525
|
+
houses_fallback_reason?: string | undefined;
|
|
526
|
+
}>;
|
|
527
|
+
readonly current_sky: z.ZodObject<{
|
|
528
|
+
utc: z.ZodString;
|
|
529
|
+
houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>;
|
|
530
|
+
houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>>;
|
|
531
|
+
houses_fallback_reason: z.ZodOptional<z.ZodString>;
|
|
532
|
+
bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
533
|
+
lon: z.ZodNumber;
|
|
534
|
+
pos: z.ZodString;
|
|
535
|
+
house: z.ZodNumber;
|
|
536
|
+
speed: z.ZodNumber;
|
|
537
|
+
rx: z.ZodOptional<z.ZodBoolean>;
|
|
538
|
+
}, "strip", z.ZodTypeAny, {
|
|
539
|
+
lon: number;
|
|
540
|
+
pos: string;
|
|
541
|
+
house: number;
|
|
542
|
+
speed: number;
|
|
543
|
+
rx?: boolean | undefined;
|
|
544
|
+
}, {
|
|
545
|
+
lon: number;
|
|
546
|
+
pos: string;
|
|
547
|
+
house: number;
|
|
548
|
+
speed: number;
|
|
549
|
+
rx?: boolean | undefined;
|
|
550
|
+
}>>;
|
|
551
|
+
angles: z.ZodObject<{
|
|
552
|
+
asc: z.ZodNumber;
|
|
553
|
+
ascPos: z.ZodString;
|
|
554
|
+
mc: z.ZodNumber;
|
|
555
|
+
mcPos: z.ZodString;
|
|
556
|
+
}, "strip", z.ZodTypeAny, {
|
|
557
|
+
asc: number;
|
|
558
|
+
ascPos: string;
|
|
559
|
+
mc: number;
|
|
560
|
+
mcPos: string;
|
|
561
|
+
}, {
|
|
562
|
+
asc: number;
|
|
563
|
+
ascPos: string;
|
|
564
|
+
mc: number;
|
|
565
|
+
mcPos: string;
|
|
566
|
+
}>;
|
|
567
|
+
cusps: z.ZodArray<z.ZodNumber, "many">;
|
|
568
|
+
aspects: z.ZodArray<z.ZodString, "many">;
|
|
569
|
+
}, "strip", z.ZodTypeAny, {
|
|
570
|
+
utc: string;
|
|
571
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
572
|
+
bodies: Record<string, {
|
|
573
|
+
lon: number;
|
|
574
|
+
pos: string;
|
|
575
|
+
house: number;
|
|
576
|
+
speed: number;
|
|
577
|
+
rx?: boolean | undefined;
|
|
578
|
+
}>;
|
|
579
|
+
angles: {
|
|
580
|
+
asc: number;
|
|
581
|
+
ascPos: string;
|
|
582
|
+
mc: number;
|
|
583
|
+
mcPos: string;
|
|
584
|
+
};
|
|
585
|
+
cusps: number[];
|
|
586
|
+
aspects: string[];
|
|
587
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
588
|
+
houses_fallback_reason?: string | undefined;
|
|
589
|
+
}, {
|
|
590
|
+
utc: string;
|
|
591
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
592
|
+
bodies: Record<string, {
|
|
593
|
+
lon: number;
|
|
594
|
+
pos: string;
|
|
595
|
+
house: number;
|
|
596
|
+
speed: number;
|
|
597
|
+
rx?: boolean | undefined;
|
|
598
|
+
}>;
|
|
599
|
+
angles: {
|
|
600
|
+
asc: number;
|
|
601
|
+
ascPos: string;
|
|
602
|
+
mc: number;
|
|
603
|
+
mcPos: string;
|
|
604
|
+
};
|
|
605
|
+
cusps: number[];
|
|
606
|
+
aspects: string[];
|
|
607
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
608
|
+
houses_fallback_reason?: string | undefined;
|
|
609
|
+
}>;
|
|
610
|
+
readonly transits: z.ZodObject<{
|
|
611
|
+
transit_utc: z.ZodString;
|
|
612
|
+
transiting: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
613
|
+
pos: z.ZodString;
|
|
614
|
+
natal_house: z.ZodNumber;
|
|
615
|
+
rx: z.ZodOptional<z.ZodBoolean>;
|
|
616
|
+
}, "strip", z.ZodTypeAny, {
|
|
617
|
+
pos: string;
|
|
618
|
+
natal_house: number;
|
|
619
|
+
rx?: boolean | undefined;
|
|
620
|
+
}, {
|
|
621
|
+
pos: string;
|
|
622
|
+
natal_house: number;
|
|
623
|
+
rx?: boolean | undefined;
|
|
624
|
+
}>>;
|
|
625
|
+
aspects_to_natal: z.ZodArray<z.ZodString, "many">;
|
|
626
|
+
}, "strip", z.ZodTypeAny, {
|
|
627
|
+
transit_utc: string;
|
|
628
|
+
transiting: Record<string, {
|
|
629
|
+
pos: string;
|
|
630
|
+
natal_house: number;
|
|
631
|
+
rx?: boolean | undefined;
|
|
632
|
+
}>;
|
|
633
|
+
aspects_to_natal: string[];
|
|
634
|
+
}, {
|
|
635
|
+
transit_utc: string;
|
|
636
|
+
transiting: Record<string, {
|
|
637
|
+
pos: string;
|
|
638
|
+
natal_house: number;
|
|
639
|
+
rx?: boolean | undefined;
|
|
640
|
+
}>;
|
|
641
|
+
aspects_to_natal: string[];
|
|
642
|
+
}>;
|
|
643
|
+
readonly synastry: z.ZodObject<{
|
|
644
|
+
a: z.ZodObject<{
|
|
645
|
+
utc: z.ZodString;
|
|
646
|
+
houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>;
|
|
647
|
+
houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>>;
|
|
648
|
+
houses_fallback_reason: z.ZodOptional<z.ZodString>;
|
|
649
|
+
bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
650
|
+
lon: z.ZodNumber;
|
|
651
|
+
pos: z.ZodString;
|
|
652
|
+
house: z.ZodNumber;
|
|
653
|
+
speed: z.ZodNumber;
|
|
654
|
+
rx: z.ZodOptional<z.ZodBoolean>;
|
|
655
|
+
}, "strip", z.ZodTypeAny, {
|
|
656
|
+
lon: number;
|
|
657
|
+
pos: string;
|
|
658
|
+
house: number;
|
|
659
|
+
speed: number;
|
|
660
|
+
rx?: boolean | undefined;
|
|
661
|
+
}, {
|
|
662
|
+
lon: number;
|
|
663
|
+
pos: string;
|
|
664
|
+
house: number;
|
|
665
|
+
speed: number;
|
|
666
|
+
rx?: boolean | undefined;
|
|
667
|
+
}>>;
|
|
668
|
+
angles: z.ZodObject<{
|
|
669
|
+
asc: z.ZodNumber;
|
|
670
|
+
ascPos: z.ZodString;
|
|
671
|
+
mc: z.ZodNumber;
|
|
672
|
+
mcPos: z.ZodString;
|
|
673
|
+
}, "strip", z.ZodTypeAny, {
|
|
674
|
+
asc: number;
|
|
675
|
+
ascPos: string;
|
|
676
|
+
mc: number;
|
|
677
|
+
mcPos: string;
|
|
678
|
+
}, {
|
|
679
|
+
asc: number;
|
|
680
|
+
ascPos: string;
|
|
681
|
+
mc: number;
|
|
682
|
+
mcPos: string;
|
|
683
|
+
}>;
|
|
684
|
+
cusps: z.ZodArray<z.ZodNumber, "many">;
|
|
685
|
+
aspects: z.ZodArray<z.ZodString, "many">;
|
|
686
|
+
}, "strip", z.ZodTypeAny, {
|
|
687
|
+
utc: string;
|
|
688
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
689
|
+
bodies: Record<string, {
|
|
690
|
+
lon: number;
|
|
691
|
+
pos: string;
|
|
692
|
+
house: number;
|
|
693
|
+
speed: number;
|
|
694
|
+
rx?: boolean | undefined;
|
|
695
|
+
}>;
|
|
696
|
+
angles: {
|
|
697
|
+
asc: number;
|
|
698
|
+
ascPos: string;
|
|
699
|
+
mc: number;
|
|
700
|
+
mcPos: string;
|
|
701
|
+
};
|
|
702
|
+
cusps: number[];
|
|
703
|
+
aspects: string[];
|
|
704
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
705
|
+
houses_fallback_reason?: string | undefined;
|
|
706
|
+
}, {
|
|
707
|
+
utc: string;
|
|
708
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
709
|
+
bodies: Record<string, {
|
|
710
|
+
lon: number;
|
|
711
|
+
pos: string;
|
|
712
|
+
house: number;
|
|
713
|
+
speed: number;
|
|
714
|
+
rx?: boolean | undefined;
|
|
715
|
+
}>;
|
|
716
|
+
angles: {
|
|
717
|
+
asc: number;
|
|
718
|
+
ascPos: string;
|
|
719
|
+
mc: number;
|
|
720
|
+
mcPos: string;
|
|
721
|
+
};
|
|
722
|
+
cusps: number[];
|
|
723
|
+
aspects: string[];
|
|
724
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
725
|
+
houses_fallback_reason?: string | undefined;
|
|
726
|
+
}>;
|
|
727
|
+
b: z.ZodObject<{
|
|
728
|
+
utc: z.ZodString;
|
|
729
|
+
houses: z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>;
|
|
730
|
+
houses_requested: z.ZodOptional<z.ZodEnum<["placidus", "whole_sign", "equal", "porphyry"]>>;
|
|
731
|
+
houses_fallback_reason: z.ZodOptional<z.ZodString>;
|
|
732
|
+
bodies: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
733
|
+
lon: z.ZodNumber;
|
|
734
|
+
pos: z.ZodString;
|
|
735
|
+
house: z.ZodNumber;
|
|
736
|
+
speed: z.ZodNumber;
|
|
737
|
+
rx: z.ZodOptional<z.ZodBoolean>;
|
|
738
|
+
}, "strip", z.ZodTypeAny, {
|
|
739
|
+
lon: number;
|
|
740
|
+
pos: string;
|
|
741
|
+
house: number;
|
|
742
|
+
speed: number;
|
|
743
|
+
rx?: boolean | undefined;
|
|
744
|
+
}, {
|
|
745
|
+
lon: number;
|
|
746
|
+
pos: string;
|
|
747
|
+
house: number;
|
|
748
|
+
speed: number;
|
|
749
|
+
rx?: boolean | undefined;
|
|
750
|
+
}>>;
|
|
751
|
+
angles: z.ZodObject<{
|
|
752
|
+
asc: z.ZodNumber;
|
|
753
|
+
ascPos: z.ZodString;
|
|
754
|
+
mc: z.ZodNumber;
|
|
755
|
+
mcPos: z.ZodString;
|
|
756
|
+
}, "strip", z.ZodTypeAny, {
|
|
757
|
+
asc: number;
|
|
758
|
+
ascPos: string;
|
|
759
|
+
mc: number;
|
|
760
|
+
mcPos: string;
|
|
761
|
+
}, {
|
|
762
|
+
asc: number;
|
|
763
|
+
ascPos: string;
|
|
764
|
+
mc: number;
|
|
765
|
+
mcPos: string;
|
|
766
|
+
}>;
|
|
767
|
+
cusps: z.ZodArray<z.ZodNumber, "many">;
|
|
768
|
+
aspects: z.ZodArray<z.ZodString, "many">;
|
|
769
|
+
}, "strip", z.ZodTypeAny, {
|
|
770
|
+
utc: string;
|
|
771
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
772
|
+
bodies: Record<string, {
|
|
773
|
+
lon: number;
|
|
774
|
+
pos: string;
|
|
775
|
+
house: number;
|
|
776
|
+
speed: number;
|
|
777
|
+
rx?: boolean | undefined;
|
|
778
|
+
}>;
|
|
779
|
+
angles: {
|
|
780
|
+
asc: number;
|
|
781
|
+
ascPos: string;
|
|
782
|
+
mc: number;
|
|
783
|
+
mcPos: string;
|
|
784
|
+
};
|
|
785
|
+
cusps: number[];
|
|
786
|
+
aspects: string[];
|
|
787
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
788
|
+
houses_fallback_reason?: string | undefined;
|
|
789
|
+
}, {
|
|
790
|
+
utc: string;
|
|
791
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
792
|
+
bodies: Record<string, {
|
|
793
|
+
lon: number;
|
|
794
|
+
pos: string;
|
|
795
|
+
house: number;
|
|
796
|
+
speed: number;
|
|
797
|
+
rx?: boolean | undefined;
|
|
798
|
+
}>;
|
|
799
|
+
angles: {
|
|
800
|
+
asc: number;
|
|
801
|
+
ascPos: string;
|
|
802
|
+
mc: number;
|
|
803
|
+
mcPos: string;
|
|
804
|
+
};
|
|
805
|
+
cusps: number[];
|
|
806
|
+
aspects: string[];
|
|
807
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
808
|
+
houses_fallback_reason?: string | undefined;
|
|
809
|
+
}>;
|
|
810
|
+
inter_aspects: z.ZodArray<z.ZodString, "many">;
|
|
811
|
+
a_planets_in_b_houses: z.ZodRecord<z.ZodString, z.ZodNumber>;
|
|
812
|
+
b_planets_in_a_houses: z.ZodRecord<z.ZodString, z.ZodNumber>;
|
|
813
|
+
}, "strip", z.ZodTypeAny, {
|
|
814
|
+
a: {
|
|
815
|
+
utc: string;
|
|
816
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
817
|
+
bodies: Record<string, {
|
|
818
|
+
lon: number;
|
|
819
|
+
pos: string;
|
|
820
|
+
house: number;
|
|
821
|
+
speed: number;
|
|
822
|
+
rx?: boolean | undefined;
|
|
823
|
+
}>;
|
|
824
|
+
angles: {
|
|
825
|
+
asc: number;
|
|
826
|
+
ascPos: string;
|
|
827
|
+
mc: number;
|
|
828
|
+
mcPos: string;
|
|
829
|
+
};
|
|
830
|
+
cusps: number[];
|
|
831
|
+
aspects: string[];
|
|
832
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
833
|
+
houses_fallback_reason?: string | undefined;
|
|
834
|
+
};
|
|
835
|
+
b: {
|
|
836
|
+
utc: string;
|
|
837
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
838
|
+
bodies: Record<string, {
|
|
839
|
+
lon: number;
|
|
840
|
+
pos: string;
|
|
841
|
+
house: number;
|
|
842
|
+
speed: number;
|
|
843
|
+
rx?: boolean | undefined;
|
|
844
|
+
}>;
|
|
845
|
+
angles: {
|
|
846
|
+
asc: number;
|
|
847
|
+
ascPos: string;
|
|
848
|
+
mc: number;
|
|
849
|
+
mcPos: string;
|
|
850
|
+
};
|
|
851
|
+
cusps: number[];
|
|
852
|
+
aspects: string[];
|
|
853
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
854
|
+
houses_fallback_reason?: string | undefined;
|
|
855
|
+
};
|
|
856
|
+
inter_aspects: string[];
|
|
857
|
+
a_planets_in_b_houses: Record<string, number>;
|
|
858
|
+
b_planets_in_a_houses: Record<string, number>;
|
|
859
|
+
}, {
|
|
860
|
+
a: {
|
|
861
|
+
utc: string;
|
|
862
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
863
|
+
bodies: Record<string, {
|
|
864
|
+
lon: number;
|
|
865
|
+
pos: string;
|
|
866
|
+
house: number;
|
|
867
|
+
speed: number;
|
|
868
|
+
rx?: boolean | undefined;
|
|
869
|
+
}>;
|
|
870
|
+
angles: {
|
|
871
|
+
asc: number;
|
|
872
|
+
ascPos: string;
|
|
873
|
+
mc: number;
|
|
874
|
+
mcPos: string;
|
|
875
|
+
};
|
|
876
|
+
cusps: number[];
|
|
877
|
+
aspects: string[];
|
|
878
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
879
|
+
houses_fallback_reason?: string | undefined;
|
|
880
|
+
};
|
|
881
|
+
b: {
|
|
882
|
+
utc: string;
|
|
883
|
+
houses: "placidus" | "whole_sign" | "equal" | "porphyry";
|
|
884
|
+
bodies: Record<string, {
|
|
885
|
+
lon: number;
|
|
886
|
+
pos: string;
|
|
887
|
+
house: number;
|
|
888
|
+
speed: number;
|
|
889
|
+
rx?: boolean | undefined;
|
|
890
|
+
}>;
|
|
891
|
+
angles: {
|
|
892
|
+
asc: number;
|
|
893
|
+
ascPos: string;
|
|
894
|
+
mc: number;
|
|
895
|
+
mcPos: string;
|
|
896
|
+
};
|
|
897
|
+
cusps: number[];
|
|
898
|
+
aspects: string[];
|
|
899
|
+
houses_requested?: "placidus" | "whole_sign" | "equal" | "porphyry" | undefined;
|
|
900
|
+
houses_fallback_reason?: string | undefined;
|
|
901
|
+
};
|
|
902
|
+
inter_aspects: string[];
|
|
903
|
+
a_planets_in_b_houses: Record<string, number>;
|
|
904
|
+
b_planets_in_a_houses: Record<string, number>;
|
|
905
|
+
}>;
|
|
906
|
+
readonly find_aspect_dates: z.ZodObject<{
|
|
907
|
+
query: z.ZodString;
|
|
908
|
+
hits: z.ZodArray<z.ZodString, "many">;
|
|
909
|
+
}, "strip", z.ZodTypeAny, {
|
|
910
|
+
query: string;
|
|
911
|
+
hits: string[];
|
|
912
|
+
}, {
|
|
913
|
+
query: string;
|
|
914
|
+
hits: string[];
|
|
915
|
+
}>;
|
|
916
|
+
readonly rectification_grid: z.ZodObject<{
|
|
917
|
+
date: z.ZodString;
|
|
918
|
+
lat: z.ZodNumber;
|
|
919
|
+
lon: z.ZodNumber;
|
|
920
|
+
asc_sign_changes: z.ZodArray<z.ZodString, "many">;
|
|
921
|
+
grid: z.ZodArray<z.ZodObject<{
|
|
922
|
+
utc: z.ZodString;
|
|
923
|
+
asc: z.ZodString;
|
|
924
|
+
mc: z.ZodString;
|
|
925
|
+
}, "strip", z.ZodTypeAny, {
|
|
926
|
+
utc: string;
|
|
927
|
+
asc: string;
|
|
928
|
+
mc: string;
|
|
929
|
+
}, {
|
|
930
|
+
utc: string;
|
|
931
|
+
asc: string;
|
|
932
|
+
mc: string;
|
|
933
|
+
}>, "many">;
|
|
934
|
+
}, "strip", z.ZodTypeAny, {
|
|
935
|
+
lon: number;
|
|
936
|
+
date: string;
|
|
937
|
+
lat: number;
|
|
938
|
+
asc_sign_changes: string[];
|
|
939
|
+
grid: {
|
|
940
|
+
utc: string;
|
|
941
|
+
asc: string;
|
|
942
|
+
mc: string;
|
|
943
|
+
}[];
|
|
944
|
+
}, {
|
|
945
|
+
lon: number;
|
|
946
|
+
date: string;
|
|
947
|
+
lat: number;
|
|
948
|
+
asc_sign_changes: string[];
|
|
949
|
+
grid: {
|
|
950
|
+
utc: string;
|
|
951
|
+
asc: string;
|
|
952
|
+
mc: string;
|
|
953
|
+
}[];
|
|
954
|
+
}>;
|
|
955
|
+
};
|
|
956
|
+
export declare function buildServer(): McpServer;
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* caelus-mcp -- MCP server for the caelus ephemeris engine.
|
|
4
|
+
*
|
|
5
|
+
* Design (per 2026 MCP practice): one bounded context (chart computation),
|
|
6
|
+
* a small curated tool surface (6 outcome-level tools, not API wrappers),
|
|
7
|
+
* and token-frugal outputs (positions to 0.01 deg, terse keys, no prose --
|
|
8
|
+
* the model does the interpreting, the server does the math).
|
|
9
|
+
*
|
|
10
|
+
* Transport: stdio (this file). The same buildServer() can be mounted on
|
|
11
|
+
* Streamable HTTP for the hosted ephemengine.com deployment.
|
|
12
|
+
*/
|
|
13
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
14
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
import { dirname, join } from "node:path";
|
|
17
|
+
import { fileURLToPath } from "node:url";
|
|
18
|
+
import { createRequire } from "node:module";
|
|
19
|
+
import { Engine, BODIES, julianDay, mod } from "caelus";
|
|
20
|
+
import { loadNodeData } from "caelus/node";
|
|
21
|
+
const require = createRequire(import.meta.url);
|
|
22
|
+
const DATA_DIR = process.env.CAELUS_DATA
|
|
23
|
+
?? join(dirname(require.resolve("caelus/package.json")), "data");
|
|
24
|
+
const engine = new Engine(loadNodeData(DATA_DIR, "embedded", "full"));
|
|
25
|
+
// ---------------------------------------------------------------- helpers
|
|
26
|
+
const r2 = (x) => Math.round(x * 100) / 100;
|
|
27
|
+
const SIGNS = ["Ari", "Tau", "Gem", "Cnc", "Leo", "Vir", "Lib", "Sco", "Sgr", "Cap", "Aqr", "Psc"];
|
|
28
|
+
const fmt = (lon) => {
|
|
29
|
+
const d = mod(lon, 30);
|
|
30
|
+
return `${Math.floor(d)}°${String(Math.floor(mod(d, 1) * 60)).padStart(2, "0")}'${SIGNS[Math.floor(lon / 30)]}`;
|
|
31
|
+
};
|
|
32
|
+
const latSchema = z.number().min(-90).max(90).describe("Latitude, north positive");
|
|
33
|
+
const lonSchema = z.number().min(-180).max(180).describe("Longitude, EAST positive (Americas are negative)");
|
|
34
|
+
const birth = {
|
|
35
|
+
date: z.string().describe("UTC date-time, ISO 8601, e.g. 1990-06-10T14:30:00Z. Convert local birth time to UTC first."),
|
|
36
|
+
lat: latSchema,
|
|
37
|
+
lon: lonSchema,
|
|
38
|
+
};
|
|
39
|
+
const houseSys = z.enum(["placidus", "whole_sign", "equal", "porphyry"]).default("placidus");
|
|
40
|
+
function jdFromIso(iso) {
|
|
41
|
+
const d = new Date(iso);
|
|
42
|
+
if (Number.isNaN(d.getTime()))
|
|
43
|
+
throw new Error(`Invalid date: ${iso}`);
|
|
44
|
+
return julianDay(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds());
|
|
45
|
+
}
|
|
46
|
+
function chartPayload(iso, lat, lon, hs) {
|
|
47
|
+
const d = new Date(iso);
|
|
48
|
+
const c = engine.chart(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), lat, lon, hs);
|
|
49
|
+
const cusps = c.cusps;
|
|
50
|
+
const houseOf = (bl) => {
|
|
51
|
+
for (let i = 0; i < 12; i++) {
|
|
52
|
+
const a = cusps[i];
|
|
53
|
+
const b = cusps[(i + 1) % 12];
|
|
54
|
+
if (mod(bl - a, 360) < mod(b - a, 360))
|
|
55
|
+
return i + 1;
|
|
56
|
+
}
|
|
57
|
+
return 12;
|
|
58
|
+
};
|
|
59
|
+
const bodies = {};
|
|
60
|
+
for (const b of BODIES) {
|
|
61
|
+
const p = c.bodies[b];
|
|
62
|
+
bodies[b] = {
|
|
63
|
+
lon: r2(p.lon), pos: fmt(p.lon), house: houseOf(p.lon),
|
|
64
|
+
...(p.retrograde ? { rx: true } : {}), speed: r2(p.speed),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
utc: iso, houses: c.houseSystem,
|
|
69
|
+
...(c.houseSystem !== hs ? { houses_requested: hs, houses_fallback_reason: "placidus undefined above polar circles" } : {}),
|
|
70
|
+
bodies,
|
|
71
|
+
angles: { asc: r2(c.angles.asc), ascPos: fmt(c.angles.asc), mc: r2(c.angles.mc), mcPos: fmt(c.angles.mc) },
|
|
72
|
+
cusps: cusps.map(r2),
|
|
73
|
+
aspects: c.aspects.map((a) => `${a.a} ${a.aspect} ${a.b} (${a.orb}°)`),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const text = (obj) => ({ content: [{ type: "text", text: JSON.stringify(obj) }] });
|
|
77
|
+
// ---------------------------------------------------------------- output schemas
|
|
78
|
+
// Exported so the integration test validates responses against the same shape
|
|
79
|
+
// the server promises. Kept permissive on optional keys (rx, fallback fields).
|
|
80
|
+
const bodyOut = z.object({
|
|
81
|
+
lon: z.number(), pos: z.string(), house: z.number().int().min(1).max(12),
|
|
82
|
+
speed: z.number(), rx: z.boolean().optional(),
|
|
83
|
+
});
|
|
84
|
+
export const chartOut = z.object({
|
|
85
|
+
utc: z.string(),
|
|
86
|
+
houses: z.enum(["placidus", "whole_sign", "equal", "porphyry"]),
|
|
87
|
+
houses_requested: z.enum(["placidus", "whole_sign", "equal", "porphyry"]).optional(),
|
|
88
|
+
houses_fallback_reason: z.string().optional(),
|
|
89
|
+
bodies: z.record(z.string(), bodyOut),
|
|
90
|
+
angles: z.object({ asc: z.number(), ascPos: z.string(), mc: z.number(), mcPos: z.string() }),
|
|
91
|
+
cusps: z.array(z.number()).length(12),
|
|
92
|
+
aspects: z.array(z.string()),
|
|
93
|
+
});
|
|
94
|
+
export const transitsOut = z.object({
|
|
95
|
+
transit_utc: z.string(),
|
|
96
|
+
transiting: z.record(z.string(), z.object({
|
|
97
|
+
pos: z.string(), natal_house: z.number().int().min(1).max(12), rx: z.boolean().optional(),
|
|
98
|
+
})),
|
|
99
|
+
aspects_to_natal: z.array(z.string()),
|
|
100
|
+
});
|
|
101
|
+
export const synastryOut = z.object({
|
|
102
|
+
a: chartOut, b: chartOut,
|
|
103
|
+
inter_aspects: z.array(z.string()),
|
|
104
|
+
a_planets_in_b_houses: z.record(z.string(), z.number().int().min(1).max(12)),
|
|
105
|
+
b_planets_in_a_houses: z.record(z.string(), z.number().int().min(1).max(12)),
|
|
106
|
+
});
|
|
107
|
+
export const findAspectDatesOut = z.object({
|
|
108
|
+
query: z.string(),
|
|
109
|
+
hits: z.array(z.string()),
|
|
110
|
+
});
|
|
111
|
+
export const rectificationGridOut = z.object({
|
|
112
|
+
date: z.string(),
|
|
113
|
+
lat: z.number(), lon: z.number(),
|
|
114
|
+
asc_sign_changes: z.array(z.string()),
|
|
115
|
+
grid: z.array(z.object({ utc: z.string(), asc: z.string(), mc: z.string() })),
|
|
116
|
+
});
|
|
117
|
+
export const OUTPUT_SCHEMAS = {
|
|
118
|
+
natal_chart: chartOut,
|
|
119
|
+
current_sky: chartOut,
|
|
120
|
+
transits: transitsOut,
|
|
121
|
+
synastry: synastryOut,
|
|
122
|
+
find_aspect_dates: findAspectDatesOut,
|
|
123
|
+
rectification_grid: rectificationGridOut,
|
|
124
|
+
};
|
|
125
|
+
// ---------------------------------------------------------------- server
|
|
126
|
+
export function buildServer() {
|
|
127
|
+
const server = new McpServer({ name: "caelus", version: "0.1.0" });
|
|
128
|
+
server.registerTool("natal_chart", {
|
|
129
|
+
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″.",
|
|
130
|
+
inputSchema: { ...birth, house_system: houseSys },
|
|
131
|
+
}, async ({ date, lat, lon, house_system }) => text(chartPayload(date, lat, lon, house_system)));
|
|
132
|
+
server.registerTool("current_sky", {
|
|
133
|
+
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.",
|
|
134
|
+
inputSchema: {
|
|
135
|
+
date: z.string().optional().describe("UTC ISO date-time (convert from local first); omit for now"),
|
|
136
|
+
lat: latSchema.default(0).describe("Latitude, north positive; default 0 makes houses nominal"),
|
|
137
|
+
lon: lonSchema.default(0).describe("Longitude, EAST positive (Americas are negative); default 0 makes houses nominal"),
|
|
138
|
+
house_system: houseSys,
|
|
139
|
+
},
|
|
140
|
+
}, async ({ date, lat, lon, house_system }) => text(chartPayload(date ?? new Date().toISOString(), lat, lon, house_system)));
|
|
141
|
+
server.registerTool("transits", {
|
|
142
|
+
description: "Transiting planets vs natal chart: aspects within orb (applying/separating), natal house per transiting body.",
|
|
143
|
+
inputSchema: {
|
|
144
|
+
...birth,
|
|
145
|
+
transit_date: z.string().optional().describe("UTC ISO date-time of transit moment (convert from local first); omit for now"),
|
|
146
|
+
orb: z.number().min(0.5).max(10).default(3).describe("Max orb in degrees"),
|
|
147
|
+
house_system: houseSys,
|
|
148
|
+
},
|
|
149
|
+
}, async ({ date, lat, lon, transit_date, orb, house_system }) => {
|
|
150
|
+
const natal = chartPayload(date, lat, lon, house_system);
|
|
151
|
+
const tIso = transit_date ?? new Date().toISOString();
|
|
152
|
+
const jdT = jdFromIso(tIso);
|
|
153
|
+
const ASP = [["conj", 0], ["sext", 60], ["sq", 90], ["tri", 120], ["opp", 180]];
|
|
154
|
+
const hits = [];
|
|
155
|
+
const cusps = natal.cusps;
|
|
156
|
+
const houseOf = (bl) => {
|
|
157
|
+
for (let i = 0; i < 12; i++) {
|
|
158
|
+
if (mod(bl - cusps[i], 360) < mod(cusps[(i + 1) % 12] - cusps[i], 360))
|
|
159
|
+
return i + 1;
|
|
160
|
+
}
|
|
161
|
+
return 12;
|
|
162
|
+
};
|
|
163
|
+
const transiting = {};
|
|
164
|
+
for (const tb of BODIES) {
|
|
165
|
+
const tp = engine.position(tb, jdT);
|
|
166
|
+
transiting[tb] = { pos: fmt(tp.lon), natal_house: houseOf(tp.lon), ...(tp.retrograde ? { rx: true } : {}) };
|
|
167
|
+
for (const nb of BODIES) {
|
|
168
|
+
const nLon = natal.bodies[nb].lon;
|
|
169
|
+
const sep = Math.abs(mod(tp.lon - nLon + 180, 360) - 180);
|
|
170
|
+
for (const [name, angle] of ASP) {
|
|
171
|
+
const o = Math.abs(sep - angle);
|
|
172
|
+
if (o <= orb) {
|
|
173
|
+
const future = Math.abs(mod(tp.lon + tp.speed * 0.5 - nLon + 180, 360) - 180);
|
|
174
|
+
const applying = Math.abs(future - angle) < o;
|
|
175
|
+
hits.push(`t.${tb} ${name} n.${nb} (${r2(o)}°${applying ? " applying" : " separating"})`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return text({ transit_utc: tIso, transiting, aspects_to_natal: hits });
|
|
181
|
+
});
|
|
182
|
+
server.registerTool("synastry", {
|
|
183
|
+
description: "Compare two people's birth charts: inter-chart aspects with orbs, house overlays both ways. Each person needs date+lat+lon. House overlays always use Placidus (not configurable here).",
|
|
184
|
+
inputSchema: {
|
|
185
|
+
a: z.object(birth).describe("Person A birth data (UTC date, lat, lon)"),
|
|
186
|
+
b: z.object(birth).describe("Person B birth data (UTC date, lat, lon)"),
|
|
187
|
+
orb: z.number().min(0.5).max(10).default(4).describe("Max orb in degrees"),
|
|
188
|
+
},
|
|
189
|
+
}, async ({ a, b, orb }) => {
|
|
190
|
+
const ca = chartPayload(a.date, a.lat, a.lon, "placidus");
|
|
191
|
+
const cb = chartPayload(b.date, b.lat, b.lon, "placidus");
|
|
192
|
+
const ASP = [["conj", 0], ["sext", 60], ["sq", 90], ["tri", 120], ["opp", 180]];
|
|
193
|
+
const inter = [];
|
|
194
|
+
const houseIn = (cusps, bl) => {
|
|
195
|
+
for (let i = 0; i < 12; i++) {
|
|
196
|
+
if (mod(bl - cusps[i], 360) < mod(cusps[(i + 1) % 12] - cusps[i], 360))
|
|
197
|
+
return i + 1;
|
|
198
|
+
}
|
|
199
|
+
return 12;
|
|
200
|
+
};
|
|
201
|
+
const aInB = {};
|
|
202
|
+
const bInA = {};
|
|
203
|
+
for (const ba of BODIES) {
|
|
204
|
+
const la = ca.bodies[ba].lon;
|
|
205
|
+
aInB[ba] = houseIn(cb.cusps, la);
|
|
206
|
+
const lb = cb.bodies[ba].lon;
|
|
207
|
+
bInA[ba] = houseIn(ca.cusps, lb);
|
|
208
|
+
}
|
|
209
|
+
for (const ba of BODIES) {
|
|
210
|
+
for (const bb of BODIES) {
|
|
211
|
+
const la = ca.bodies[ba].lon;
|
|
212
|
+
const lb = cb.bodies[bb].lon;
|
|
213
|
+
const sep = Math.abs(mod(la - lb + 180, 360) - 180);
|
|
214
|
+
for (const [name, angle] of ASP) {
|
|
215
|
+
const o = Math.abs(sep - angle);
|
|
216
|
+
if (o <= orb)
|
|
217
|
+
inter.push(`A.${ba} ${name} B.${bb} (${r2(o)}°)`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return text({
|
|
222
|
+
a: ca, b: cb, inter_aspects: inter,
|
|
223
|
+
a_planets_in_b_houses: aInB, b_planets_in_a_houses: bInA,
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
server.registerTool("find_aspect_dates", {
|
|
227
|
+
description: "Exact dates a transiting body makes an aspect, within a range: to a fixed longitude OR to another transiting body. Provide exactly one of target_lon / target_body. Includes retrograde re-hits. Body names are snake_case (mean_node, true_node); note the output uses abbreviated aspect tokens (conj/sext/sq/tri/opp).",
|
|
228
|
+
inputSchema: {
|
|
229
|
+
body: z.enum(BODIES).describe("Transiting body (snake_case, e.g. saturn, true_node)"),
|
|
230
|
+
aspect: z.enum(["conjunction", "sextile", "square", "trine", "opposition"]),
|
|
231
|
+
target_lon: z.number().min(0).max(360).optional().describe("Fixed natal longitude in degrees. Provide this OR target_body, not both."),
|
|
232
|
+
target_body: z.enum(BODIES).optional().describe("Another transiting body. Provide this OR target_lon, not both."),
|
|
233
|
+
start: z.string().describe("UTC ISO start date (convert from local first)"),
|
|
234
|
+
end: z.string().describe("UTC ISO end date (convert from local first); range <= 50 years"),
|
|
235
|
+
},
|
|
236
|
+
}, async ({ body, aspect, target_lon, target_body, start, end }) => {
|
|
237
|
+
const angle = { conjunction: 0, sextile: 60, square: 90, trine: 120, opposition: 180 }[aspect];
|
|
238
|
+
const jd0 = jdFromIso(start);
|
|
239
|
+
const jd1 = jdFromIso(end);
|
|
240
|
+
if (jd1 - jd0 > 50 * 366)
|
|
241
|
+
throw new Error("Range too large (max 50 years)");
|
|
242
|
+
if (target_lon === undefined && target_body === undefined) {
|
|
243
|
+
throw new Error("Provide target_lon or target_body");
|
|
244
|
+
}
|
|
245
|
+
// A non-axial aspect (sextile/square/trine) is exact at BOTH +angle and
|
|
246
|
+
// -angle separation; conjunction/opposition have a single geometry.
|
|
247
|
+
const offsets = angle === 0 || angle === 180 ? [angle] : [angle, -angle];
|
|
248
|
+
const mkF = (off) => (jd) => {
|
|
249
|
+
const tl = target_body !== undefined
|
|
250
|
+
? engine.longitude(target_body, jd)
|
|
251
|
+
: target_lon;
|
|
252
|
+
return mod(engine.longitude(body, jd) - tl - off + 180, 360) - 180;
|
|
253
|
+
};
|
|
254
|
+
const hitsJd = [];
|
|
255
|
+
const step = 1.0;
|
|
256
|
+
for (const off of offsets) {
|
|
257
|
+
const f = mkF(off);
|
|
258
|
+
let prev = f(jd0);
|
|
259
|
+
for (let jd = jd0 + step; jd <= jd1 && hitsJd.length < 120; jd += step) {
|
|
260
|
+
const cur = f(jd);
|
|
261
|
+
if (prev * cur < 0 && Math.abs(cur - prev) < 180) {
|
|
262
|
+
let a = jd - step;
|
|
263
|
+
let bj = jd;
|
|
264
|
+
for (let i = 0; i < 40; i++) { // bisection to ~1 minute
|
|
265
|
+
const m = (a + bj) / 2;
|
|
266
|
+
if (f(a) * f(m) <= 0)
|
|
267
|
+
bj = m;
|
|
268
|
+
else
|
|
269
|
+
a = m;
|
|
270
|
+
}
|
|
271
|
+
hitsJd.push((a + bj) / 2);
|
|
272
|
+
}
|
|
273
|
+
prev = cur;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
hitsJd.sort((x, y) => x - y);
|
|
277
|
+
const hits = hitsJd.slice(0, 60).map((t) => new Date((t - 2440587.5) * 86400000).toISOString().slice(0, 16) + "Z");
|
|
278
|
+
return text({ query: `${body} ${aspect} ${target_body ?? target_lon}`, hits });
|
|
279
|
+
});
|
|
280
|
+
server.registerTool("rectification_grid", {
|
|
281
|
+
description: "Rectification sweep: ASC/MC at each step across a window of UTC hours on one date, with ASC sign-change times. Use when the birth time is unknown and you want candidate times. The sweep runs over window_start_hour..window_end_hour (UTC hours of the given date); the date's time portion is ignored.",
|
|
282
|
+
inputSchema: {
|
|
283
|
+
date: z.string().describe("Birth DATE (UTC) as ISO; only the calendar date is used, the time portion is ignored (the window_*_hour fields set the times swept)"),
|
|
284
|
+
lat: latSchema, lon: lonSchema,
|
|
285
|
+
window_start_hour: z.number().min(0).max(24).default(0).describe("First UTC hour of the date to sweep"),
|
|
286
|
+
window_end_hour: z.number().min(0).max(24).default(24).describe("Last UTC hour of the date to sweep"),
|
|
287
|
+
step_minutes: z.number().min(5).max(120).default(20).describe("Minutes between grid rows"),
|
|
288
|
+
},
|
|
289
|
+
}, async ({ date, lat, lon, window_start_hour, window_end_hour, step_minutes }) => {
|
|
290
|
+
const d = new Date(date);
|
|
291
|
+
const grid = [];
|
|
292
|
+
const boundaries = [];
|
|
293
|
+
let lastAscSign = -1;
|
|
294
|
+
for (let m = window_start_hour * 60; m <= window_end_hour * 60; m += step_minutes) {
|
|
295
|
+
const iso = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), 0, m, 0)).toISOString();
|
|
296
|
+
const c = chartPayload(iso, lat, lon, "whole_sign");
|
|
297
|
+
const ascLon = c.angles.asc;
|
|
298
|
+
const ascSign = Math.floor(ascLon / 30);
|
|
299
|
+
if (lastAscSign >= 0 && ascSign !== lastAscSign) {
|
|
300
|
+
boundaries.push(`Asc enters ${SIGNS[ascSign]} ~${iso.slice(11, 16)} UTC`);
|
|
301
|
+
}
|
|
302
|
+
lastAscSign = ascSign;
|
|
303
|
+
grid.push({
|
|
304
|
+
utc: iso.slice(11, 16),
|
|
305
|
+
asc: c.angles.ascPos,
|
|
306
|
+
mc: c.angles.mcPos,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
return text({ date: date.slice(0, 10), lat, lon, asc_sign_changes: boundaries, grid });
|
|
310
|
+
});
|
|
311
|
+
return server;
|
|
312
|
+
}
|
|
313
|
+
// ---------------------------------------------------------------- main
|
|
314
|
+
const isMain = process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1];
|
|
315
|
+
if (isMain) {
|
|
316
|
+
const server = buildServer();
|
|
317
|
+
const transport = new StdioServerTransport();
|
|
318
|
+
await server.connect(transport);
|
|
319
|
+
console.error("caelus-mcp listening on stdio");
|
|
320
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "caelus-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for caelus chart computation.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"caelus-mcp": "dist/src/server.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "dist/src/server.js",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"start": "node dist/src/server.js"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
16
|
+
"zod": "^3.24.0",
|
|
17
|
+
"caelus": "^0.1.0"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"ajv": "^8.17.1"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"files": [
|
|
24
|
+
"dist/src"
|
|
25
|
+
],
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "git+https://github.com/heavyblotto/caelus.git",
|
|
29
|
+
"directory": "packages/caelus-mcp"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://ephemengine.com",
|
|
32
|
+
"keywords": [
|
|
33
|
+
"astrology",
|
|
34
|
+
"ephemeris",
|
|
35
|
+
"mcp",
|
|
36
|
+
"model-context-protocol",
|
|
37
|
+
"natal-chart"
|
|
38
|
+
]
|
|
39
|
+
}
|