@openephemeris/mcp-server 4.15.0 → 4.16.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 +26 -0
- package/README.md +29 -13
- package/dist/backend/client.d.ts +2 -0
- package/dist/backend/client.js +15 -10
- package/dist/index.js +3 -12
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.js +5 -3
- package/dist/prompts.js +2 -2
- package/dist/server-sse.js +3 -12
- 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.js +13 -14
- 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/bi_wheel.js +1 -1
- package/dist/tools/specialized/chart_wheel.js +1 -1
- package/dist/tools/specialized/eclipse.js +6 -13
- package/dist/tools/specialized/electional.js +30 -37
- package/dist/tools/specialized/ephemeris_core.js +21 -14
- package/dist/tools/specialized/ephemeris_extended.js +22 -19
- package/dist/tools/specialized/hd_bodygraph.js +2 -2
- 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 +14 -0
- package/dist/tools/ui-meta.js +57 -0
- package/dist/ui/bazi.html +6 -1
- package/dist/ui/bi-wheel.html +505 -460
- package/dist/ui/bodygraph.html +176 -150
- package/dist/ui/chart-wheel.html +443 -396
- package/dist/ui/moon-phase.html +1 -1
- package/dist/ui/transit-timeline.html +2 -2
- package/dist/ui/vedic-chart.html +82 -56
- package/package.json +9 -4
- package/smithery.yaml +3 -1
|
@@ -5,16 +5,21 @@ import { DATETIME_DESC, TIMEZONE_PROPERTY, toDateTimeInputBody } from "../dateti
|
|
|
5
5
|
// POST /ephemeris/planet-position — OE-016
|
|
6
6
|
registerTool({
|
|
7
7
|
name: "ephemeris_planet_position",
|
|
8
|
-
description: "
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
8
|
+
description: "Use this when the user asks 'where is Mars right now', 'what sign is Venus in today', 'what " +
|
|
9
|
+
"degree is the Sun at', 'where was Jupiter on my birthday', 'where is the North Node' — one body " +
|
|
10
|
+
"at one moment — or 'what's my star sign / zodiac sign' from a birth date alone (planet_id=0; a " +
|
|
11
|
+
"bare date resolves to noon UTC, no location needed). Returns ecliptic longitude, latitude, " +
|
|
12
|
+
"distance, speed and retrograde flag.\n\n" +
|
|
13
|
+
"PLANET IDS: 0=Sun, 1=Moon, 2=Mercury, 3=Venus, 4=Mars, 5=Jupiter, 6=Saturn, 7=Uranus, 8=Neptune, " +
|
|
14
|
+
"9=Pluto, 10=North Node (Mean), 11=North Node (True), 12=Lilith (Mean), 15=Chiron, 17=Ceres, " +
|
|
15
|
+
"18=Pallas, 19=Juno, 20=Vesta.\n" +
|
|
16
|
+
"SOUTH NODE: no id — take id 10 or 11 and add 180° (mod 360).\n" +
|
|
17
|
+
"NODES: despite its name, id 10 returns the osculating TRUE node (DE440, ecliptic of date) — the " +
|
|
18
|
+
"Human Design node; it wobbles ±1.7° about the mean and can go direct, which is correct. Id 11 is " +
|
|
19
|
+
"the analytical true node. Neither is a classical mean node.\n\n" +
|
|
15
20
|
"CREDIT COST: 1 credit per call.\n\n" +
|
|
16
|
-
"
|
|
17
|
-
"
|
|
21
|
+
"Do not use for the Moon's phase — use ephemeris_moon_phase; for 'is X retrograde' use " +
|
|
22
|
+
"ephemeris_retrograde_status; for a whole birth chart use ephemeris_natal_chart.",
|
|
18
23
|
inputSchema: {
|
|
19
24
|
type: "object",
|
|
20
25
|
properties: {
|
|
@@ -57,12 +62,14 @@ registerTool({
|
|
|
57
62
|
// POST /ephemeris/house-cusps — OE-017
|
|
58
63
|
registerTool({
|
|
59
64
|
name: "ephemeris_house_cusps",
|
|
60
|
-
description: "
|
|
61
|
-
"
|
|
62
|
-
"
|
|
65
|
+
description: "Use this when the user asks 'what are my house cusps', 'where does my 7th house start', 'show my " +
|
|
66
|
+
"houses in Whole Sign' or 'compare Placidus and Koch for my chart' — houses and angles only, for " +
|
|
67
|
+
"a date, time and place. Returns the twelve cusps and ASC/MC/DSC/IC for each requested system.\n\n" +
|
|
68
|
+
"HOUSE SYSTEM CODES: P=Placidus, K=Koch, O=Porphyry, R=Regiomontanus, C=Campanus, E=Equal, " +
|
|
69
|
+
"W=Whole Sign.\n\n" +
|
|
63
70
|
"CREDIT COST: 1 credit per call.\n\n" +
|
|
64
|
-
"
|
|
65
|
-
"
|
|
71
|
+
"Do not use for a full birth chart with planets — use ephemeris_natal_chart; for the Vertex and " +
|
|
72
|
+
"equatorial ascendant use ephemeris_angles_points.",
|
|
66
73
|
inputSchema: {
|
|
67
74
|
type: "object",
|
|
68
75
|
properties: {
|
|
@@ -96,16 +96,15 @@ registerTool({
|
|
|
96
96
|
// the documented "all planets" behaviour works correctly.
|
|
97
97
|
registerTool({
|
|
98
98
|
name: "ephemeris_retrograde_status",
|
|
99
|
-
description: "
|
|
100
|
-
"
|
|
101
|
-
"proximity
|
|
102
|
-
"
|
|
103
|
-
"
|
|
104
|
-
"
|
|
105
|
-
"
|
|
106
|
-
"
|
|
107
|
-
"
|
|
108
|
-
"fans out to 10. Only omit it when the question really is about every planet.",
|
|
99
|
+
description: "Use this when the user asks 'is Mercury retrograde right now', 'is Venus retrograde today', 'was " +
|
|
100
|
+
"Mars retrograde when I was born' or 'which planets are retrograde at the moment'. Returns " +
|
|
101
|
+
"is_retrograde, longitude speed and station proximity for ONE planet at one instant — pass " +
|
|
102
|
+
"planet_id ('is Mercury retrograde?' is planet_id=2, not a whole-sky sweep) — or for all ten when " +
|
|
103
|
+
"planet_id is omitted.\n\n" +
|
|
104
|
+
"CREDIT COST: 1 credit for a single planet. Omitting planet_id fans out to 10 credits (one per " +
|
|
105
|
+
"body); only omit it when the question really is about every planet.\n\n" +
|
|
106
|
+
"Do not use for WHEN a planet turns retrograde or direct, or whether it stations in a date range " +
|
|
107
|
+
"— use electional_station_tracker.",
|
|
109
108
|
inputSchema: {
|
|
110
109
|
type: "object",
|
|
111
110
|
properties: {
|
|
@@ -275,11 +274,13 @@ registerTool({
|
|
|
275
274
|
// POST /ephemeris/angles-points
|
|
276
275
|
registerTool({
|
|
277
276
|
name: "ephemeris_angles_points",
|
|
278
|
-
description: "
|
|
279
|
-
"
|
|
280
|
-
"
|
|
281
|
-
"a synonym for the same point, not a separate one.\n\n" +
|
|
282
|
-
"CREDIT COST: 1 credit per call
|
|
277
|
+
description: "Use this when the user asks 'where is my Vertex', 'what's my East Point / equatorial ascendant' " +
|
|
278
|
+
"or 'what are my chart angles' for a date, time and place. Returns ASC, MC, DSC, IC, Vertex and " +
|
|
279
|
+
"the Equatorial Ascendant/Descendant; the equatorial ascendant is also returned under " +
|
|
280
|
+
"`east_point` — a synonym for the same point, not a separate one.\n\n" +
|
|
281
|
+
"CREDIT COST: 1 credit per call.\n\n" +
|
|
282
|
+
"Do not use for house cusps — use ephemeris_house_cusps; for the full chart use " +
|
|
283
|
+
"ephemeris_natal_chart.",
|
|
283
284
|
inputSchema: {
|
|
284
285
|
type: "object",
|
|
285
286
|
properties: {
|
|
@@ -305,11 +306,13 @@ registerTool({
|
|
|
305
306
|
// POST /ephemeris/aspect-check
|
|
306
307
|
registerTool({
|
|
307
308
|
name: "ephemeris_aspect_check",
|
|
308
|
-
description: "
|
|
309
|
-
"
|
|
309
|
+
description: "Use this when the user asks 'is 15° Aries square 18° Cancer', 'what aspect is between these two " +
|
|
310
|
+
"positions', 'how many degrees apart are my Sun and Moon' or 'is this within orb'. Returns the " +
|
|
311
|
+
"angular separation between two ecliptic longitudes (longitude_1, longitude_2) and any aspect " +
|
|
312
|
+
"within orb (conjunction, sextile, square, trine, opposition, etc.).\n\n" +
|
|
310
313
|
"CREDIT COST: 1 credit per call.\n\n" +
|
|
311
|
-
"
|
|
312
|
-
"
|
|
314
|
+
"Do not use to find WHEN a transit forms an aspect — use ephemeris_transits; for a whole chart's " +
|
|
315
|
+
"aspect grid use ephemeris_natal_chart.",
|
|
313
316
|
inputSchema: {
|
|
314
317
|
type: "object",
|
|
315
318
|
properties: {
|
|
@@ -9,7 +9,7 @@ registerTool({
|
|
|
9
9
|
"Renders the full bodygraph circuit board showing all 9 centers, 36 channels, and 64 gates " +
|
|
10
10
|
"with Personality (conscious) and Design (unconscious) activations color-coded. " +
|
|
11
11
|
"Defined centers are filled with their HD doctrine color; open/undefined centers remain muted. " +
|
|
12
|
-
"Returns a native SVG
|
|
12
|
+
"Returns a native SVG the host displays inline. Use format='png' to opt into raster output (requires server-side rasterizer).\n\n" +
|
|
13
13
|
"For a user-facing interactive bodygraph explorer, use explore_human_design instead.\n\n" +
|
|
14
14
|
"CREDIT COST: 2 credits per call.\n\n" +
|
|
15
15
|
"EXAMPLE (local birth time + zone): born 15 April 1990 at 14:30 in Chicago:\n" +
|
|
@@ -42,7 +42,7 @@ registerTool({
|
|
|
42
42
|
format: {
|
|
43
43
|
type: "string",
|
|
44
44
|
enum: ["svg", "png"],
|
|
45
|
-
description: "Output format. Defaults to 'svg' (pure Go renderer — no external deps, displays
|
|
45
|
+
description: "Output format. Defaults to 'svg' (pure Go renderer — no external deps, displays inline in any host that renders images). Use 'png' for raster output (requires server-side rasterizer).",
|
|
46
46
|
},
|
|
47
47
|
},
|
|
48
48
|
required: ["datetime"],
|
|
@@ -5,21 +5,18 @@ import { DATETIME_DESC, TIMEZONE_PROPERTY } from "../datetime.js";
|
|
|
5
5
|
import { localToUtcIsoHistorical } from "../datetime-historical.js";
|
|
6
6
|
registerTool({
|
|
7
7
|
name: "human_design_chart",
|
|
8
|
-
description: "
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
8
|
+
description: "Use this when the Human Design chart is wanted as data — 'give me my HD activations', 'which " +
|
|
9
|
+
"planets sit in which gates, design and personality', 'what are my variables', 'my Human Design " +
|
|
10
|
+
"chart as JSON' — the fields the visual tool omits. Returns Type, Strategy, Authority, Profile, " +
|
|
11
|
+
"defined and undefined Centers, activated Gates and Channels, Incarnation Cross, and both " +
|
|
12
|
+
"Personality (birth) and Design (~88° of Sun before birth) planetary positions.\n\n" +
|
|
13
13
|
"CREDIT COST: 2 credits per call.\n\n" +
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
" datetime='1990-04-15T14:30:00', timezone='America/Chicago', latitude=41.8781, longitude=-87.6298\n" +
|
|
21
|
-
"EXAMPLE (already in UTC):\n" +
|
|
22
|
-
" datetime='1990-04-15T19:30:00Z', latitude=41.8781, longitude=-87.6298",
|
|
14
|
+
"HD is minute-sensitive: pass the local birth time with its zone (or an offset/'Z'); a zone-less " +
|
|
15
|
+
"datetime is rejected, because an hour of error changes the Profile and the Design Sun line. " +
|
|
16
|
+
"Takes coordinates, not a place name.\n\n" +
|
|
17
|
+
"Do not use for 'what's my type / profile / authority' or when the user should SEE a bodygraph — " +
|
|
18
|
+
"use explore_human_design; for today's transits on their chart use explore_human_design_transit; " +
|
|
19
|
+
"for two people use explore_human_design_connection.",
|
|
23
20
|
inputSchema: {
|
|
24
21
|
type: "object",
|
|
25
22
|
properties: {
|
|
@@ -5,17 +5,14 @@ import { TIMEZONE_PROPERTY } from "../datetime.js";
|
|
|
5
5
|
import { localToUtcIsoHistorical } from "../datetime-historical.js";
|
|
6
6
|
registerTool({
|
|
7
7
|
name: "ephemeris_moon_phase",
|
|
8
|
-
description: "
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"CREDIT COST: 2 credits — phase and void-of-course are metered separately. For " +
|
|
17
|
-
"phase alone at 1 credit, use dev_read_api path='/ephemeris/moon/phase'.\n\n" +
|
|
18
|
-
"If no datetime is provided, returns the current (live) moon phase.",
|
|
8
|
+
description: "Use this when the Moon's state is wanted as data for a specific moment — 'what phase was the " +
|
|
9
|
+
"Moon on my birthday', 'what sign was the Moon in on 12 May 1990', 'moon phase and illumination " +
|
|
10
|
+
"as numbers'. Returns phase name, illumination %, the Moon's sign and degree, and the next " +
|
|
11
|
+
"void-of-course window; omit datetime for right now.\n\n" +
|
|
12
|
+
"CREDIT COST: 2 credits — phase and void-of-course are metered separately. For phase alone at 1 " +
|
|
13
|
+
"credit, use dev_read_api path='/ephemeris/moon/phase'.\n\n" +
|
|
14
|
+
"Do not use for tonight's moon or 'what sign is the Moon in' right now — use explore_moon_phase; " +
|
|
15
|
+
"for the DATE of the next new or full moon use ephemeris_next_lunar_phase.",
|
|
19
16
|
inputSchema: {
|
|
20
17
|
type: "object",
|
|
21
18
|
properties: {
|
|
@@ -64,21 +61,13 @@ registerTool({
|
|
|
64
61
|
});
|
|
65
62
|
registerTool({
|
|
66
63
|
name: "ephemeris_next_lunar_phase",
|
|
67
|
-
description: "
|
|
68
|
-
"Returns the exact UTC datetime
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"calendar search, plus a second search when the first window misses. So count=3 " +
|
|
75
|
-
"costs 3-6 credits.\n\n" +
|
|
76
|
-
"EXAMPLE: Find the next new moon:\n" +
|
|
77
|
-
" phase='new_moon'\n\n" +
|
|
78
|
-
"EXAMPLE: Find the next full moon after a specific date:\n" +
|
|
79
|
-
" phase='full_moon', after_date='2026-06-01'\n\n" +
|
|
80
|
-
"EXAMPLE: Find the next 3 full moons:\n" +
|
|
81
|
-
" phase='full_moon', count=3",
|
|
64
|
+
description: "Use this when the user asks 'when is the next full moon', 'when is the next new moon', 'what " +
|
|
65
|
+
"date is the next quarter moon' or 'list the next 3 full moons'. Returns the exact UTC datetime " +
|
|
66
|
+
"of each upcoming occurrence of the requested phase (phase = new_moon | full_moon | first_quarter " +
|
|
67
|
+
"| last_quarter), optionally after a given date and for count occurrences.\n\n" +
|
|
68
|
+
"CREDIT COST: 10-20 credits per occurrence (calendar endpoint); keep count=1 unless asked.\n\n" +
|
|
69
|
+
"Do not use for the phase or sign the Moon is in right now — use ephemeris_moon_phase; for " +
|
|
70
|
+
"eclipses use ephemeris_next_eclipse.",
|
|
82
71
|
inputSchema: {
|
|
83
72
|
type: "object",
|
|
84
73
|
properties: {
|
|
@@ -24,15 +24,16 @@ const HOUSE_SYSTEM_MAP = {
|
|
|
24
24
|
};
|
|
25
25
|
registerTool({
|
|
26
26
|
name: "ephemeris_natal_chart",
|
|
27
|
-
description: "
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
27
|
+
description: "Use this when the birth chart is wanted as data rather than a picture — 'give me my chart as " +
|
|
28
|
+
"JSON', 'list my natal aspects with orbs', 'what exact degree is my Ascendant', 'my placements as " +
|
|
29
|
+
"a table' — or as the input to a further calculation. Returns raw JSON: all major planets plus " +
|
|
30
|
+
"Chiron and the major asteroids (Ceres, Pallas, Juno, Vesta), angles (ASC/MC/DSC/IC), house " +
|
|
31
|
+
"cusps, dignity condition, retrograde flags and the major aspect grid; pass format='llm' for " +
|
|
32
|
+
"compact output. Takes coordinates, not a place name — resolve a city with location_search first.\n\n" +
|
|
32
33
|
"CREDIT COST: 1 credit per call.\n\n" +
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
34
|
+
"Do not use when the user wants to SEE the chart — use explore_natal_chart; for houses alone use " +
|
|
35
|
+
"ephemeris_house_cusps; for one planet use ephemeris_planet_position; for a Vedic/sidereal chart " +
|
|
36
|
+
"use vedic_chart.",
|
|
36
37
|
inputSchema: {
|
|
37
38
|
type: "object",
|
|
38
39
|
properties: {
|
|
@@ -4,13 +4,13 @@ import { OUTPUT_SCHEMA_IMAGE_AND_JSON } from "../output-schemas.js";
|
|
|
4
4
|
import { DATETIME_DESC, TIMEZONE_PROPERTY, WINDOW_DATE_DESC, assertZonedDatetime } from "../datetime.js";
|
|
5
5
|
registerTool({
|
|
6
6
|
name: "ephemeris_progressed_chart",
|
|
7
|
-
description: "
|
|
8
|
-
"
|
|
9
|
-
"
|
|
7
|
+
description: "Use this when the user asks 'what's my progressed chart', 'where is my progressed Moon / Sun', " +
|
|
8
|
+
"'what sign has my progressed Moon moved into' or 'my solar arc directions'. Returns progressed " +
|
|
9
|
+
"planet positions, house cusps, aspects and retrograde status for a target date — method = " +
|
|
10
|
+
"secondary (1 day = 1 year, default), solar_arc or tertiary.\n\n" +
|
|
10
11
|
"CREDIT COST: 1 credit per call.\n\n" +
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
" birth_latitude=51.5, birth_longitude=-0.12, target_datetime='2026-01-01', method='secondary'",
|
|
12
|
+
"Do not use for this year's birthday chart — use ephemeris_solar_return; to SEE progressions over " +
|
|
13
|
+
"the natal wheel use explore_bi_wheel (mode='progressed').",
|
|
14
14
|
inputSchema: {
|
|
15
15
|
type: "object",
|
|
16
16
|
properties: {
|
|
@@ -4,14 +4,13 @@ import { OUTPUT_SCHEMA_JSON } from "../output-schemas.js";
|
|
|
4
4
|
import { DATETIME_DESC, TIMEZONE_PROPERTY, assertZonedDatetime } from "../datetime.js";
|
|
5
5
|
registerTool({
|
|
6
6
|
name: "ephemeris_relocation",
|
|
7
|
-
description: "
|
|
8
|
-
"
|
|
9
|
-
"
|
|
7
|
+
description: "Use this when the user asks 'how does my chart change if I move to London', 'what's my relocated " +
|
|
8
|
+
"Ascendant in Tokyo' or 'recast my chart for where I live now'. Returns the natal chart re-cast " +
|
|
9
|
+
"for a new location — the same planetary longitudes with the houses and angles that place gives " +
|
|
10
|
+
"them.\n\n" +
|
|
10
11
|
"CREDIT COST: 1 credit per call.\n\n" +
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
" natal_latitude=41.8781, natal_longitude=-87.6298,\n" +
|
|
14
|
-
" relocation_latitude=51.5074, relocation_longitude=-0.1278",
|
|
12
|
+
"Do not use for 'is this city good for me' or which planetary lines cross a place — use acg_hits; " +
|
|
13
|
+
"for the full astrocartography map use acg_power_lines.",
|
|
15
14
|
inputSchema: {
|
|
16
15
|
type: "object",
|
|
17
16
|
properties: {
|
|
@@ -5,15 +5,13 @@ import { DATETIME_DESC, TIMEZONE_PROPERTY, assertZonedDatetime, toDateTimeInputB
|
|
|
5
5
|
// POST /predictive/returns/solar
|
|
6
6
|
registerTool({
|
|
7
7
|
name: "ephemeris_solar_return",
|
|
8
|
-
description: "
|
|
9
|
-
"
|
|
8
|
+
description: "Use this when the user asks 'when exactly is my solar return', 'my solar return positions as " +
|
|
9
|
+
"data' or 'my solar return for 2027 as JSON'. Returns the exact moment the Sun returns to its " +
|
|
10
|
+
"natal longitude near the birthday and the Solar Return chart for that year; target_datetime " +
|
|
11
|
+
"picks the year (defaults to the current one).\n\n" +
|
|
10
12
|
"CREDIT COST: 5 credits per call.\n\n" +
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"EXAMPLE: Solar return for someone born 1985-06-21 (current year):\n" +
|
|
14
|
-
" birth_datetime='1985-06-21T14:00:00Z'\n\n" +
|
|
15
|
-
"EXAMPLE: Solar return for 2027 specifically:\n" +
|
|
16
|
-
" birth_datetime='1985-06-21T14:00:00Z', target_datetime='2027-01-01T00:00:00Z'",
|
|
13
|
+
"Do not use when the user should SEE it over their natal chart — use explore_bi_wheel " +
|
|
14
|
+
"(mode='solar_return'); for progressions use ephemeris_progressed_chart.",
|
|
17
15
|
inputSchema: {
|
|
18
16
|
type: "object",
|
|
19
17
|
properties: {
|
|
@@ -4,15 +4,14 @@ import { OUTPUT_SCHEMA_IMAGE_AND_JSON } from "../output-schemas.js";
|
|
|
4
4
|
import { DATETIME_DESC, assertZonedDatetime, timezoneProperty } from "../datetime.js";
|
|
5
5
|
registerTool({
|
|
6
6
|
name: "ephemeris_synastry",
|
|
7
|
-
description: "
|
|
8
|
-
"
|
|
9
|
-
"
|
|
7
|
+
description: "Use this when the relationship comparison is wanted as data — 'list our inter-aspects with " +
|
|
8
|
+
"orbs', 'what aspects does their Mars make to my Venus', 'our synastry as JSON'. Returns the " +
|
|
9
|
+
"cross-aspects between the two charts plus both natal charts; needs each person's birth datetime, " +
|
|
10
|
+
"zone and coordinates.\n\n" +
|
|
10
11
|
"CREDIT COST: 3 credits per call.\n\n" +
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
" person_b_datetime='1988-09-22T08:15:00', person_b_timezone='America/Los_Angeles',\n" +
|
|
15
|
-
" person_b_latitude=34.0522, person_b_longitude=-118.2437",
|
|
12
|
+
"Do not use for 'are we compatible' or when the user should SEE the comparison — use " +
|
|
13
|
+
"explore_bi_wheel (mode='synastry'); for Human Design compatibility use " +
|
|
14
|
+
"explore_human_design_connection.",
|
|
16
15
|
inputSchema: {
|
|
17
16
|
type: "object",
|
|
18
17
|
properties: {
|
|
@@ -4,20 +4,21 @@ import { OUTPUT_SCHEMA_JSON } from "../output-schemas.js";
|
|
|
4
4
|
import { DATETIME_DESC, WINDOW_DATE_DESC, timezoneProperty } from "../datetime.js";
|
|
5
5
|
registerTool({
|
|
6
6
|
name: "ephemeris_transits",
|
|
7
|
-
description: "
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
7
|
+
description: "Use this when the user asks 'when is my Saturn return', 'when does Pluto square my Sun', 'when " +
|
|
8
|
+
"will Jupiter conjunct my Moon', 'what transits do I have next year' — any " +
|
|
9
|
+
"WHEN-does-a-transit-hit question, as data. Returns the exact moments transiting planets form the " +
|
|
10
|
+
"requested aspect to natal points over a date range.\n\n" +
|
|
11
|
+
"ASPECT ANGLES (aspect_angle): 0 = conjunction/return (default), 180 = opposition, 90 = square, " +
|
|
12
|
+
"120 = trine. Saturn return → transiting_planets=['saturn'], natal_points=['saturn'], " +
|
|
13
|
+
"aspect_angle=0.\n" +
|
|
14
|
+
"EFFICIENCY: always pass transiting_planets and natal_points — omitting both sweeps all outer " +
|
|
15
|
+
"planets against all core points and is slow. DEFAULT natal_points: sun, moon, mercury, venus, " +
|
|
16
|
+
"mars, jupiter, saturn.\n" +
|
|
17
|
+
"SEARCH RANGE LIMITS: Explorer/PayG → 1 year; Pro → 5 years; Startup → 10 years.\n" +
|
|
18
|
+
"CREDIT COST: 6 credits per call (natal chart + search).\n\n" +
|
|
19
|
+
"Do not use when the user should SEE a forecast — use explore_transit_timeline; for the sky today " +
|
|
20
|
+
"with no birth data use electional_moment_analysis; for retrograde dates use " +
|
|
21
|
+
"electional_station_tracker.",
|
|
21
22
|
inputSchema: {
|
|
22
23
|
type: "object",
|
|
23
24
|
properties: {
|
|
@@ -5,13 +5,14 @@ import { DATETIME_DESC, TIMEZONE_PROPERTY } from "../datetime.js";
|
|
|
5
5
|
import { localToUtcIsoHistorical } from "../datetime-historical.js";
|
|
6
6
|
registerTool({
|
|
7
7
|
name: "vedic_chart",
|
|
8
|
-
description: "
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
8
|
+
description: "Use this when the Vedic / Jyotish chart is wanted as data — 'my sidereal placements as JSON', " +
|
|
9
|
+
"'nakshatra and pada for every planet as a table', 'my navamsa positions'. Takes coordinates, not " +
|
|
10
|
+
"a place name. Returns sidereal planet placements in rashis, nakshatras with pada, navamsa " +
|
|
11
|
+
"placements and bhavas (Whole Sign houses).\n\n" +
|
|
12
12
|
"SUPPORTED AYANAMSA: lahiri (default), fagan_bradley, krishnamurti, raman, yukteshwar\n\n" +
|
|
13
|
-
"
|
|
14
|
-
"
|
|
13
|
+
"CREDIT COST: 1 credit per call.\n\n" +
|
|
14
|
+
"Do not use for 'what's my nakshatra / rashi / lagna' or when the user should SEE the chart — use " +
|
|
15
|
+
"explore_vedic_chart; for a Western tropical chart use ephemeris_natal_chart.",
|
|
15
16
|
inputSchema: {
|
|
16
17
|
type: "object",
|
|
17
18
|
properties: {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface UiMetaSource {
|
|
2
|
+
name?: string;
|
|
3
|
+
_meta?: {
|
|
4
|
+
ui?: {
|
|
5
|
+
resourceUri?: string;
|
|
6
|
+
visibility?: Array<"app" | "model">;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Build the `_meta` wrapper for a tool, or `{}` when the tool renders no UI
|
|
12
|
+
* and has no invocation status. Spread the result into the tools/list entry.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildUiMeta(tool: UiMetaSource): Record<string, unknown>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/tools/ui-meta.ts — the `_meta` block a tool carries when it renders an MCP App.
|
|
3
|
+
*
|
|
4
|
+
* One builder, used by both transports (stdio `src/index.ts`, remote
|
|
5
|
+
* `src/server-sse.ts`), because the two had drifted into copy-paste twins of the
|
|
6
|
+
* same object literal and only one of them would ever get updated.
|
|
7
|
+
*
|
|
8
|
+
* Three wire forms, all describing the same `ui://` resource:
|
|
9
|
+
*
|
|
10
|
+
* 1. `_meta.ui.{resourceUri,visibility}` — the canonical MCP Apps form
|
|
11
|
+
* (SEP-1865, first official MCP extension 2026-01-26, folded into the
|
|
12
|
+
* 2026-07-28 spec). This is what the spec says hosts read.
|
|
13
|
+
* 2. `_meta["ui/resourceUri"]` — the deprecated flat alias. The spec says it
|
|
14
|
+
* "will be removed before general availability"; kept only for pre-GA
|
|
15
|
+
* hosts still on the older shape. Drop it once those are gone.
|
|
16
|
+
* 3. `_meta["openai/*"]` — ChatGPT's compatibility aliases. OpenAI co-authored
|
|
17
|
+
* SEP-1865 and its own reference documents `openai/outputTemplate` as an
|
|
18
|
+
* "optional/compatibility alias for `_meta.ui.resourceUri`", so a fully
|
|
19
|
+
* converged ChatGPT host needs nothing here. Emitting it anyway is a few
|
|
20
|
+
* bytes and removes the question of which side converged first.
|
|
21
|
+
*
|
|
22
|
+
* `openai/widgetAccessible` marks a tool the widget itself may invoke. That is
|
|
23
|
+
* exactly what `visibility` already encodes: a tool visible to "app" is one the
|
|
24
|
+
* iframe calls (the `*_recalculate` and `*_on_*_click` handlers), so the flag is
|
|
25
|
+
* derived rather than hand-maintained on 92 tools.
|
|
26
|
+
*
|
|
27
|
+
* The same block also carries ChatGPT's invocation status text
|
|
28
|
+
* (`openai/toolInvocation/invoking` / `invoked`, from invocation-status.ts)
|
|
29
|
+
* for any tool that has an entry there, UI or not — so a tool without a
|
|
30
|
+
* widget still gets a sentence instead of the host's generic spinner.
|
|
31
|
+
*/
|
|
32
|
+
import { INVOCATION_STATUS } from "./invocation-status.js";
|
|
33
|
+
const DEFAULT_VISIBILITY = ["model", "app"];
|
|
34
|
+
/**
|
|
35
|
+
* Build the `_meta` wrapper for a tool, or `{}` when the tool renders no UI
|
|
36
|
+
* and has no invocation status. Spread the result into the tools/list entry.
|
|
37
|
+
*/
|
|
38
|
+
export function buildUiMeta(tool) {
|
|
39
|
+
const meta = {};
|
|
40
|
+
const resourceUri = tool._meta?.ui?.resourceUri;
|
|
41
|
+
if (resourceUri) {
|
|
42
|
+
const visibility = tool._meta?.ui?.visibility ?? DEFAULT_VISIBILITY;
|
|
43
|
+
// Deprecated flat form — pre-GA hosts only.
|
|
44
|
+
meta["ui/resourceUri"] = resourceUri;
|
|
45
|
+
// Canonical MCP Apps form.
|
|
46
|
+
meta.ui = { resourceUri, visibility };
|
|
47
|
+
// ChatGPT compatibility aliases.
|
|
48
|
+
meta["openai/outputTemplate"] = resourceUri;
|
|
49
|
+
meta["openai/widgetAccessible"] = visibility.includes("app");
|
|
50
|
+
}
|
|
51
|
+
const status = tool.name ? INVOCATION_STATUS[tool.name] : undefined;
|
|
52
|
+
if (status) {
|
|
53
|
+
meta["openai/toolInvocation/invoking"] = status.invoking;
|
|
54
|
+
meta["openai/toolInvocation/invoked"] = status.invoked;
|
|
55
|
+
}
|
|
56
|
+
return Object.keys(meta).length ? { _meta: meta } : {};
|
|
57
|
+
}
|
package/dist/ui/bazi.html
CHANGED
|
@@ -6802,7 +6802,7 @@ function E_(e4, t2, n2 = []) {
|
|
|
6802
6802
|
let e5 = document.getElementById("fs-hint-banner");
|
|
6803
6803
|
e5 && e5.remove();
|
|
6804
6804
|
let t3 = document.createElement("div");
|
|
6805
|
-
t3.id = "fs-hint-banner", Object.assign(t3.style, { position: "fixed", top: "12px", left: "50%", transform: "translateX(-50%)", background: "oklch(14% 0.012 265 / 0.90)", backdropFilter: "blur(12px)", WebkitBackdropFilter: "blur(12px)", border: "1px solid oklch(72% 0.12 80 / 0.3)", borderRadius: "20px", padding: "6px 16px", fontSize: "11px", fontWeight: "600", color: "oklch(80% 0.08 80)", letterSpacing: "0.04em", zIndex: "9999", pointerEvents: "none", opacity: "0", transition: "opacity 300ms ease", whiteSpace: "nowrap" }), t3.textContent = "Esc \u2014 exit fullscreen & return to
|
|
6805
|
+
t3.id = "fs-hint-banner", Object.assign(t3.style, { position: "fixed", top: "12px", left: "50%", transform: "translateX(-50%)", background: "oklch(14% 0.012 265 / 0.90)", backdropFilter: "blur(12px)", WebkitBackdropFilter: "blur(12px)", border: "1px solid oklch(72% 0.12 80 / 0.3)", borderRadius: "20px", padding: "6px 16px", fontSize: "11px", fontWeight: "600", color: "oklch(80% 0.08 80)", letterSpacing: "0.04em", zIndex: "9999", pointerEvents: "none", opacity: "0", transition: "opacity 300ms ease", whiteSpace: "nowrap" }), t3.textContent = "Esc \u2014 exit fullscreen & return to chat", document.body.appendChild(t3), requestAnimationFrame(() => {
|
|
6806
6806
|
t3.style.opacity = "1";
|
|
6807
6807
|
}), setTimeout(() => {
|
|
6808
6808
|
t3.style.opacity = "0", setTimeout(() => t3.remove(), 350);
|
|
@@ -6856,6 +6856,11 @@ async function V_(e4) {
|
|
|
6856
6856
|
}
|
|
6857
6857
|
}
|
|
6858
6858
|
async function H_(e4) {
|
|
6859
|
+
let t2 = F_ == null ? void 0 : F_._birth_params;
|
|
6860
|
+
if (t2) {
|
|
6861
|
+
let n2 = String(t2.hour).padStart(2, "0");
|
|
6862
|
+
e4 = "BaZi chart: ".concat(t2.year, "-").concat(String(t2.month).padStart(2, "0"), "-").concat(String(t2.day).padStart(2, "0"), " ").concat(n2, ":00\n\n").concat(e4);
|
|
6863
|
+
}
|
|
6859
6864
|
try {
|
|
6860
6865
|
(await P_.sendMessage({ role: "user", content: [{ type: "text", text: e4 }] })).isError && console.error("[BaZi] Host rejected sendMessage");
|
|
6861
6866
|
} catch (e5) {
|