@openephemeris/mcp-server 4.4.0 → 4.5.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/CHANGELOG.md CHANGED
@@ -7,6 +7,35 @@ Version numbering follows [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ---
9
9
 
10
+ ## [4.5.0] — 2026-07-30
11
+
12
+ Adds a tool for the question the astrocartography tools could not answer:
13
+ *when* a planet reaches an angle at a place, rather than what is angular
14
+ there at a fixed moment.
15
+
16
+ ### Added
17
+
18
+ - **`electional_angle_crossings` — find when a body crosses the Ascendant,
19
+ Descendant, Midheaven, or Imum Coeli at a location.** The time-inverse of
20
+ astrocartography. `acg_hits` answers "which lines pass near Warsaw at this
21
+ moment"; this answers "at what moment does Mercury cross the Descendant
22
+ over Warsaw". Give it a latitude/longitude and a date range and it returns
23
+ the crossing moments chronologically, with each body's position and a
24
+ daylight hint at that instant.
25
+
26
+ Crossing times are solved on the same in-mundo (equatorial RA/Dec) geometry
27
+ the astrocartography line engine draws, so casting a map at a returned
28
+ moment puts that line through the query point — the search and the map
29
+ cannot disagree.
30
+
31
+ Defaults to the classical seven bodies and all four angles over the current
32
+ UTC day. Circumpolar cases — a body that never rises or never sets at that
33
+ latitude — simply return no event rather than an error. Ranges up to 366
34
+ days; an over-long range is rejected rather than quietly shortened.
35
+
36
+ Advertised in the default tool surface. 5 credits per call, Developer plan
37
+ and above.
38
+
10
39
  ## [4.4.0] — 2026-07-30
11
40
 
12
41
  Puts the location resolver on the natural path for the four `explore_*`
package/README.md CHANGED
@@ -440,10 +440,10 @@ When you update the MCP server logic (handlers, bug fixes, hardening), you shoul
440
440
 
441
441
  Generated by `npm run sync:readme` from `config/dev-allowlist.json` and the live tool registry.
442
442
 
443
- - Allowlisted operations: **28**
444
- - Methods: `GET=4`, `POST=24`, `PUT=0`, `PATCH=0`, `DELETE=0`
445
- - Registered tools (`OPENEPHEMERIS_PROFILE=dev`): **91**
446
- - Typed tools: `account_usage`, `acg_hits`, `acg_power_lines`, `auth_login`, `auth_logout`, `auth_status`, `bazi_annual_pillar`, `bazi_chart`, `bazi_compatibility`, `bazi_element_balance`, `bazi_luck_pillars`, `bazi_recalculate`, `bazi_ten_gods`, `bi_wheel_on_cross_aspect_click`, `bi_wheel_on_house_click`, `bi_wheel_on_planet_click`, `bi_wheel_recalculate`, `bi_wheel_synopsis`, `bodygraph_recalculate`, `chart_wheel_on_aspect_click`, `chart_wheel_on_house_click`, `chart_wheel_on_planet_click`, `chart_wheel_recalculate`, `chinese_bazi`, `dev_list_allowed`, `dev_read_api`, `dev_write_api`, `electional_aspect_search`, `electional_moment_analysis`, `electional_station_tracker`, `ephemeris_angles_points`, `ephemeris_aspect_check`, `ephemeris_bi_wheel`, `ephemeris_chart_wheel`, `ephemeris_composite`, `ephemeris_composite_midpoint`, `ephemeris_dignities`, `ephemeris_electional`, `ephemeris_fixed_stars`, `ephemeris_hermetic_lots`, `ephemeris_house_cusps`, `ephemeris_lunar_return`, `ephemeris_midpoints`, `ephemeris_moon_phase`, `ephemeris_natal_batch`, `ephemeris_natal_chart`, `ephemeris_natal_transits`, `ephemeris_next_eclipse`, `ephemeris_next_lunar_phase`, `ephemeris_overlay`, `ephemeris_planet_position`, `ephemeris_planetary_return`, `ephemeris_progressed_chart`, `ephemeris_relocation`, `ephemeris_retrograde_status`, `ephemeris_solar_return`, `ephemeris_synastry`, `ephemeris_transits`, `explore_bazi_chart`, `explore_bi_wheel`, `explore_human_design`, `explore_human_design_connection`, `explore_human_design_transit`, `explore_moon_phase`, `explore_natal_chart`, `explore_transit_timeline`, `explore_vedic_chart`, `hd_on_center_click`, `hd_on_channel_click`, `hd_on_connection_channel_click`, `hd_on_gate_click`, `hd_on_planet_click`, `hd_on_transit_channel_click`, `hd_on_variable_click`, `hd_opposition`, `hd_planetary_return`, `human_design_bodygraph`, `human_design_chart`, `human_design_composite`, `human_design_penta`, `location_search`, `moon_phase_recalculate`, `timezone_resolve`, `vedic_chart`, `vedic_chart_recalculate`, `venus_eight_year_star`, `venus_elongations`, `venus_phase`, `venus_star_points`, `venus_star_points_conjunctions`, `venus_stations`
443
+ - Allowlisted operations: **31**
444
+ - Methods: `GET=5`, `POST=26`, `PUT=0`, `PATCH=0`, `DELETE=0`
445
+ - Registered tools (`OPENEPHEMERIS_PROFILE=dev`): **92**
446
+ - Typed tools: `account_usage`, `acg_hits`, `acg_power_lines`, `auth_login`, `auth_logout`, `auth_status`, `bazi_annual_pillar`, `bazi_chart`, `bazi_compatibility`, `bazi_element_balance`, `bazi_luck_pillars`, `bazi_recalculate`, `bazi_ten_gods`, `bi_wheel_on_cross_aspect_click`, `bi_wheel_on_house_click`, `bi_wheel_on_planet_click`, `bi_wheel_recalculate`, `bi_wheel_synopsis`, `bodygraph_recalculate`, `chart_wheel_on_aspect_click`, `chart_wheel_on_house_click`, `chart_wheel_on_planet_click`, `chart_wheel_recalculate`, `chinese_bazi`, `dev_list_allowed`, `dev_read_api`, `dev_write_api`, `electional_angle_crossings`, `electional_aspect_search`, `electional_moment_analysis`, `electional_station_tracker`, `ephemeris_angles_points`, `ephemeris_aspect_check`, `ephemeris_bi_wheel`, `ephemeris_chart_wheel`, `ephemeris_composite`, `ephemeris_composite_midpoint`, `ephemeris_dignities`, `ephemeris_electional`, `ephemeris_fixed_stars`, `ephemeris_hermetic_lots`, `ephemeris_house_cusps`, `ephemeris_lunar_return`, `ephemeris_midpoints`, `ephemeris_moon_phase`, `ephemeris_natal_batch`, `ephemeris_natal_chart`, `ephemeris_natal_transits`, `ephemeris_next_eclipse`, `ephemeris_next_lunar_phase`, `ephemeris_overlay`, `ephemeris_planet_position`, `ephemeris_planetary_return`, `ephemeris_progressed_chart`, `ephemeris_relocation`, `ephemeris_retrograde_status`, `ephemeris_solar_return`, `ephemeris_synastry`, `ephemeris_transits`, `explore_bazi_chart`, `explore_bi_wheel`, `explore_human_design`, `explore_human_design_connection`, `explore_human_design_transit`, `explore_moon_phase`, `explore_natal_chart`, `explore_transit_timeline`, `explore_vedic_chart`, `hd_on_center_click`, `hd_on_channel_click`, `hd_on_connection_channel_click`, `hd_on_gate_click`, `hd_on_planet_click`, `hd_on_transit_channel_click`, `hd_on_variable_click`, `hd_opposition`, `hd_planetary_return`, `human_design_bodygraph`, `human_design_chart`, `human_design_composite`, `human_design_penta`, `location_search`, `moon_phase_recalculate`, `timezone_resolve`, `vedic_chart`, `vedic_chart_recalculate`, `venus_eight_year_star`, `venus_elongations`, `venus_phase`, `venus_star_points`, `venus_star_points_conjunctions`, `venus_stations`
447
447
  - Generic tools:
448
448
 
449
449
  ### Allowlist Families
@@ -453,8 +453,9 @@ Generated by `npm run sync:readme` from `config/dev-allowlist.json` and the live
453
453
  | `acg` | 4 | `POST /acg/ccg`, `POST /acg/hits` |
454
454
  | `chinese` | 5 | `POST /chinese/bazi/compatibility`, `POST /chinese/bazi/element-balance` |
455
455
  | `comparative` | 5 | `POST /comparative/composite`, `POST /comparative/composite/midpoint` |
456
- | `electional` | 4 | `GET /electional/aspect-search`, `GET /electional/find-window` |
456
+ | `electional` | 5 | `GET /electional/angle-crossings`, `GET /electional/aspect-search` |
457
457
  | `ephemeris` | 1 | `POST /ephemeris/relocation` |
458
+ | `human-design` | 2 | `POST /human-design/composite`, `POST /human-design/transit-chart` |
458
459
  | `predictive` | 6 | `POST /predictive/returns`, `POST /predictive/returns/lunar` |
459
460
  | `visualization` | 3 | `POST /visualization/bi-wheel`, `POST /visualization/bodygraph` |
460
461
  <!-- GENERATED:RUNTIME_SNAPSHOT:END -->
@@ -71,6 +71,10 @@
71
71
  "method": "POST",
72
72
  "path": "/comparative/synastry"
73
73
  },
