@openephemeris/mcp-server 4.15.1 → 4.17.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 +33 -0
- package/README.md +26 -27
- package/config/dev-allowlist.json +31 -19
- package/dist/backend/client.d.ts +2 -0
- package/dist/backend/client.js +15 -10
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.js +5 -3
- package/dist/prompts.js +2 -2
- package/dist/tools/apps/bazi-app.js +10 -10
- package/dist/tools/apps/bi-wheel-app.js +14 -14
- package/dist/tools/apps/bodygraph-app.js +35 -29
- package/dist/tools/apps/chart-wheel-app.js +12 -9
- package/dist/tools/apps/location-tools.js +17 -4
- package/dist/tools/apps/moon-phase-app.js +12 -11
- package/dist/tools/apps/transit-timeline-app.d.ts +3 -0
- package/dist/tools/apps/transit-timeline-app.js +86 -18
- package/dist/tools/apps/vedic-chart-app.js +9 -8
- package/dist/tools/auth.js +14 -12
- package/dist/tools/dev.js +17 -29
- package/dist/tools/invocation-status.d.ts +25 -0
- package/dist/tools/invocation-status.js +69 -0
- package/dist/tools/specialized/account.js +6 -10
- package/dist/tools/specialized/acg.js +16 -21
- package/dist/tools/specialized/bazi.js +7 -12
- package/dist/tools/specialized/eclipse.js +6 -13
- package/dist/tools/specialized/electional.js +30 -37
- package/dist/tools/specialized/ephemeris_core.js +21 -17
- package/dist/tools/specialized/ephemeris_extended.js +22 -19
- package/dist/tools/specialized/human_design.js +11 -14
- package/dist/tools/specialized/moon.js +15 -26
- package/dist/tools/specialized/natal.js +9 -8
- package/dist/tools/specialized/progressed.js +6 -6
- package/dist/tools/specialized/relocation.js +6 -7
- package/dist/tools/specialized/returns.js +6 -8
- package/dist/tools/specialized/synastry.js +7 -8
- package/dist/tools/specialized/transits.js +15 -14
- package/dist/tools/specialized/vedic.js +7 -6
- package/dist/tools/ui-meta.d.ts +3 -28
- package/dist/tools/ui-meta.js +25 -16
- package/dist/ui/bi-wheel.html +468 -450
- package/dist/ui/chart-wheel.html +407 -389
- package/dist/ui/transit-timeline.html +2 -2
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,39 @@ Version numbering follows [Semantic Versioning](https://semver.org/).
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [4.17.0] — 2026-09-24
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Transit timelines show when each transit starts and ends.** `explore_transit_timeline` now asks
|
|
14
|
+
for orb windows (new `orb_deg` parameter, default 1°): every exact hit carries the in-orb window it
|
|
15
|
+
belongs to — the date the transit comes into orb and the date it leaves — and "pass 2 of 3" when a
|
|
16
|
+
retrograde brings the planet back over the same point without leaving the orb. Transits already in
|
|
17
|
+
orb at the start of the range are listed with whether they are applying or separating. The
|
|
18
|
+
interactive timeline shows the window on each card.
|
|
19
|
+
- **Two new API capabilities reachable through `dev_read_api`:** orb windows on
|
|
20
|
+
`POST /predictive/transits/search` (`orb_deg`, `aspect_orbs`, `natal_points`, `aspects`) and the new
|
|
21
|
+
`POST /human-design/transit-timeline` — every gate (and line) a transiting planet enters and leaves
|
|
22
|
+
over a date range, and when a transit completes one of your channels. 121 public endpoints.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
- **`dev_read_api` now reaches three endpoints it was missing:** `/ephemeris/draconic`,
|
|
26
|
+
`/ephemeris/prenatal-lunation` and `/predictive/primary-directions` (124 allowlisted operations).
|
|
27
|
+
|
|
28
|
+
## [4.16.0] — 2026-09-21
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
- **Synastry, composite, bi-wheel, returns, progressions, relocation, HD transit/connection overlays
|
|
32
|
+
and advanced BaZi are now available on the free tier (credits only).** Tool descriptions no longer
|
|
33
|
+
say "Pro tier" for any of them; astrocartography and electional window search stay Pro.
|
|
34
|
+
- **Credit-exhausted responses now link directly to a one-tap $5 top-up.** A `402` from the API hands
|
|
35
|
+
the model a single link (`https://openephemeris.com/topup?pack=payg_5`) that signs the user in if
|
|
36
|
+
needed and goes straight to checkout, instead of a dashboard wallet tab.
|
|
37
|
+
|
|
38
|
+
### Added
|
|
39
|
+
- **Listed in the ChatGPT app directory** (approved 2026-09-14). ChatGPT users install Open Ephemeris
|
|
40
|
+
in one click from [the listing](https://chatgpt.com/plugins/plugin_asdk_app_6a9c2787bc48819197698e71b29ef7c2)
|
|
41
|
+
— no Developer Mode, no URL to paste. Same server, same interactive charts as Claude.
|
|
42
|
+
|
|
10
43
|
## [4.15.1] — 2026-09-10
|
|
11
44
|
|
|
12
45
|
### Fixed
|
package/README.md
CHANGED
|
@@ -177,7 +177,8 @@ Cursor deeplink payload:
|
|
|
177
177
|
| Claude Desktop (macOS) | Manual | `~/Library/Application Support/Claude/claude_desktop_config.json` |
|
|
178
178
|
| Claude Desktop (Windows) | Manual | `%APPDATA%\Claude\claude_desktop_config.json` |
|
|
179
179
|
| Windsurf | Manual | `~/.codeium/windsurf/mcp_config.json` (or legacy `~/.codeium/mcp_config.json`) |
|
|
180
|
-
|
|
|
180
|
+
| ChatGPT | One-click | [Open Ephemeris in the ChatGPT app directory](https://chatgpt.com/plugins/plugin_asdk_app_6a9c2787bc48819197698e71b29ef7c2) |
|
|
181
|
+
| Claude Web / remote clients | Hosted URL | `https://mcp.openephemeris.com/mcp` |
|
|
181
182
|
|
|
182
183
|
### Client install walkthroughs
|
|
183
184
|
|
|
@@ -198,14 +199,12 @@ Cursor deeplink payload:
|
|
|
198
199
|
The server is hosted at `https://mcp.openephemeris.com/mcp` with full Streamable HTTP support (MCP 2025-11-25 spec). Remote-only clients can connect directly — no bridge/proxy required:
|
|
199
200
|
|
|
200
201
|
- **Claude Web**: Add `https://mcp.openephemeris.com/mcp` as a custom connector URL — leave OAuth Client ID and Secret **blank**. The server uses OAuth 2.1 + PKCE (Dynamic Client Registration), so Claude handles authentication via a browser popup automatically.
|
|
201
|
-
- **ChatGPT**:
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
secret to enter. Charts render inline, exactly as they do in Claude. *Developer mode was
|
|
208
|
-
available on a Free plan when this was last checked (2026-09-04); availability may vary.*
|
|
202
|
+
- **ChatGPT**: Open Ephemeris is an approved app in the ChatGPT app directory. Open
|
|
203
|
+
[the listing](https://chatgpt.com/plugins/plugin_asdk_app_6a9c2787bc48819197698e71b29ef7c2), click **Install plugin**, approve the sign-in (that also creates your
|
|
204
|
+
free OpenEphemeris account), then type `@Open Ephemeris` in any chat. Charts render inline,
|
|
205
|
+
exactly as they do in Claude. Prefer to wire it yourself? **Settings → Plugins → Advanced →
|
|
206
|
+
Developer mode → + Create app** accepts `https://mcp.openephemeris.com/mcp` with
|
|
207
|
+
Authentication on **OAuth** — no client ID or secret to enter.
|
|
209
208
|
- **Via Smithery**: Use the [Smithery listing](https://smithery.ai/servers/open-ephemeris/openephemeris) for managed connections with any client
|
|
210
209
|
- **Legacy SSE**: retired in 3.20.0 — use Streamable HTTP at `/mcp`
|
|
211
210
|
|
|
@@ -246,8 +245,8 @@ This matters more than it sounds. A natal chart returned as JSON is a list of nu
|
|
|
246
245
|
These need a host that supports MCP Apps. **Claude and ChatGPT both do**, and they render
|
|
247
246
|
the same widget — there is no separate ChatGPT build. MCP Apps ([SEP-1865][sep1865]) was
|
|
248
247
|
co-authored by Anthropic and OpenAI and became the first official MCP extension in January
|
|
249
|
-
2026, so one `ui://` resource serves both. In ChatGPT
|
|
250
|
-
|
|
248
|
+
2026, so one `ui://` resource serves both. In ChatGPT, install it from
|
|
249
|
+
[the app directory](https://chatgpt.com/plugins/plugin_asdk_app_6a9c2787bc48819197698e71b29ef7c2); in Claude, add the connector (see [Setup](#setup)).
|
|
251
250
|
|
|
252
251
|
In a client without app support the same tools still work; you get the underlying data
|
|
253
252
|
instead of the picture, so nothing breaks, you just don't get the wheel.
|
|
@@ -282,24 +281,24 @@ Screenshots of each are on the way.
|
|
|
282
281
|
| Moon phase / VOC | `ephemeris_moon_phase` | Explorer |
|
|
283
282
|
| Eclipse next visible | `ephemeris_next_eclipse` | Explorer |
|
|
284
283
|
| Electional window | `ephemeris_electional` | Developer |
|
|
285
|
-
| Moment analysis | `electional_moment_analysis` |
|
|
286
|
-
| Station tracker | `electional_station_tracker` |
|
|
284
|
+
| Moment analysis | `electional_moment_analysis` | Explorer |
|
|
285
|
+
| Station tracker | `electional_station_tracker` | Explorer |
|
|
287
286
|
| Aspect search | `electional_aspect_search` | Developer |
|
|
288
287
|
| Human Design chart | `human_design_chart` | Explorer |
|
|
289
|
-
| HD composite | `human_design_composite` |
|
|
290
|
-
| HD transit overlay | `explore_human_design_transit` |
|
|
291
|
-
| HD connection (synastry) | `explore_human_design_connection` |
|
|
288
|
+
| HD composite | `human_design_composite` | Explorer |
|
|
289
|
+
| HD transit overlay | `explore_human_design_transit` | Explorer |
|
|
290
|
+
| HD connection (synastry) | `explore_human_design_connection` | Explorer |
|
|
292
291
|
| HD penta | `human_design_penta` | Explorer |
|
|
293
292
|
| HD return / opposition | `hd_planetary_return`, `hd_opposition` | Explorer |
|
|
294
293
|
| Vedic chart | `vedic_chart` | Explorer |
|
|
295
294
|
| BaZi (Chinese) | `chinese_bazi` | Explorer |
|
|
296
|
-
| Synastry | `ephemeris_synastry` |
|
|
297
|
-
| Composite chart | `ephemeris_composite` |
|
|
298
|
-
| Relocation chart | `ephemeris_relocation` |
|
|
295
|
+
| Synastry | `ephemeris_synastry` | Explorer |
|
|
296
|
+
| Composite chart | `ephemeris_composite` | Explorer |
|
|
297
|
+
| Relocation chart | `ephemeris_relocation` | Explorer |
|
|
299
298
|
| Progressed chart | `ephemeris_progressed_chart` | Explorer |
|
|
300
|
-
| Solar return | `ephemeris_solar_return` |
|
|
301
|
-
| Lunar return | `ephemeris_lunar_return` |
|
|
302
|
-
| Planetary return | `ephemeris_planetary_return` |
|
|
299
|
+
| Solar return | `ephemeris_solar_return` | Explorer |
|
|
300
|
+
| Lunar return | `ephemeris_lunar_return` | Explorer |
|
|
301
|
+
| Planetary return | `ephemeris_planetary_return` | Explorer |
|
|
303
302
|
| Astrocartography lines | `acg_power_lines` | Developer |
|
|
304
303
|
| ACG hits at location | `acg_hits` | Scale |
|
|
305
304
|
| Venus Star Points | `venus_star_points` + 4 more | Explorer |
|
|
@@ -491,8 +490,8 @@ When you update the MCP server logic (handlers, bug fixes, hardening), you shoul
|
|
|
491
490
|
|
|
492
491
|
Generated by `npm run sync:readme` from `config/dev-allowlist.json` and the live tool registry.
|
|
493
492
|
|
|
494
|
-
- Allowlisted operations: **
|
|
495
|
-
- Methods: `GET=44`, `POST=
|
|
493
|
+
- Allowlisted operations: **124**
|
|
494
|
+
- Methods: `GET=44`, `POST=80`, `PUT=0`, `PATCH=0`, `DELETE=0`
|
|
496
495
|
- Registered tools (`OPENEPHEMERIS_PROFILE=dev`): **92**
|
|
497
496
|
- 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`, `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`
|
|
498
497
|
- Generic tools: `dev_list_allowed`, `dev_read_api`, `dev_write_api`
|
|
@@ -508,11 +507,11 @@ Generated by `npm run sync:readme` from `config/dev-allowlist.json` and the live
|
|
|
508
507
|
| `comparative` | 5 | `POST /comparative/composite`, `POST /comparative/composite/midpoint` |
|
|
509
508
|
| `eclipse` | 6 | `GET /eclipse/besselian-elements`, `GET /eclipse/lunar/global` |
|
|
510
509
|
| `electional` | 6 | `GET /electional/angle-crossings`, `GET /electional/aspect-search` |
|
|
511
|
-
| `ephemeris` |
|
|
510
|
+
| `ephemeris` | 38 | `GET /ephemeris/agro/calendar`, `GET /ephemeris/agro/daily` |
|
|
512
511
|
| `health` | 2 | `GET /health`, `GET /health/detailed` |
|
|
513
|
-
| `human-design` |
|
|
512
|
+
| `human-design` | 9 | `POST /human-design/chart`, `POST /human-design/composite` |
|
|
514
513
|
| `location` | 2 | `GET /location/autocomplete`, `GET /location/reverse` |
|
|
515
|
-
| `predictive` |
|
|
514
|
+
| `predictive` | 11 | `POST /predictive/primary-directions`, `POST /predictive/returns` |
|
|
516
515
|
| `root` | 1 | `GET /` |
|
|
517
516
|
| `tidal` | 2 | `GET /tidal/forcing`, `GET /tidal/forcing/deep-time` |
|
|
518
517
|
| `time` | 6 | `GET /time/delta-t`, `GET /time/equation-of-time` |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "astromcp-dev-allowlist-v1",
|
|
3
3
|
"description": "Allowlist derived from the Go sidecar openapi.json. Every entry in allow[] corresponds to a real Go endpoint. Run 'npm run check:dev-allowlist' to validate freshness.",
|
|
4
|
-
"generated_from": "C:\\src\\openephemeris\\.claude\\worktrees\\
|
|
4
|
+
"generated_from": "C:\\src\\openephemeris\\.claude\\worktrees\\adoring-rhodes-871fd7\\apps\\api\\go-sidecar\\openapi.json",
|
|
5
5
|
"deny": {
|
|
6
6
|
"path_prefixes": [
|
|
7
7
|
"/auth",
|
|
@@ -235,6 +235,10 @@
|
|
|
235
235
|
"method": "POST",
|
|
236
236
|
"path": "/ephemeris/dispositor-tree"
|
|
237
237
|
},
|
|
238
|
+
{
|
|
239
|
+
"method": "POST",
|
|
240
|
+
"path": "/ephemeris/draconic"
|
|
241
|
+
},
|
|
238
242
|
{
|
|
239
243
|
"method": "POST",
|
|
240
244
|
"path": "/ephemeris/fixed-stars"
|
|
@@ -291,6 +295,10 @@
|
|
|
291
295
|
"method": "POST",
|
|
292
296
|
"path": "/ephemeris/planet-position"
|
|
293
297
|
},
|
|
298
|
+
{
|
|
299
|
+
"method": "POST",
|
|
300
|
+
"path": "/ephemeris/prenatal-lunation"
|
|
301
|
+
},
|
|
294
302
|
{
|
|
295
303
|
"method": "POST",
|
|
296
304
|
"path": "/ephemeris/progressed"
|
|
@@ -383,6 +391,10 @@
|
|
|
383
391
|
"method": "POST",
|
|
384
392
|
"path": "/human-design/transit-chart"
|
|
385
393
|
},
|
|
394
|
+
{
|
|
395
|
+
"method": "POST",
|
|
396
|
+
"path": "/human-design/transit-timeline"
|
|
397
|
+
},
|
|
386
398
|
{
|
|
387
399
|
"method": "POST",
|
|
388
400
|
"path": "/human-design/transit"
|
|
@@ -395,6 +407,10 @@
|
|
|
395
407
|
"method": "GET",
|
|
396
408
|
"path": "/location/reverse"
|
|
397
409
|
},
|
|
410
|
+
{
|
|
411
|
+
"method": "POST",
|
|
412
|
+
"path": "/predictive/primary-directions"
|
|
413
|
+
},
|
|
398
414
|
{
|
|
399
415
|
"method": "POST",
|
|
400
416
|
"path": "/predictive/returns/lunar"
|
|
@@ -496,8 +512,8 @@
|
|
|
496
512
|
"path": "/visualization/chart-wheel"
|
|
497
513
|
}
|
|
498
514
|
],
|
|
499
|
-
"last_generated_at": "2026-
|
|
500
|
-
"openapi_sha256": "
|
|
515
|
+
"last_generated_at": "2026-09-24T18:29:22.473Z",
|
|
516
|
+
"openapi_sha256": "f5927cecddb0f8629f7c94d380ca878e6780bc491f85490bacb2508e1b721b3d",
|
|
501
517
|
"candidates_get": [
|
|
502
518
|
{
|
|
503
519
|
"method": "GET",
|
|
@@ -893,22 +909,6 @@
|
|
|
893
909
|
],
|
|
894
910
|
"operationId": "declination_lines_acg_declination_lines_post"
|
|
895
911
|
},
|
|
896
|
-
{
|
|
897
|
-
"method": "POST",
|
|
898
|
-
"path": "/acg/features",
|
|
899
|
-
"tags": [
|
|
900
|
-
"ACG"
|
|
901
|
-
],
|
|
902
|
-
"operationId": "features_acg_features_post"
|
|
903
|
-
},
|
|
904
|
-
{
|
|
905
|
-
"method": "POST",
|
|
906
|
-
"path": "/acg/heatmap/composite",
|
|
907
|
-
"tags": [
|
|
908
|
-
"Astrocartography"
|
|
909
|
-
],
|
|
910
|
-
"operationId": "AcgHeatmapCompositeAcgHeatmapCompositePost"
|
|
911
|
-
},
|
|
912
912
|
{
|
|
913
913
|
"method": "POST",
|
|
914
914
|
"path": "/acg/hermetic-lines",
|
|
@@ -1341,6 +1341,14 @@
|
|
|
1341
1341
|
],
|
|
1342
1342
|
"operationId": "human_design_transit_chart_human_design_transit_chart_post"
|
|
1343
1343
|
},
|
|
1344
|
+
{
|
|
1345
|
+
"method": "POST",
|
|
1346
|
+
"path": "/human-design/transit-timeline",
|
|
1347
|
+
"tags": [
|
|
1348
|
+
"Human Design"
|
|
1349
|
+
],
|
|
1350
|
+
"operationId": "human_design_transit_timeline_human_design_transit_timeline_post"
|
|
1351
|
+
},
|
|
1344
1352
|
{
|
|
1345
1353
|
"method": "POST",
|
|
1346
1354
|
"path": "/human-design/transit",
|
|
@@ -1538,6 +1546,7 @@
|
|
|
1538
1546
|
"Non-GET allowlisted: POST /ephemeris/declinations",
|
|
1539
1547
|
"Non-GET allowlisted: POST /ephemeris/dignities",
|
|
1540
1548
|
"Non-GET allowlisted: POST /ephemeris/dispositor-tree",
|
|
1549
|
+
"Non-GET allowlisted: POST /ephemeris/draconic",
|
|
1541
1550
|
"Non-GET allowlisted: POST /ephemeris/fixed-stars",
|
|
1542
1551
|
"Non-GET allowlisted: POST /ephemeris/harmonics",
|
|
1543
1552
|
"Non-GET allowlisted: POST /ephemeris/hermetic-lots",
|
|
@@ -1547,6 +1556,7 @@
|
|
|
1547
1556
|
"Non-GET allowlisted: POST /ephemeris/natal-chart",
|
|
1548
1557
|
"Non-GET allowlisted: POST /ephemeris/natal/batch",
|
|
1549
1558
|
"Non-GET allowlisted: POST /ephemeris/planet-position",
|
|
1559
|
+
"Non-GET allowlisted: POST /ephemeris/prenatal-lunation",
|
|
1550
1560
|
"Non-GET allowlisted: POST /ephemeris/progressed",
|
|
1551
1561
|
"Non-GET allowlisted: POST /ephemeris/relocation",
|
|
1552
1562
|
"Non-GET allowlisted: POST /ephemeris/retrograde-status",
|
|
@@ -1563,7 +1573,9 @@
|
|
|
1563
1573
|
"Non-GET allowlisted: POST /human-design/cycles/solar-return",
|
|
1564
1574
|
"Non-GET allowlisted: POST /human-design/penta",
|
|
1565
1575
|
"Non-GET allowlisted: POST /human-design/transit-chart",
|
|
1576
|
+
"Non-GET allowlisted: POST /human-design/transit-timeline",
|
|
1566
1577
|
"Non-GET allowlisted: POST /human-design/transit",
|
|
1578
|
+
"Non-GET allowlisted: POST /predictive/primary-directions",
|
|
1567
1579
|
"Non-GET allowlisted: POST /predictive/returns/lunar",
|
|
1568
1580
|
"Non-GET allowlisted: POST /predictive/returns/solar",
|
|
1569
1581
|
"Non-GET allowlisted: POST /predictive/returns",
|
package/dist/backend/client.d.ts
CHANGED
|
@@ -24,6 +24,8 @@ export interface BinaryBackendResponse {
|
|
|
24
24
|
export declare const DASHBOARD_ACCOUNT_URL = "https://openephemeris.com/dashboard?tab=account";
|
|
25
25
|
export declare const LOGIN_SIGNUP_URL = "https://openephemeris.com/login?signup=true&redirect=%2Fdashboard%3Ftab%3Daccount";
|
|
26
26
|
export declare const UPGRADE_URL = "https://openephemeris.com/pricing";
|
|
27
|
+
/** One-tap $5 → 150-credit top-up (signs the user in if needed, then redirects to the prefilled Stripe Payment Link). */
|
|
28
|
+
export declare const TOPUP_URL = "https://openephemeris.com/topup?pack=payg_5";
|
|
27
29
|
export declare const WALLET_TOPUP_URL = "https://openephemeris.com/wallet";
|
|
28
30
|
export declare class BackendError extends Error {
|
|
29
31
|
readonly status: number;
|
package/dist/backend/client.js
CHANGED
|
@@ -22,6 +22,8 @@ const BINARY_ENDPOINT_PREFIXES = [
|
|
|
22
22
|
export const DASHBOARD_ACCOUNT_URL = "https://openephemeris.com/dashboard?tab=account";
|
|
23
23
|
export const LOGIN_SIGNUP_URL = "https://openephemeris.com/login?signup=true&redirect=%2Fdashboard%3Ftab%3Daccount";
|
|
24
24
|
export const UPGRADE_URL = "https://openephemeris.com/pricing";
|
|
25
|
+
/** One-tap $5 → 150-credit top-up (signs the user in if needed, then redirects to the prefilled Stripe Payment Link). */
|
|
26
|
+
export const TOPUP_URL = "https://openephemeris.com/topup?pack=payg_5";
|
|
25
27
|
export const WALLET_TOPUP_URL = "https://openephemeris.com/wallet";
|
|
26
28
|
function sleep(ms) {
|
|
27
29
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
@@ -277,7 +279,6 @@ export class BackendClient {
|
|
|
277
279
|
// suggest enabling overages; suggest the next tier instead. Keep every
|
|
278
280
|
// number below in sync with that file; do NOT hand-edit independently.
|
|
279
281
|
const dataObj = data && typeof data === "object" ? data : {};
|
|
280
|
-
const walletUrl = dataObj.upgrade?.wallets_url || "https://openephemeris.com/dashboard?tab=wallet";
|
|
281
282
|
const currentTier = dataObj.upgrade?.current_tier || dataObj.tier || "explorer";
|
|
282
283
|
// Next-tier upgrade path (SSOT: BILLING_PLANS order in billing-plans.ts).
|
|
283
284
|
const NEXT_TIER = {
|
|
@@ -285,25 +286,29 @@ export class BackendClient {
|
|
|
285
286
|
startup: { plan: "scale", label: "Scale ($199/mo, 2,000,000 credits)" },
|
|
286
287
|
scale: { plan: "enterprise", label: "Enterprise (custom volume)" },
|
|
287
288
|
};
|
|
289
|
+
// One direct link, not a dashboard tab: /topup?pack=payg_5 signs the
|
|
290
|
+
// user in if needed and redirects straight to the prefilled Stripe
|
|
291
|
+
// Payment Link for the $5 → 150-credit pack.
|
|
288
292
|
let upsellMsg = "";
|
|
293
|
+
let actionUrl = TOPUP_URL;
|
|
289
294
|
if (currentTier === 'explorer') {
|
|
290
295
|
upsellMsg =
|
|
291
|
-
`Let the user know warmly: Their 150 free credits
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
`for 75,000 credits/month at ${UPGRADE_URL}?plan=developer`;
|
|
296
|
+
`Let the user know warmly: Their 150 free credits are used up. ` +
|
|
297
|
+
`$5 gets 150 more — one tap: ${TOPUP_URL}. ` +
|
|
298
|
+
`Or Pro ($29/mo, 75,000 credits): ${UPGRADE_URL}?plan=developer`;
|
|
295
299
|
}
|
|
296
300
|
else if (currentTier === 'payg') {
|
|
297
301
|
upsellMsg =
|
|
298
|
-
`Let the user know warmly: Their wallet balance is empty.
|
|
299
|
-
`$
|
|
300
|
-
|
|
302
|
+
`Let the user know warmly: Their wallet balance is empty. ` +
|
|
303
|
+
`$5 gets 150 more credits — one tap: ${TOPUP_URL}. ` +
|
|
304
|
+
`Or Pro ($29/mo, 75,000 credits): ${UPGRADE_URL}?plan=developer`;
|
|
301
305
|
}
|
|
302
306
|
else {
|
|
303
307
|
const next = NEXT_TIER[currentTier] || NEXT_TIER.developer;
|
|
308
|
+
actionUrl = `${UPGRADE_URL}?plan=${next.plan}`;
|
|
304
309
|
upsellMsg =
|
|
305
310
|
`Let the user know warmly: Their monthly credits are exhausted. They can upgrade to ` +
|
|
306
|
-
`${next.label} at ${
|
|
311
|
+
`${next.label} at ${actionUrl}`;
|
|
307
312
|
}
|
|
308
313
|
return new BackendError(`⚠️ CREDIT LIMIT REACHED — DO NOT FABRICATE DATA.\n\n` +
|
|
309
314
|
`${msg}\n\n` +
|
|
@@ -311,7 +316,7 @@ export class BackendClient {
|
|
|
311
316
|
`They can also review their current usage at ${DASHBOARD_ACCOUNT_URL}.\n\n` +
|
|
312
317
|
`Frame this warmly, as unlocking more of what they're already enjoying, not as a gate. ` +
|
|
313
318
|
`DO NOT attempt to generate astrological data from your own knowledge. ` +
|
|
314
|
-
`All chart positions, aspects, and timing data MUST come from the API.`, 402, "quota_exceeded", false,
|
|
319
|
+
`All chart positions, aspects, and timing data MUST come from the API.`, 402, "quota_exceeded", false, actionUrl);
|
|
315
320
|
}
|
|
316
321
|
if (status === 403) {
|
|
317
322
|
return new BackendError(`This feature is part of a higher-tier plan.\n\n` +
|
package/dist/instructions.d.ts
CHANGED
|
@@ -12,5 +12,5 @@
|
|
|
12
12
|
* Order is deliberate: the visual one leads, because a rendered dial is a
|
|
13
13
|
* better first impression than a score.
|
|
14
14
|
*/
|
|
15
|
-
export declare const ZERO_ARG_ENTRY_TOOLS: readonly ["explore_moon_phase"
|
|
15
|
+
export declare const ZERO_ARG_ENTRY_TOOLS: readonly ["explore_moon_phase"];
|
|
16
16
|
export declare const SERVER_INSTRUCTIONS: string;
|
package/dist/instructions.js
CHANGED
|
@@ -37,7 +37,9 @@ import { DATETIME_CONTRACT_INSTRUCTIONS } from "./tools/datetime.js";
|
|
|
37
37
|
*/
|
|
38
38
|
export const ZERO_ARG_ENTRY_TOOLS = [
|
|
39
39
|
"explore_moon_phase",
|
|
40
|
-
|
|
40
|
+
// electional_moment_analysis also takes no arguments and is free-with-credits
|
|
41
|
+
// since the consumer-tools ungate, but it costs 5 credits against a 150-credit
|
|
42
|
+
// Explorer grant; the visual, 0-argument dial stays the sole cold-open.
|
|
41
43
|
];
|
|
42
44
|
export const SERVER_INSTRUCTIONS = "Open Ephemeris computes real astronomy (JPL DE440, sub-arcsecond) — never guess " +
|
|
43
45
|
"or approximate positions yourself; always call a tool. " +
|
|
@@ -45,7 +47,7 @@ export const SERVER_INSTRUCTIONS = "Open Ephemeris computes real astronomy (JPL
|
|
|
45
47
|
"prefer the explore_* tools — they render interactive visuals inline. " +
|
|
46
48
|
"ephemeris_* tools return data; use format='llm' on them for compact output. " +
|
|
47
49
|
"If the user has no birth data handy, open with the sky right now: " +
|
|
48
|
-
`${ZERO_ARG_ENTRY_TOOLS.join(" and ")} take no arguments at all — ` +
|
|
49
|
-
|
|
50
|
+
`${ZERO_ARG_ENTRY_TOOLS.join(" and ")} ${ZERO_ARG_ENTRY_TOOLS.length === 1 ? "takes" : "take"} no arguments at all — ` +
|
|
51
|
+
`call ${ZERO_ARG_ENTRY_TOOLS.length === 1 ? "it" : "one"} rather than asking for a birth date first. ` +
|
|
50
52
|
"See the 'welcome_to_open_ephemeris' prompt for orientation.\n\n" +
|
|
51
53
|
DATETIME_CONTRACT_INSTRUCTIONS;
|
package/dist/prompts.js
CHANGED
|
@@ -888,9 +888,9 @@ export const PROMPTS = [
|
|
|
888
888
|
"| ACG city hits | `acg_hits` | `POST /acg/hits` | 15 |\n" +
|
|
889
889
|
"| Eclipse finder | `ephemeris_next_eclipse` | `GET /eclipse/next-visible` | 1 |\n" +
|
|
890
890
|
"| Moon phase (current) | `ephemeris_moon_phase` | `GET /ephemeris/moon/phase` | 1 |\n" +
|
|
891
|
-
"| Next lunar phase | `ephemeris_next_lunar_phase` | `GET /
|
|
891
|
+
"| Next lunar phase | `ephemeris_next_lunar_phase` | `GET /calendar/astrology/moon-phases` | 1 |\n" +
|
|
892
892
|
"| Electional windows | `ephemeris_electional` | `GET /electional/find-window` | 5 |\n" +
|
|
893
|
-
"| Electional score | `electional_moment_analysis` | `GET /electional/moment` | 1 |\n" +
|
|
893
|
+
"| Electional score | `electional_moment_analysis` | `GET /electional/moment-analysis` | 1 |\n" +
|
|
894
894
|
"| Dignities | `ephemeris_dignities` | `POST /ephemeris/dignities` | 1 |\n" +
|
|
895
895
|
"| Hermetic lots | `ephemeris_hermetic_lots` | `POST /ephemeris/hermetic-lots` | 1 |\n" +
|
|
896
896
|
"| Midpoints | `ephemeris_midpoints` | `POST /ephemeris/midpoints` | 1 |\n\n" +
|
|
@@ -111,17 +111,17 @@ function buildSummary(payload) {
|
|
|
111
111
|
// ── Tool: explore_bazi_chart ─────────────────────────────────────────────────
|
|
112
112
|
registerTool({
|
|
113
113
|
name: "explore_bazi_chart",
|
|
114
|
-
description: "
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
"
|
|
118
|
-
"
|
|
119
|
-
"
|
|
114
|
+
description: "Use this when the user asks 'what's my BaZi', 'my Four Pillars', 'what's my Day Master', 'my " +
|
|
115
|
+
"Chinese astrology chart', 'what's my Chinese element' or 'my Chinese birth chart' — the PRIMARY " +
|
|
116
|
+
"tool for BaZi, with or without a renderer. Returns an interactive Four Pillars (四柱命盘) explorer " +
|
|
117
|
+
"(inline in Claude and ChatGPT; text summary elsewhere): the Year, Month, Day and Hour pillars — " +
|
|
118
|
+
"each with Heavenly Stem (天干), Earthly Branch (地支), Ten God label and element color — plus the " +
|
|
119
|
+
"Day Master identity and a Wu Xing (五行) element balance bar; click any pillar for what it reveals " +
|
|
120
|
+
"about that life domain.\n\n" +
|
|
120
121
|
"CREDIT COST: 3 credits per call (1 base + 2 visual render).\n\n" +
|
|
121
|
-
"
|
|
122
|
-
"
|
|
123
|
-
"
|
|
124
|
-
"non-visual pillars lookup have dedicated tools on the full surface (`?profile=full`).",
|
|
122
|
+
"Do not use for a single year's zodiac animal or pillar — use bazi_annual_pillar. Deeper " +
|
|
123
|
+
"derivations (Ten Gods, element balance, luck pillars) and a plain non-visual pillars lookup have " +
|
|
124
|
+
"dedicated tools on the full surface (`?profile=full`).",
|
|
125
125
|
inputSchema: {
|
|
126
126
|
type: "object",
|
|
127
127
|
properties: {
|
|
@@ -417,20 +417,20 @@ function buildBiWheelSummary(innerPlanets, outerPlanets, crossAspects, mode, loc
|
|
|
417
417
|
// ── Tool: explore_bi_wheel ─────────────────────────────────────────────────────
|
|
418
418
|
registerTool({
|
|
419
419
|
name: "explore_bi_wheel",
|
|
420
|
-
description: "
|
|
421
|
-
"
|
|
422
|
-
"
|
|
423
|
-
"
|
|
424
|
-
"
|
|
425
|
-
"
|
|
426
|
-
"
|
|
427
|
-
"
|
|
428
|
-
"
|
|
429
|
-
"
|
|
430
|
-
"
|
|
431
|
-
"
|
|
432
|
-
"
|
|
433
|
-
"
|
|
420
|
+
description: "Use this when the user asks 'are we compatible', 'compare my chart with my partner's', 'what's " +
|
|
421
|
+
"my horoscope for today', 'what's hitting my chart right now', 'what's my solar return chart this " +
|
|
422
|
+
"year' or 'my progressed chart on my birth chart' — any two-ring comparison they should SEE. " +
|
|
423
|
+
"Returns an interactive bi-wheel (inline in Claude and ChatGPT; text summary elsewhere): inner " +
|
|
424
|
+
"wheel Person 1's natal chart, outer ring by mode — synastry (Person 2's natal; needs their " +
|
|
425
|
+
"birthplace), transit (a date; today for a daily horoscope), progressed, solar_arc (target date), " +
|
|
426
|
+
"solar_return (target year), lunar_return (target month) — with cross-aspects drawn and every " +
|
|
427
|
+
"planet, aspect line and cusp clickable. Birthplaces may be place names (`location`, " +
|
|
428
|
+
"`person2_location`).\n\n" +
|
|
429
|
+
"CREDIT COST: 2 credits per call for most modes (1 per wheel; +1 to resolve a place name); " +
|
|
430
|
+
"solar_return/lunar_return modes cost 6.\n\n" +
|
|
431
|
+
"Do not use for synastry numbers without a visual — use ephemeris_synastry; for a dated list of " +
|
|
432
|
+
"upcoming transit hits use explore_transit_timeline; for a single chart use explore_natal_chart; " +
|
|
433
|
+
"with no birth data use explore_moon_phase.",
|
|
434
434
|
inputSchema: {
|
|
435
435
|
type: "object",
|
|
436
436
|
properties: {
|
|
@@ -227,8 +227,10 @@ function buildHdModelPayload(data, birthParams) {
|
|
|
227
227
|
const personality_gates = [...new Set(extractGateNums(pGateList))].sort((a, b) => a - b);
|
|
228
228
|
const design_gates = [...new Set(extractGateNums(dGateList))].sort((a, b) => a - b);
|
|
229
229
|
// Convert activation arrays or maps → planet-keyed Record<string, ActivationSummary>
|
|
230
|
-
// The Go API returns arrays like
|
|
231
|
-
//
|
|
230
|
+
// The Go API returns arrays like
|
|
231
|
+
// [{ planet: "Sun", gate: 62, line: 1, color: 3, tone: 4, base: 5 }]. The renderer needs a
|
|
232
|
+
// map keyed by planet name: { "Sun": { gate, line, color, tone, base } }. All five are kept
|
|
233
|
+
// so a gate click can quote the full gate.line.color.tone.base address.
|
|
232
234
|
function toActivationMap(raw) {
|
|
233
235
|
if (!raw || (typeof raw !== 'object'))
|
|
234
236
|
return undefined;
|
|
@@ -258,6 +260,7 @@ function buildHdModelPayload(data, birthParams) {
|
|
|
258
260
|
line: Number(item.line ?? 0),
|
|
259
261
|
color: Number(item.color ?? 0),
|
|
260
262
|
tone: Number(item.tone ?? 0),
|
|
263
|
+
base: Number(item.base ?? 0),
|
|
261
264
|
};
|
|
262
265
|
}
|
|
263
266
|
return Object.keys(map).length > 0 ? map : undefined;
|
|
@@ -305,19 +308,17 @@ function buildHdSummary(payload, location) {
|
|
|
305
308
|
// ── Tool: explore_human_design ────────────────────────────────────────────
|
|
306
309
|
registerTool({
|
|
307
310
|
name: "explore_human_design",
|
|
308
|
-
description: "
|
|
309
|
-
"
|
|
310
|
-
"
|
|
311
|
-
"
|
|
312
|
-
"
|
|
313
|
-
"
|
|
314
|
-
"
|
|
315
|
-
"
|
|
316
|
-
"
|
|
317
|
-
"
|
|
318
|
-
"
|
|
319
|
-
"experience in MCP Apps-capable hosts (Claude and ChatGPT). " +
|
|
320
|
-
"Falls back to a text summary in other hosts." +
|
|
311
|
+
description: "Use this when the user asks 'what's my Human Design', 'am I a Generator / Projector / Manifestor " +
|
|
312
|
+
"/ Reflector', 'show my bodygraph', 'what's my HD type and profile', 'what's my strategy and " +
|
|
313
|
+
"authority' or 'what's my incarnation cross' — the PRIMARY tool for a Human Design chart. Returns " +
|
|
314
|
+
"an interactive bodygraph (inline in Claude and ChatGPT; text summary elsewhere) showing " +
|
|
315
|
+
"defined/undefined centers, active gates, channels, Type, Profile, Authority and Incarnation " +
|
|
316
|
+
"Cross, with any center or gate clickable for interpretation. Birthplace may be a place name " +
|
|
317
|
+
"(`location`).\n\n" +
|
|
318
|
+
"CREDIT COST: 4 credits per call (2 chart + 2 render; +1 to resolve a place name).\n\n" +
|
|
319
|
+
"Do not use when the user needs the activations, design/personality positions, strategy and " +
|
|
320
|
+
"variables this view omits — use human_design_chart (2 credits); for today's transits on their " +
|
|
321
|
+
"chart use explore_human_design_transit; for two people use explore_human_design_connection." +
|
|
321
322
|
HD_DISCLAIMER,
|
|
322
323
|
inputSchema: {
|
|
323
324
|
type: "object",
|
|
@@ -1305,15 +1306,18 @@ registerTool({
|
|
|
1305
1306
|
});
|
|
1306
1307
|
// ── Tool: explore_human_design_transit ───────────────────────────────────────
|
|
1307
1308
|
// Personalized Human Design transit overlay (natal chart + a transiting moment).
|
|
1308
|
-
//
|
|
1309
|
+
// Calls POST /human-design/transit-chart.
|
|
1309
1310
|
registerTool({
|
|
1310
1311
|
name: "explore_human_design_transit",
|
|
1311
|
-
description: "
|
|
1312
|
-
"
|
|
1313
|
-
"
|
|
1314
|
-
"
|
|
1315
|
-
"
|
|
1316
|
-
"
|
|
1312
|
+
description: "Use this when the user asks 'what are today's Human Design transits for me', 'what gates are " +
|
|
1313
|
+
"being activated for me right now', 'which channels does this transit complete in my chart' or " +
|
|
1314
|
+
"'how is the current sky affecting my bodygraph'. Returns an interactive overlay bodygraph " +
|
|
1315
|
+
"(inline in Claude and ChatGPT; text summary elsewhere) highlighting the channels the transit " +
|
|
1316
|
+
"temporarily COMPLETES with the natal chart and any centers it newly defines, for now or a chosen " +
|
|
1317
|
+
"datetime. Birthplace may be a place name (`location`).\n\n" +
|
|
1318
|
+
"CREDIT COST: 3 credits per call (+1 to resolve a place name).\n\n" +
|
|
1319
|
+
"Do not use for the person's own natal bodygraph — use explore_human_design; for another person's " +
|
|
1320
|
+
"chart overlaid on theirs use explore_human_design_connection." +
|
|
1317
1321
|
HD_DISCLAIMER,
|
|
1318
1322
|
inputSchema: {
|
|
1319
1323
|
type: "object",
|
|
@@ -1439,17 +1443,19 @@ registerTool({
|
|
|
1439
1443
|
},
|
|
1440
1444
|
});
|
|
1441
1445
|
// ── Tool: explore_human_design_connection ────────────────────────────────────
|
|
1442
|
-
// Two-person Human Design connection (synastry) overlay.
|
|
1446
|
+
// Two-person Human Design connection (synastry) overlay.
|
|
1443
1447
|
// Calls POST /human-design/composite.
|
|
1444
1448
|
registerTool({
|
|
1445
1449
|
name: "explore_human_design_connection",
|
|
1446
|
-
description: "
|
|
1447
|
-
"
|
|
1450
|
+
description: "Use this when the user asks 'are we compatible in Human Design', 'what's our connection chart', " +
|
|
1451
|
+
"'what channels do we make together' or 'show our composite bodygraph' — two people's HD charts " +
|
|
1452
|
+
"overlaid. Returns an interactive two-person overlay bodygraph (inline in Claude and ChatGPT; " +
|
|
1453
|
+
"text summary elsewhere) with every connected channel classified by HD connection theory: " +
|
|
1454
|
+
"electromagnetic (attraction), companionship (sameness), dominance (one defines), compromise " +
|
|
1455
|
+
"(friction).\n\n" +
|
|
1448
1456
|
"CREDIT COST: 3 credits per call.\n\n" +
|
|
1449
|
-
"
|
|
1450
|
-
"
|
|
1451
|
-
"compromise (friction). Returns an interactive two-person overlay bodygraph in MCP Apps-capable " +
|
|
1452
|
-
"hosts, with a text summary fallback elsewhere. Premium (Pro tier). NASA JPL DE440 ephemerides." +
|
|
1457
|
+
"Do not use for one person's chart — use explore_human_design; for the sky's transit on one chart " +
|
|
1458
|
+
"use explore_human_design_transit; for Western compatibility use explore_bi_wheel." +
|
|
1453
1459
|
HD_DISCLAIMER,
|
|
1454
1460
|
inputSchema: {
|
|
1455
1461
|
type: "object",
|