@openephemeris/mcp-server 3.3.3 → 3.4.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.
@@ -110,16 +110,19 @@ registerTool({
110
110
  registerTool({
111
111
  name: "ephemeris_planetary_return",
112
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" +
113
+ "Useful for Jupiter returns (~12 years), Saturn returns (~29 years), Chiron returns (~50 years), " +
114
+ "Uranus returns (~84 years), etc.\n\n" +
114
115
  "CREDIT COST: 1 credit per call.\n\n" +
115
116
  "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
+ " body='saturn', birth_datetime='1990-04-15T14:30:00', target_datetime='2019-01-01'\n" +
118
+ "EXAMPLE: Chiron return for birth 1975-03-10 near age 50:\n" +
119
+ " body='chiron', birth_datetime='1975-03-10T08:00:00', target_datetime='2025-01-01'",
117
120
  inputSchema: {
118
121
  type: "object",
119
122
  properties: {
120
123
  body: {
121
124
  type: "string",
122
- description: "Planet name: sun, moon, mercury, venus, mars, jupiter, saturn.",
125
+ description: "Planet name: sun, moon, mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto, chiron, pholus.",
123
126
  },
124
127
  birth_datetime: {
125
128
  type: "string",
@@ -8,6 +8,13 @@ registerTool({
8
8
  "finding optimal timing windows.\n\n" +
9
9
  "HOW IT WORKS: This tool first calculates the natal chart to extract your actual planetary " +
10
10
  "ecliptic longitudes, then searches for transiting planets crossing those exact degrees.\n\n" +
11
+ "ASPECT ANGLES: Use aspect_angle to search for specific aspects to natal positions:\n" +
12
+ " 0 = conjunction/return (default), 180 = opposition, 90 = square, 120 = trine.\n" +
13
+ " Example: Saturn Return → transiting_planets=['saturn'], natal_points=['saturn'], aspect_angle=0\n" +
14
+ " Example: Uranus Opposition → transiting_planets=['uranus'], natal_points=['uranus'], aspect_angle=180\n" +
15
+ " Example: Chiron Return → transiting_planets=['chiron'], natal_points=['chiron'], aspect_angle=0\n\n" +
16
+ "SUPPORTED BODIES: Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, " +
17
+ "Pluto, Chiron, Pholus, Ceres, Pallas, Juno, Vesta, MeanNode.\n\n" +
11
18
  "CREDIT COST: 6 credits per call (1 for natal + 5 for transit search).\n\n" +
12
19
  "EXAMPLE: Find all Saturn transits to the natal Sun/Moon for the next 6 months:\n" +
13
20
  " natal_datetime='1990-04-15T14:30:00', natal_latitude=41.8781, natal_longitude=-87.6298,\n" +
@@ -38,13 +45,19 @@ registerTool({
38
45
  transiting_planets: {
39
46
  type: "array",
40
47
  items: { type: "string" },
41
- description: "List of transiting planet IDs to search. E.g. ['saturn', 'jupiter', 'uranus', 'pluto']. " +
48
+ description: "List of transiting planet IDs to search. E.g. ['saturn', 'jupiter', 'uranus', 'pluto', 'chiron']. " +
42
49
  "Omit to search all outer planets.",
43
50
  },
44
51
  natal_points: {
45
52
  type: "array",
46
53
  items: { type: "string" },
47
- description: "Natal point IDs whose exact longitudes should be targeted. E.g. ['sun', 'moon', 'asc', 'mc']. Omit for all core points.",
54
+ description: "Natal point IDs whose exact longitudes should be targeted. E.g. ['sun', 'moon', 'asc', 'mc', 'saturn', 'chiron']. Omit for all core points.",
55
+ },
56
+ aspect_angle: {
57
+ type: "number",
58
+ description: "Aspect angle in degrees to apply to each natal longitude. 0 = conjunction/return (default), " +
59
+ "180 = opposition, 90 = square, 120 = trine. The effective search target becomes " +
60
+ "(natal_longitude + aspect_angle) mod 360.",
48
61
  },
49
62
  },
50
63
  required: ["natal_datetime", "natal_latitude", "natal_longitude", "start_date", "end_date"],
@@ -119,11 +132,21 @@ registerTool({
119
132
  };
120
133
  if (args.transiting_planets)
121
134
  transitBody.planet_names = args.transiting_planets;
135
+ // When aspect_angle is provided, apply offset to compute effective target degrees
136
+ // (natal_lon + aspect_angle) mod 360 for each natal point
137
+ let effectiveTargets = targetDegrees;
138
+ if (typeof args.aspect_angle === "number" && args.aspect_angle !== 0) {
139
+ effectiveTargets = targetDegrees.map((deg) => ((deg + args.aspect_angle) % 360 + 360) % 360);
140
+ transitBody.target_degrees = effectiveTargets;
141
+ // Also include aspect metadata for labeling in results
142
+ transitBody.search_criteria = { aspect_angle: args.aspect_angle };
143
+ }
122
144
  const transitResult = await backendClient.request("POST", "/predictive/transits/search", { data: transitBody });
123
145
  // Return combined context so the LLM knows what natal positions were targeted
124
146
  return {
125
147
  natal_positions: natalPositionMap,
126
- target_degrees_used: targetDegrees,
148
+ target_degrees_used: effectiveTargets,
149
+ aspect_angle: args.aspect_angle ?? 0,
127
150
  transit_results: transitResult,
128
151
  };
129
152
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openephemeris/mcp-server",
3
- "version": "3.3.3",
3
+ "version": "3.4.0",
4
4
  "description": "Model Context Protocol server for the Open Ephemeris astronomical computation API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",