74
+ {
75
+ "method": "GET",
76
+ "path": "/electional/angle-crossings"
77
+ },
74
78
  {
75
79
  "method": "GET",
76
80
  "path": "/electional/aspect-search"
@@ -91,6 +95,14 @@
91
95
  "method": "POST",
92
96
  "path": "/ephemeris/relocation"
93
97
  },
98
+ {
99
+ "method": "POST",
100
+ "path": "/human-design/composite"
101
+ },
102
+ {
103
+ "method": "POST",
104
+ "path": "/human-design/transit-chart"
105
+ },
94
106
  {
95
107
  "method": "POST",
96
108
  "path": "/predictive/returns/lunar"
@@ -128,8 +140,8 @@
128
140
  "path": "/visualization/chart-wheel"
129
141
  }
130
142
  ],
131
- "last_generated_at": "2026-05-14T01:35:40.409Z",
132
- "openapi_sha256": "50112cd7017466815265d92e7d73cbc29be6bdc729a87db50989f189d562d201",
143
+ "last_generated_at": "2026-07-30T20:30:07.623Z",
144
+ "openapi_sha256": "c8d62588232551c514979433b2829ceb951ddce99334e65a3deed112a28bb11a",
133
145
  "candidates_get": [
134
146
  {
135
147
  "method": "GET",
@@ -243,6 +255,14 @@
243
255
  ],
244
256
  "operationId": "get_solar_eclipse_local_eclipse_solar_local_get"
245
257
  },
