@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 +29 -0
- package/README.md +6 -5
- package/config/dev-allowlist.json +32 -2
- package/dist/tools/index.js +1 -0
- package/dist/tools/specialized/electional.js +90 -0
- package/package.json +1 -1
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: **
|
|
444
|
-
- Methods: `GET=
|
|
445
|
-
- Registered tools (`OPENEPHEMERIS_PROFILE=dev`): **
|
|
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` |
|
|
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-
|
|
132
|
-
"openapi_sha256": "
|
|
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",
|
package/dist/tools/index.js
CHANGED
|
@@ -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
|
+
});
|