@openephemeris/mcp-server 3.2.13 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/tools/index.js +8 -0
- package/dist/tools/specialized/acg.d.ts +1 -0
- package/dist/tools/specialized/acg.js +143 -0
- package/dist/tools/specialized/comparative.d.ts +1 -0
- package/dist/tools/specialized/comparative.js +153 -0
- package/dist/tools/specialized/electional.js +178 -0
- package/dist/tools/specialized/ephemeris_core.d.ts +1 -0
- package/dist/tools/specialized/ephemeris_core.js +93 -0
- package/dist/tools/specialized/ephemeris_extended.d.ts +1 -0
- package/dist/tools/specialized/ephemeris_extended.js +234 -0
- package/dist/tools/specialized/hd_group.d.ts +1 -0
- package/dist/tools/specialized/hd_group.js +107 -0
- package/dist/tools/specialized/progressed.d.ts +1 -0
- package/dist/tools/specialized/progressed.js +65 -0
- package/dist/tools/specialized/returns.js +67 -49
- package/dist/tools/specialized/venus_star_points.d.ts +1 -0
- package/dist/tools/specialized/venus_star_points.js +187 -0
- package/package.json +2 -2
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { registerTool, validateRequired } from "../index.js";
|
|
2
|
+
import { backendClient } from "../../backend/client.js";
|
|
3
|
+
function buildSubject(name, datetime, lat, lon) {
|
|
4
|
+
return {
|
|
5
|
+
name,
|
|
6
|
+
birth_datetime: { iso: datetime },
|
|
7
|
+
birth_location: {
|
|
8
|
+
latitude: { decimal: lat },
|
|
9
|
+
longitude: { decimal: lon },
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
// POST /ephemeris/natal/batch — OE-028
|
|
14
|
+
registerTool({
|
|
15
|
+
name: "ephemeris_natal_batch",
|
|
16
|
+
description: "Calculate natal charts for multiple subjects in a single request. " +
|
|
17
|
+
"Supports up to 100 subjects. Returns enhanced natal chart data for each.\n\n" +
|
|
18
|
+
"CREDIT COST: 1 credit per subject.\n\n" +
|
|
19
|
+
"EXAMPLE: Two people batch:\n" +
|
|
20
|
+
" subjects: [\n" +
|
|
21
|
+
" { name: 'Alice', datetime: '1990-04-15T14:30:00', latitude: 41.88, longitude: -87.63 },\n" +
|
|
22
|
+
" { name: 'Bob', datetime: '1988-09-22T08:15:00', latitude: 34.05, longitude: -118.24 }\n" +
|
|
23
|
+
" ]",
|
|
24
|
+
inputSchema: {
|
|
25
|
+
type: "object",
|
|
26
|
+
properties: {
|
|
27
|
+
subjects: {
|
|
28
|
+
type: "array",
|
|
29
|
+
items: {
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: {
|
|
32
|
+
name: { type: "string", description: "Subject name." },
|
|
33
|
+
datetime: { type: "string", description: "Birth datetime (ISO 8601)." },
|
|
34
|
+
latitude: { type: "number", description: "Birth latitude." },
|
|
35
|
+
longitude: { type: "number", description: "Birth longitude." },
|
|
36
|
+
},
|
|
37
|
+
required: ["name", "datetime", "latitude", "longitude"],
|
|
38
|
+
},
|
|
39
|
+
description: "Array of subjects (1-100).",
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
required: ["subjects"],
|
|
43
|
+
additionalProperties: false,
|
|
44
|
+
},
|
|
45
|
+
handler: async (args) => {
|
|
46
|
+
validateRequired(args, ["subjects"]);
|
|
47
|
+
const items = args.subjects.map((s) => ({
|
|
48
|
+
subject: buildSubject(s.name, s.datetime, s.latitude, s.longitude),
|
|
49
|
+
}));
|
|
50
|
+
return await backendClient.post("/ephemeris/natal/batch", { items });
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
// POST /ephemeris/dignities
|
|
54
|
+
registerTool({
|
|
55
|
+
name: "ephemeris_dignities",
|
|
56
|
+
description: "Calculate essential dignities (domicile, exaltation, detriment, fall, peregrine) " +
|
|
57
|
+
"for all planets at a given date/time. Essential for traditional astrology.\n\n" +
|
|
58
|
+
"CREDIT COST: 1 credit per call.",
|
|
59
|
+
inputSchema: {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {
|
|
62
|
+
datetime: { type: "string", description: "ISO 8601 date/time." },
|
|
63
|
+
},
|
|
64
|
+
required: ["datetime"],
|
|
65
|
+
additionalProperties: false,
|
|
66
|
+
},
|
|
67
|
+
handler: async (args) => {
|
|
68
|
+
validateRequired(args, ["datetime"]);
|
|
69
|
+
return await backendClient.post("/ephemeris/dignities", {
|
|
70
|
+
date_time: { iso: args.datetime },
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
// POST /ephemeris/retrograde-status
|
|
75
|
+
registerTool({
|
|
76
|
+
name: "ephemeris_retrograde_status",
|
|
77
|
+
description: "Get retrograde/direct status and speed for all planets at a given date/time. " +
|
|
78
|
+
"Returns is_retrograde flag, longitude speed, and station proximity.\n\n" +
|
|
79
|
+
"CREDIT COST: 1 credit per call.",
|
|
80
|
+
inputSchema: {
|
|
81
|
+
type: "object",
|
|
82
|
+
properties: {
|
|
83
|
+
datetime: { type: "string", description: "ISO 8601 date/time." },
|
|
84
|
+
planet_id: { type: "integer", description: "Optional single planet ID (0-9). Omit for all planets." },
|
|
85
|
+
},
|
|
86
|
+
required: ["datetime"],
|
|
87
|
+
additionalProperties: false,
|
|
88
|
+
},
|
|
89
|
+
handler: async (args) => {
|
|
90
|
+
validateRequired(args, ["datetime"]);
|
|
91
|
+
const body = {
|
|
92
|
+
date_time: { iso: args.datetime },
|
|
93
|
+
};
|
|
94
|
+
if (args.planet_id != null)
|
|
95
|
+
body.planet_id = args.planet_id;
|
|
96
|
+
return await backendClient.post("/ephemeris/retrograde-status", body);
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
// POST /ephemeris/midpoints
|
|
100
|
+
registerTool({
|
|
101
|
+
name: "ephemeris_midpoints",
|
|
102
|
+
description: "Calculate midpoints between all planet pairs for a given date/time and location. " +
|
|
103
|
+
"Returns midpoint longitude, the two planets involved, and any planet at the midpoint.\n\n" +
|
|
104
|
+
"CREDIT COST: 1 credit per call.",
|
|
105
|
+
inputSchema: {
|
|
106
|
+
type: "object",
|
|
107
|
+
properties: {
|
|
108
|
+
datetime: { type: "string", description: "ISO 8601 date/time." },
|
|
109
|
+
latitude: { type: "number", description: "Observer latitude." },
|
|
110
|
+
longitude: { type: "number", description: "Observer longitude." },
|
|
111
|
+
},
|
|
112
|
+
required: ["datetime", "latitude", "longitude"],
|
|
113
|
+
additionalProperties: false,
|
|
114
|
+
},
|
|
115
|
+
handler: async (args) => {
|
|
116
|
+
validateRequired(args, ["datetime", "latitude", "longitude"]);
|
|
117
|
+
return await backendClient.post("/ephemeris/midpoints", {
|
|
118
|
+
date_time: { iso: args.datetime },
|
|
119
|
+
latitude: args.latitude,
|
|
120
|
+
longitude: args.longitude,
|
|
121
|
+
});
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
// POST /ephemeris/fixed-stars
|
|
125
|
+
registerTool({
|
|
126
|
+
name: "ephemeris_fixed_stars",
|
|
127
|
+
description: "Calculate positions of fixed stars and conjunctions to natal planets. " +
|
|
128
|
+
"Returns star longitude, magnitude, and any planets within orb.\n\n" +
|
|
129
|
+
"CREDIT COST: 1 credit per call.",
|
|
130
|
+
inputSchema: {
|
|
131
|
+
type: "object",
|
|
132
|
+
properties: {
|
|
133
|
+
datetime: { type: "string", description: "ISO 8601 date/time." },
|
|
134
|
+
star_names: {
|
|
135
|
+
type: "array",
|
|
136
|
+
items: { type: "string" },
|
|
137
|
+
description: "Optional list of star names (e.g. ['Regulus', 'Spica']). Omit for default list.",
|
|
138
|
+
},
|
|
139
|
+
orb: { type: "number", description: "Conjunction orb in degrees. Default 1°." },
|
|
140
|
+
},
|
|
141
|
+
required: ["datetime"],
|
|
142
|
+
additionalProperties: false,
|
|
143
|
+
},
|
|
144
|
+
handler: async (args) => {
|
|
145
|
+
validateRequired(args, ["datetime"]);
|
|
146
|
+
const body = {
|
|
147
|
+
date_time: { iso: args.datetime },
|
|
148
|
+
};
|
|
149
|
+
if (args.star_names)
|
|
150
|
+
body.star_names = args.star_names;
|
|
151
|
+
if (args.orb != null)
|
|
152
|
+
body.orb = args.orb;
|
|
153
|
+
return await backendClient.post("/ephemeris/fixed-stars", body);
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
// POST /ephemeris/hermetic-lots
|
|
157
|
+
registerTool({
|
|
158
|
+
name: "ephemeris_hermetic_lots",
|
|
159
|
+
description: "Calculate Arabic Parts / Hermetic Lots (Lot of Fortune, Spirit, etc.) " +
|
|
160
|
+
"for a given chart.\n\n" +
|
|
161
|
+
"CREDIT COST: 1 credit per call.",
|
|
162
|
+
inputSchema: {
|
|
163
|
+
type: "object",
|
|
164
|
+
properties: {
|
|
165
|
+
datetime: { type: "string", description: "ISO 8601 date/time." },
|
|
166
|
+
latitude: { type: "number", description: "Observer latitude." },
|
|
167
|
+
longitude: { type: "number", description: "Observer longitude." },
|
|
168
|
+
},
|
|
169
|
+
required: ["datetime", "latitude", "longitude"],
|
|
170
|
+
additionalProperties: false,
|
|
171
|
+
},
|
|
172
|
+
handler: async (args) => {
|
|
173
|
+
validateRequired(args, ["datetime", "latitude", "longitude"]);
|
|
174
|
+
return await backendClient.post("/ephemeris/hermetic-lots", {
|
|
175
|
+
date_time: { iso: args.datetime },
|
|
176
|
+
latitude: args.latitude,
|
|
177
|
+
longitude: args.longitude,
|
|
178
|
+
});
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
// POST /ephemeris/angles-points
|
|
182
|
+
registerTool({
|
|
183
|
+
name: "ephemeris_angles_points",
|
|
184
|
+
description: "Calculate chart angles and sensitive points (ASC, MC, DSC, IC, Vertex, " +
|
|
185
|
+
"East Point, etc.) for a given date/time and location.\n\n" +
|
|
186
|
+
"CREDIT COST: 1 credit per call.",
|
|
187
|
+
inputSchema: {
|
|
188
|
+
type: "object",
|
|
189
|
+
properties: {
|
|
190
|
+
datetime: { type: "string", description: "ISO 8601 date/time." },
|
|
191
|
+
latitude: { type: "number", description: "Observer latitude." },
|
|
192
|
+
longitude: { type: "number", description: "Observer longitude." },
|
|
193
|
+
},
|
|
194
|
+
required: ["datetime", "latitude", "longitude"],
|
|
195
|
+
additionalProperties: false,
|
|
196
|
+
},
|
|
197
|
+
handler: async (args) => {
|
|
198
|
+
validateRequired(args, ["datetime", "latitude", "longitude"]);
|
|
199
|
+
return await backendClient.post("/ephemeris/angles-points", {
|
|
200
|
+
date_time: { iso: args.datetime },
|
|
201
|
+
latitude: args.latitude,
|
|
202
|
+
longitude: args.longitude,
|
|
203
|
+
});
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
// POST /ephemeris/aspect-check
|
|
207
|
+
registerTool({
|
|
208
|
+
name: "ephemeris_aspect_check",
|
|
209
|
+
description: "Check the aspect between two ecliptic longitudes. Returns the angular separation " +
|
|
210
|
+
"and any aspects within orb (conjunction, sextile, square, trine, opposition, etc.).\n\n" +
|
|
211
|
+
"CREDIT COST: 1 credit per call.\n\n" +
|
|
212
|
+
"EXAMPLE: Check aspect between 15° Aries and 75° Gemini:\n" +
|
|
213
|
+
" longitude_1=15, longitude_2=75",
|
|
214
|
+
inputSchema: {
|
|
215
|
+
type: "object",
|
|
216
|
+
properties: {
|
|
217
|
+
longitude_1: { type: "number", description: "First ecliptic longitude (0-360)." },
|
|
218
|
+
longitude_2: { type: "number", description: "Second ecliptic longitude (0-360)." },
|
|
219
|
+
max_orb: { type: "number", description: "Maximum orb in degrees. Default 8°." },
|
|
220
|
+
},
|
|
221
|
+
required: ["longitude_1", "longitude_2"],
|
|
222
|
+
additionalProperties: false,
|
|
223
|
+
},
|
|
224
|
+
handler: async (args) => {
|
|
225
|
+
validateRequired(args, ["longitude_1", "longitude_2"]);
|
|
226
|
+
const body = {
|
|
227
|
+
longitude_1: args.longitude_1,
|
|
228
|
+
longitude_2: args.longitude_2,
|
|
229
|
+
};
|
|
230
|
+
if (args.max_orb != null)
|
|
231
|
+
body.max_orb = args.max_orb;
|
|
232
|
+
return await backendClient.post("/ephemeris/aspect-check", body);
|
|
233
|
+
},
|
|
234
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { registerTool, validateRequired } from "../index.js";
|
|
2
|
+
import { backendClient } from "../../backend/client.js";
|
|
3
|
+
// POST /human-design/composite — OE-027
|
|
4
|
+
registerTool({
|
|
5
|
+
name: "human_design_composite",
|
|
6
|
+
description: "Calculate a Human Design composite chart for two people. Merges both bodygraphs " +
|
|
7
|
+
"to show shared channels, authority dynamics, and relationship type.\n\n" +
|
|
8
|
+
"CREDIT COST: 4 credits per call.\n\n" +
|
|
9
|
+
"EXAMPLE:\n" +
|
|
10
|
+
" person_a_datetime='1990-04-15T14:30:00Z', person_b_datetime='1988-09-22T08:15:00Z'",
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: "object",
|
|
13
|
+
properties: {
|
|
14
|
+
person_a_datetime: {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: "Person A birth datetime as ISO 8601 UTC (e.g. '1990-04-15T14:30:00Z').",
|
|
17
|
+
},
|
|
18
|
+
person_b_datetime: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Person B birth datetime as ISO 8601 UTC.",
|
|
21
|
+
},
|
|
22
|
+
format: {
|
|
23
|
+
type: "string",
|
|
24
|
+
enum: ["json", "llm"],
|
|
25
|
+
description: "Output format. 'llm' is compact.",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
required: ["person_a_datetime", "person_b_datetime"],
|
|
29
|
+
additionalProperties: false,
|
|
30
|
+
},
|
|
31
|
+
handler: async (args) => {
|
|
32
|
+
validateRequired(args, ["person_a_datetime", "person_b_datetime"]);
|
|
33
|
+
const body = {
|
|
34
|
+
subject_1: {
|
|
35
|
+
birth_datetime_utc: args.person_a_datetime,
|
|
36
|
+
},
|
|
37
|
+
subject_2: {
|
|
38
|
+
birth_datetime_utc: args.person_b_datetime,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
if (args.format)
|
|
42
|
+
body.format = args.format;
|
|
43
|
+
return await backendClient.post("/human-design/composite", body);
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
// POST /human-design/penta — OE-027
|
|
47
|
+
registerTool({
|
|
48
|
+
name: "human_design_penta",
|
|
49
|
+
description: "Calculate a Human Design Penta (group) chart for 3-5 people. Shows functional " +
|
|
50
|
+
"attributes, leadership dynamics, channels, redundancies, and a group stability score.\n\n" +
|
|
51
|
+
"CREDIT COST: 6 credits per call.\n\n" +
|
|
52
|
+
"EXAMPLE (3 people):\n" +
|
|
53
|
+
" group_name='Team Alpha',\n" +
|
|
54
|
+
" members=[\n" +
|
|
55
|
+
" {id: 'alice', name: 'Alice', datetime: '1990-04-15T14:30:00Z'},\n" +
|
|
56
|
+
" {id: 'bob', name: 'Bob', datetime: '1988-09-22T08:15:00Z'},\n" +
|
|
57
|
+
" {id: 'carol', name: 'Carol', datetime: '1995-01-10T11:00:00Z'}\n" +
|
|
58
|
+
" ]",
|
|
59
|
+
inputSchema: {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {
|
|
62
|
+
group_name: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Name of the group.",
|
|
65
|
+
},
|
|
66
|
+
members: {
|
|
67
|
+
type: "array",
|
|
68
|
+
items: {
|
|
69
|
+
type: "object",
|
|
70
|
+
properties: {
|
|
71
|
+
id: { type: "string", description: "Unique member ID." },
|
|
72
|
+
name: { type: "string", description: "Member's name." },
|
|
73
|
+
datetime: { type: "string", description: "Birth datetime as ISO 8601 UTC." },
|
|
74
|
+
},
|
|
75
|
+
required: ["id", "name", "datetime"],
|
|
76
|
+
},
|
|
77
|
+
description: "Array of 3-5 members with id, name, and datetime.",
|
|
78
|
+
minItems: 3,
|
|
79
|
+
maxItems: 5,
|
|
80
|
+
},
|
|
81
|
+
format: {
|
|
82
|
+
type: "string",
|
|
83
|
+
enum: ["json", "llm"],
|
|
84
|
+
description: "Output format.",
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
required: ["group_name", "members"],
|
|
88
|
+
additionalProperties: false,
|
|
89
|
+
},
|
|
90
|
+
handler: async (args) => {
|
|
91
|
+
validateRequired(args, ["group_name", "members"]);
|
|
92
|
+
const members = args.members.map((m) => ({
|
|
93
|
+
id: m.id,
|
|
94
|
+
name: m.name,
|
|
95
|
+
birth_data: {
|
|
96
|
+
birth_datetime_utc: m.datetime,
|
|
97
|
+
},
|
|
98
|
+
}));
|
|
99
|
+
const body = {
|
|
100
|
+
group_name: args.group_name,
|
|
101
|
+
members,
|
|
102
|
+
};
|
|
103
|
+
if (args.format)
|
|
104
|
+
body.format = args.format;
|
|
105
|
+
return await backendClient.post("/human-design/penta", body);
|
|
106
|
+
},
|
|
107
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { registerTool, validateRequired } from "../index.js";
|
|
2
|
+
import { backendClient } from "../../backend/client.js";
|
|
3
|
+
registerTool({
|
|
4
|
+
name: "ephemeris_progressed_chart",
|
|
5
|
+
description: "Calculate a Secondary Progressed (or Solar Arc / Tertiary) chart. " +
|
|
6
|
+
"Advances the natal chart symbolically — 1 day = 1 year (secondary), or using solar arc motion. " +
|
|
7
|
+
"Returns progressed planet positions, house cusps, aspects, and retrograde status.\n\n" +
|
|
8
|
+
"CREDIT COST: 2 credits per call.\n\n" +
|
|
9
|
+
"EXAMPLE: Secondary progressions for someone born 1985-06-21, progressed to 2026-01-01:\n" +
|
|
10
|
+
" birth_datetime='1985-06-21T14:00:00', birth_latitude=51.5, birth_longitude=-0.12,\n" +
|
|
11
|
+
" target_datetime='2026-01-01', method='secondary'",
|
|
12
|
+
inputSchema: {
|
|
13
|
+
type: "object",
|
|
14
|
+
properties: {
|
|
15
|
+
birth_datetime: {
|
|
16
|
+
type: "string",
|
|
17
|
+
description: "ISO 8601 natal birth date/time.",
|
|
18
|
+
},
|
|
19
|
+
birth_latitude: {
|
|
20
|
+
type: "number",
|
|
21
|
+
description: "Birth latitude in decimal degrees.",
|
|
22
|
+
},
|
|
23
|
+
birth_longitude: {
|
|
24
|
+
type: "number",
|
|
25
|
+
description: "Birth longitude in decimal degrees.",
|
|
26
|
+
},
|
|
27
|
+
target_datetime: {
|
|
28
|
+
type: "string",
|
|
29
|
+
description: "Target date to progress the chart to (ISO 8601).",
|
|
30
|
+
},
|
|
31
|
+
method: {
|
|
32
|
+
type: "string",
|
|
33
|
+
enum: ["secondary", "solar_arc", "tertiary"],
|
|
34
|
+
description: "Progression method. Defaults to 'secondary' (1 day = 1 year).",
|
|
35
|
+
},
|
|
36
|
+
include_aspects: {
|
|
37
|
+
type: "boolean",
|
|
38
|
+
description: "Whether to include aspect grid in the response. Default false.",
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
required: ["birth_datetime", "birth_latitude", "birth_longitude", "target_datetime"],
|
|
42
|
+
additionalProperties: false,
|
|
43
|
+
},
|
|
44
|
+
handler: async (args) => {
|
|
45
|
+
validateRequired(args, ["birth_datetime", "birth_latitude", "birth_longitude", "target_datetime"]);
|
|
46
|
+
const body = {
|
|
47
|
+
subject: {
|
|
48
|
+
name: "Progressed Subject",
|
|
49
|
+
birth_datetime: { iso: args.birth_datetime },
|
|
50
|
+
birth_location: {
|
|
51
|
+
latitude: { decimal: args.birth_latitude },
|
|
52
|
+
longitude: { decimal: args.birth_longitude },
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
target_datetime: { iso: args.target_datetime },
|
|
56
|
+
};
|
|
57
|
+
if (args.method) {
|
|
58
|
+
body.progression_options = { method: args.method };
|
|
59
|
+
}
|
|
60
|
+
if (args.include_aspects != null) {
|
|
61
|
+
body.options = { include_aspects: args.include_aspects };
|
|
62
|
+
}
|
|
63
|
+
return await backendClient.post("/ephemeris/progressed", body);
|
|
64
|
+
},
|
|
65
|
+
});
|
|
@@ -7,8 +7,7 @@ registerTool({
|
|
|
7
7
|
"Used to cast the Solar Return chart for the year ahead.\n\n" +
|
|
8
8
|
"CREDIT COST: 1 credit per call.\n\n" +
|
|
9
9
|
"EXAMPLE: Solar return for someone born 1985-06-21 near their 2026 birthday:\n" +
|
|
10
|
-
" birth_datetime='1985-06-21T14:00:00',
|
|
11
|
-
" target_datetime='2026-06-01'",
|
|
10
|
+
" birth_datetime='1985-06-21T14:00:00', target_datetime='2026-06-01'",
|
|
12
11
|
inputSchema: {
|
|
13
12
|
type: "object",
|
|
14
13
|
properties: {
|
|
@@ -16,48 +15,46 @@ registerTool({
|
|
|
16
15
|
type: "string",
|
|
17
16
|
description: "ISO 8601 birth date/time (e.g. '1985-06-21T14:00:00').",
|
|
18
17
|
},
|
|
18
|
+
target_datetime: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Date/time near which to find the Solar Return (ISO 8601). Required.",
|
|
21
|
+
},
|
|
19
22
|
birth_latitude: {
|
|
20
23
|
type: "number",
|
|
21
|
-
description: "Birth latitude in decimal degrees.",
|
|
24
|
+
description: "Birth latitude in decimal degrees (optional, for location context).",
|
|
22
25
|
},
|
|
23
26
|
birth_longitude: {
|
|
24
27
|
type: "number",
|
|
25
|
-
description: "Birth longitude in decimal degrees.",
|
|
26
|
-
},
|
|
27
|
-
target_datetime: {
|
|
28
|
-
type: "string",
|
|
29
|
-
description: "Date near which to find the Solar Return (ISO 8601). Defaults to now.",
|
|
28
|
+
description: "Birth longitude in decimal degrees (optional, for location context).",
|
|
30
29
|
},
|
|
31
30
|
return_latitude: {
|
|
32
31
|
type: "number",
|
|
33
|
-
description: "Location latitude for the return chart (optional).
|
|
32
|
+
description: "Location latitude for the return chart (optional).",
|
|
34
33
|
},
|
|
35
34
|
return_longitude: {
|
|
36
35
|
type: "number",
|
|
37
|
-
description: "Location longitude for the return chart (optional).
|
|
36
|
+
description: "Location longitude for the return chart (optional).",
|
|
38
37
|
},
|
|
39
38
|
},
|
|
40
|
-
required: ["birth_datetime", "
|
|
39
|
+
required: ["birth_datetime", "target_datetime"],
|
|
41
40
|
additionalProperties: false,
|
|
42
41
|
},
|
|
43
42
|
handler: async (args) => {
|
|
44
|
-
validateRequired(args, ["birth_datetime", "
|
|
43
|
+
validateRequired(args, ["birth_datetime", "target_datetime"]);
|
|
45
44
|
const body = {
|
|
46
|
-
birth_datetime: {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
birth_datetime: { iso: args.birth_datetime },
|
|
46
|
+
target_datetime: { iso: args.target_datetime },
|
|
47
|
+
};
|
|
48
|
+
if (args.birth_latitude != null && args.birth_longitude != null) {
|
|
49
|
+
body.location = {
|
|
50
50
|
latitude: { decimal: args.birth_latitude },
|
|
51
51
|
longitude: { decimal: args.birth_longitude },
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
if (args.target_datetime) {
|
|
55
|
-
body.target_datetime = { iso: args.target_datetime };
|
|
52
|
+
};
|
|
56
53
|
}
|
|
57
54
|
if (args.return_latitude != null && args.return_longitude != null) {
|
|
58
55
|
body.return_location = {
|
|
59
|
-
latitude: args.return_latitude,
|
|
60
|
-
longitude: args.return_longitude,
|
|
56
|
+
latitude: { decimal: args.return_latitude },
|
|
57
|
+
longitude: { decimal: args.return_longitude },
|
|
61
58
|
};
|
|
62
59
|
}
|
|
63
60
|
return await backendClient.post("/predictive/returns/solar", body);
|
|
@@ -70,8 +67,7 @@ registerTool({
|
|
|
70
67
|
"Used to cast the monthly Lunar Return chart.\n\n" +
|
|
71
68
|
"CREDIT COST: 1 credit per call.\n\n" +
|
|
72
69
|
"EXAMPLE: Next lunar return after 2026-03-15 for someone born 1990-04-15:\n" +
|
|
73
|
-
" birth_datetime='1990-04-15T14:30:00',
|
|
74
|
-
" target_datetime='2026-03-15'",
|
|
70
|
+
" birth_datetime='1990-04-15T14:30:00', target_datetime='2026-03-15'",
|
|
75
71
|
inputSchema: {
|
|
76
72
|
type: "object",
|
|
77
73
|
properties: {
|
|
@@ -79,48 +75,70 @@ registerTool({
|
|
|
79
75
|
type: "string",
|
|
80
76
|
description: "ISO 8601 birth date/time.",
|
|
81
77
|
},
|
|
82
|
-
birth_latitude: {
|
|
83
|
-
type: "number",
|
|
84
|
-
description: "Birth latitude in decimal degrees.",
|
|
85
|
-
},
|
|
86
|
-
birth_longitude: {
|
|
87
|
-
type: "number",
|
|
88
|
-
description: "Birth longitude in decimal degrees.",
|
|
89
|
-
},
|
|
90
78
|
target_datetime: {
|
|
91
79
|
type: "string",
|
|
92
|
-
description: "Date near which to find the Lunar Return (ISO 8601).
|
|
80
|
+
description: "Date/time near which to find the Lunar Return (ISO 8601). Required.",
|
|
93
81
|
},
|
|
94
|
-
|
|
82
|
+
birth_latitude: {
|
|
95
83
|
type: "number",
|
|
96
|
-
description: "
|
|
84
|
+
description: "Birth latitude in decimal degrees (optional).",
|
|
97
85
|
},
|
|
98
|
-
|
|
86
|
+
birth_longitude: {
|
|
99
87
|
type: "number",
|
|
100
|
-
description: "
|
|
88
|
+
description: "Birth longitude in decimal degrees (optional).",
|
|
101
89
|
},
|
|
102
90
|
},
|
|
103
|
-
required: ["birth_datetime", "
|
|
91
|
+
required: ["birth_datetime", "target_datetime"],
|
|
104
92
|
additionalProperties: false,
|
|
105
93
|
},
|
|
106
94
|
handler: async (args) => {
|
|
107
|
-
validateRequired(args, ["birth_datetime", "
|
|
95
|
+
validateRequired(args, ["birth_datetime", "target_datetime"]);
|
|
108
96
|
const body = {
|
|
109
97
|
birth_datetime: { iso: args.birth_datetime },
|
|
110
|
-
|
|
98
|
+
target_datetime: { iso: args.target_datetime },
|
|
99
|
+
};
|
|
100
|
+
if (args.birth_latitude != null && args.birth_longitude != null) {
|
|
101
|
+
body.location = {
|
|
111
102
|
latitude: { decimal: args.birth_latitude },
|
|
112
103
|
longitude: { decimal: args.birth_longitude },
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
if (args.target_datetime) {
|
|
116
|
-
body.target_datetime = { iso: args.target_datetime };
|
|
117
|
-
}
|
|
118
|
-
if (args.return_latitude != null && args.return_longitude != null) {
|
|
119
|
-
body.return_location = {
|
|
120
|
-
latitude: args.return_latitude,
|
|
121
|
-
longitude: args.return_longitude,
|
|
122
104
|
};
|
|
123
105
|
}
|
|
124
106
|
return await backendClient.post("/predictive/returns/lunar", body);
|
|
125
107
|
},
|
|
126
108
|
});
|
|
109
|
+
// POST /predictive/returns (generic planetary return)
|
|
110
|
+
registerTool({
|
|
111
|
+
name: "ephemeris_planetary_return",
|
|
112
|
+
description: "Calculate a planetary return — when any planet returns to its natal longitude. " +
|
|
113
|
+
"Useful for Jupiter returns (~12 years), Saturn returns (~29 years), etc.\n\n" +
|
|
114
|
+
"CREDIT COST: 1 credit per call.\n\n" +
|
|
115
|
+
"EXAMPLE: Saturn return for birth 1990-04-15 near year 2019:\n" +
|
|
116
|
+
" body='saturn', birth_datetime='1990-04-15T14:30:00', target_datetime='2019-01-01'",
|
|
117
|
+
inputSchema: {
|
|
118
|
+
type: "object",
|
|
119
|
+
properties: {
|
|
120
|
+
body: {
|
|
121
|
+
type: "string",
|
|
122
|
+
description: "Planet name: sun, moon, mercury, venus, mars, jupiter, saturn.",
|
|
123
|
+
},
|
|
124
|
+
birth_datetime: {
|
|
125
|
+
type: "string",
|
|
126
|
+
description: "ISO 8601 birth date/time.",
|
|
127
|
+
},
|
|
128
|
+
target_datetime: {
|
|
129
|
+
type: "string",
|
|
130
|
+
description: "Date/time near which to find the return (ISO 8601). Required.",
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
required: ["body", "birth_datetime", "target_datetime"],
|
|
134
|
+
additionalProperties: false,
|
|
135
|
+
},
|
|
136
|
+
handler: async (args) => {
|
|
137
|
+
validateRequired(args, ["body", "birth_datetime", "target_datetime"]);
|
|
138
|
+
return await backendClient.post("/predictive/returns", {
|
|
139
|
+
body: args.body,
|
|
140
|
+
birth_datetime: { iso: args.birth_datetime },
|
|
141
|
+
target_datetime: { iso: args.target_datetime },
|
|
142
|
+
});
|
|
143
|
+
},
|
|
144
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|