258
+ {
259
+ "method": "GET",
260
+ "path": "/electional/angle-crossings",
261
+ "tags": [
262
+ "electional"
263
+ ],
264
+ "operationId": "ElectionalAngleCrossingsElectionalAngleCrossingsGet"
265
+ },
246
266
  {
247
267
  "method": "GET",
248
268
  "path": "/electional/aspect-search",
@@ -925,6 +945,14 @@
925
945
  ],
926
946
  "operationId": "human_design_penta_human_design_penta_post"
927
947
  },
948
+ {
949
+ "method": "POST",
950
+ "path": "/human-design/transit-chart",
951
+ "tags": [
952
+ "Human Design"
953
+ ],
954
+ "operationId": "human_design_transit_chart_human_design_transit_chart_post"
955
+ },
928
956
  {
929
957
  "method": "POST",
930
958
  "path": "/human-design/transit",
@@ -1105,6 +1133,8 @@
1105
1133
  "Non-GET allowlisted: POST /comparative/overlay",
1106
1134
  "Non-GET allowlisted: POST /comparative/synastry",
1107
1135
  "Non-GET allowlisted: POST /ephemeris/relocation",
1136
+ "Non-GET allowlisted: POST /human-design/composite",
1137
+ "Non-GET allowlisted: POST /human-design/transit-chart",
1108
1138
  "Non-GET allowlisted: POST /predictive/returns/lunar",
1109
1139
  "Non-GET allowlisted: POST /predictive/returns/solar",
1110
1140
  "Non-GET allowlisted: POST /predictive/returns",
@@ -66,6 +66,7 @@ export const CORE_TOOL_NAMES = new Set([
66
66
  "ephemeris_electional",
67
67
  "electional_moment_analysis",
68
68
  "electional_station_tracker",
69
+ "electional_angle_crossings",
69
70
  // Astrocartography
70
71
  "acg_power_lines",
71
72
  "acg_hits",
@@ -239,3 +239,93 @@ registerTool({
239
239
  });
240
240
  },
241
241
  });
242
+ // GET /electional/angle-crossings — OE-FEAT-2026-001
243
+ registerTool({
244
+ name: "electional_angle_crossings",
245
+ description: "Find WHEN a body crosses an angle (Ascendant, Descendant, Midheaven, Imum Coeli) at a specific " +
246
+ "place — the time-inverse of astrocartography. Answers 'when does Mercury cross the Descendant " +
247
+ "in Warsaw today?'\n\n" +
248
+ "✅ USE THIS FOR: 'when is Venus on my horizon in Lisbon?', 'what time does Jupiter culminate " +
249
+ "over Tokyo on Friday?', timing a moment by a planet's angularity at a place.\n" +
250
+ "❌ NOT FOR: which lines pass near a place at a fixed time → use acg_hits instead.\n\n" +
251
+ "Crossing times use the same in-mundo geometry as the astrocartography line engine, so casting a " +
252
+ "map at a returned moment puts that line through the query point. Circumpolar cases (a body that " +
253
+ "never rises or never sets at that latitude) simply return no event.\n\n" +
254
+ "CREDIT COST: 5 credits per call.\n\n" +
255
+ "EXAMPLE: When does Mercury cross the Descendant over Warsaw on 2026-07-30?\n" +
256
+ " latitude=52.2297, longitude=21.0122, bodies='Mercury', angles='DC',\n" +
257
+ " start='2026-07-30T00:00:00Z', end='2026-07-31T00:00:00Z'",
258
+ inputSchema: {
259
+ type: "object",
260
+ properties: {
261
+ latitude: {
262
+ type: "number",
263
+ description: "Latitude of the place in decimal degrees (positive = North). Resolve from a place name with location_search; never recall coordinates from memory.",
264
+ },
265
+ longitude: {
266
+ type: "number",
267
+ description: "Longitude of the place in decimal degrees (positive = East).",
268
+ },
269
+ start: {
270
+ type: "string",
271
+ description: "Start of the search range. " + WINDOW_DATE_DESC + " Defaults to the start of the current UTC day.",
272
+ },
273
+ end: {
274
+ type: "string",
275
+ description: "End of the search range. " + WINDOW_DATE_DESC + " Defaults to 24 hours after start. Maximum range 366 days.",
276
+ },
277
+ bodies: {
278
+ type: "string",
279
+ description: "Comma-separated body names, e.g. 'Mercury,Venus'. Defaults to the classical seven " +
280
+ "(Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn). Aliases: 'NorthNode'/'Rahu' → MeanNode, 'Ketu' → SouthNode.",
281
+ },
282
+ angles: {
283
+ type: "string",
284
+ description: "Comma-separated angles: AC, DC, MC, IC (ASC/DSC accepted). Defaults to all four.",
285
+ },
286
+ refraction_correction: {
287
+ type: "boolean",
288
+ description: "Apply atmospheric refraction to the AC/DC horizon. Defaults to false (geometric horizon), " +
289
+ "which is what the astrocartography endpoints use by default — leave it off to keep times and map lines aligned.",
290
+ },
291
+ max_results: {
292
+ type: "number",
293
+ description: "Maximum number of crossing events to return (default 5000).",
294
+ },
295
+ format: {
296
+ type: "string",
297
+ enum: ["json", "llm"],
298
+ description: "Output format. 'llm' = compact token-efficient output (available on all tiers).",
299
+ },
300
+ },
301
+ required: ["latitude", "longitude"],
302
+ additionalProperties: false,
303
+ },
304
+ outputSchema: OUTPUT_SCHEMA_JSON,
305
+ annotations: { title: "Angle Crossing Search", readOnlyHint: true, destructiveHint: false, idempotentHint: true },
306
+ handler: async (args) => {
307
+ validateRequired(args, ["latitude", "longitude"]);
308
+ const query = {
309
+ latitude: args.latitude,
310
+ longitude: args.longitude,
311
+ };
312
+ if (args.start)
313
+ query.start = args.start;
314
+ if (args.end)
315
+ query.end = args.end;
316
+ if (args.bodies)
317
+ query.bodies = args.bodies;
318
+ if (args.angles)
319
+ query.angles = args.angles;
320
+ if (args.refraction_correction !== undefined)
321
+ query.refraction_correction = args.refraction_correction;
322
+ if (args.max_results !== undefined)
323
+ query.max_results = args.max_results;
324
+ if (args.format)
325
+ query.format = args.format;
326
+ return await getActiveClient().request("GET", "/electional/angle-crossings", {
327
+ data: {},
328
+ params: query,
329
+ });
330
+ },
331
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openephemeris/mcp-server",
3
- "version": "4.4.0",
3
+ "version": "4.5.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",