|
@@ -12,7 +12,7 @@ from typing import Any
|
|
|
|
|
|
|
|
from .server import mcp
|
|
from .server import mcp
|
|
|
from . import astrology
|
|
from . import astrology
|
|
|
-from .ephemeris_client import call_sky_state, extract_bodies
|
|
|
|
|
|
|
+from .ephemeris_client import call_sky_state, extract_bodies, extract_houses
|
|
|
|
|
|
|
|
logger = logging.getLogger("astro-mcp.tools")
|
|
logger = logging.getLogger("astro-mcp.tools")
|
|
|
|
|
|
|
@@ -161,17 +161,20 @@ Returns:
|
|
|
lon=longitude,
|
|
lon=longitude,
|
|
|
elevation=elevation,
|
|
elevation=elevation,
|
|
|
geocentric=True,
|
|
geocentric=True,
|
|
|
|
|
+ house_system=house_system,
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
if "error" in sky:
|
|
if "error" in sky:
|
|
|
return {"input": {"birth_datetime": birth_datetime, "latitude": latitude, "longitude": longitude}, "error": sky["error"]}
|
|
return {"input": {"birth_datetime": birth_datetime, "latitude": latitude, "longitude": longitude}, "error": sky["error"]}
|
|
|
|
|
|
|
|
raw_bodies = extract_bodies(sky)
|
|
raw_bodies = extract_bodies(sky)
|
|
|
- sidereal = sky.get("sidereal_time", {})
|
|
|
|
|
- lst_hours = sidereal.get("local_sidereal_time", 0.0)
|
|
|
|
|
|
|
|
|
|
- # Calculate houses
|
|
|
|
|
- houses = astrology.calculate_houses(lst_hours, latitude, house_system)
|
|
|
|
|
|
|
+ # Use server-side houses if available, otherwise fall back to local calculation
|
|
|
|
|
+ houses = extract_houses(sky)
|
|
|
|
|
+ if houses is None:
|
|
|
|
|
+ sidereal = sky.get("sidereal_time", {})
|
|
|
|
|
+ lst_hours = sidereal.get("local_sidereal_time", 0.0)
|
|
|
|
|
+ houses = astrology.calculate_houses(lst_hours, latitude, house_system)
|
|
|
|
|
|
|
|
# Build planet list with house placement
|
|
# Build planet list with house placement
|
|
|
planets = []
|
|
planets = []
|
|
@@ -344,6 +347,7 @@ Returns:
|
|
|
lon=longitude,
|
|
lon=longitude,
|
|
|
elevation=elevation,
|
|
elevation=elevation,
|
|
|
geocentric=True,
|
|
geocentric=True,
|
|
|
|
|
+ house_system=house_system,
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
# Get transit sky state at transit location
|
|
# Get transit sky state at transit location
|
|
@@ -363,10 +367,12 @@ Returns:
|
|
|
natal_bodies = extract_bodies(natal_sky)
|
|
natal_bodies = extract_bodies(natal_sky)
|
|
|
transit_bodies = extract_bodies(transit_sky)
|
|
transit_bodies = extract_bodies(transit_sky)
|
|
|
|
|
|
|
|
- # Natal houses from natal LST
|
|
|
|
|
- sidereal = natal_sky.get("sidereal_time", {})
|
|
|
|
|
- lst_hours = sidereal.get("local_sidereal_time", 0.0)
|
|
|
|
|
- houses = astrology.calculate_houses(lst_hours, latitude, house_system)
|
|
|
|
|
|
|
+ # Use server-side houses if available, otherwise fall back to local calculation
|
|
|
|
|
+ houses = extract_houses(natal_sky)
|
|
|
|
|
+ if houses is None:
|
|
|
|
|
+ sidereal = natal_sky.get("sidereal_time", {})
|
|
|
|
|
+ lst_hours = sidereal.get("local_sidereal_time", 0.0)
|
|
|
|
|
+ houses = astrology.calculate_houses(lst_hours, latitude, house_system)
|
|
|
|
|
|
|
|
# Build natal planets
|
|
# Build natal planets
|
|
|
natal_planets = []
|
|
natal_planets = []
|
|
@@ -482,8 +488,8 @@ Returns:
|
|
|
Dict with: input, chart_type, chart1_natal, chart2_natal, interaspects,
|
|
Dict with: input, chart_type, chart1_natal, chart2_natal, interaspects,
|
|
|
house_overlays, composite_chart, davison_chart, summary (top_aspects,
|
|
house_overlays, composite_chart, davison_chart, summary (top_aspects,
|
|
|
saturn_contacts, node_contacts, venus_mars_contacts, sun_moon_contacts)."""
|
|
saturn_contacts, node_contacts, venus_mars_contacts, sun_moon_contacts)."""
|
|
|
- sky1 = await call_sky_state(datetime=person1_datetime, lat=person1_latitude, lon=person1_longitude, elevation=elevation)
|
|
|
|
|
- sky2 = await call_sky_state(datetime=person2_datetime, lat=person2_latitude, lon=person2_longitude, elevation=elevation)
|
|
|
|
|
|
|
+ sky1 = await call_sky_state(datetime=person1_datetime, lat=person1_latitude, lon=person1_longitude, elevation=elevation, house_system=house_system)
|
|
|
|
|
+ sky2 = await call_sky_state(datetime=person2_datetime, lat=person2_latitude, lon=person2_longitude, elevation=elevation, house_system=house_system)
|
|
|
|
|
|
|
|
if "error" in sky1:
|
|
if "error" in sky1:
|
|
|
return {"error": f"person1: {sky1['error']}"}
|
|
return {"error": f"person1: {sky1['error']}"}
|
|
@@ -493,13 +499,18 @@ Returns:
|
|
|
bodies1 = extract_bodies(sky1)
|
|
bodies1 = extract_bodies(sky1)
|
|
|
bodies2 = extract_bodies(sky2)
|
|
bodies2 = extract_bodies(sky2)
|
|
|
|
|
|
|
|
- sidereal1 = sky1.get("sidereal_time", {})
|
|
|
|
|
- lst1 = sidereal1.get("local_sidereal_time", 0.0)
|
|
|
|
|
- houses1 = astrology.calculate_houses(lst1, person1_latitude, house_system)
|
|
|
|
|
|
|
+ # Use server-side houses if available, otherwise fall back to local calculation
|
|
|
|
|
+ houses1 = extract_houses(sky1)
|
|
|
|
|
+ if houses1 is None:
|
|
|
|
|
+ sidereal1 = sky1.get("sidereal_time", {})
|
|
|
|
|
+ lst1 = sidereal1.get("local_sidereal_time", 0.0)
|
|
|
|
|
+ houses1 = astrology.calculate_houses(lst1, person1_latitude, house_system)
|
|
|
|
|
|
|
|
- sidereal2 = sky2.get("sidereal_time", {})
|
|
|
|
|
- lst2 = sidereal2.get("local_sidereal_time", 0.0)
|
|
|
|
|
- houses2 = astrology.calculate_houses(lst2, person2_latitude, house_system)
|
|
|
|
|
|
|
+ houses2 = extract_houses(sky2)
|
|
|
|
|
+ if houses2 is None:
|
|
|
|
|
+ sidereal2 = sky2.get("sidereal_time", {})
|
|
|
|
|
+ lst2 = sidereal2.get("local_sidereal_time", 0.0)
|
|
|
|
|
+ houses2 = astrology.calculate_houses(lst2, person2_latitude, house_system)
|
|
|
|
|
|
|
|
def build_planet_list(bodies):
|
|
def build_planet_list(bodies):
|
|
|
result = []
|
|
result = []
|
|
@@ -605,13 +616,15 @@ Returns:
|
|
|
davison_dt = _jd_to_datetime(davison["date_midpoint_jd"])
|
|
davison_dt = _jd_to_datetime(davison["date_midpoint_jd"])
|
|
|
davison_sky = await call_sky_state(
|
|
davison_sky = await call_sky_state(
|
|
|
datetime=davison_dt, lat=davison_mid_lat, lon=davison_mid_lon,
|
|
datetime=davison_dt, lat=davison_mid_lat, lon=davison_mid_lon,
|
|
|
- elevation=0.0, geocentric=True,
|
|
|
|
|
|
|
+ elevation=0.0, geocentric=True, house_system=house_system,
|
|
|
)
|
|
)
|
|
|
if "error" not in davison_sky:
|
|
if "error" not in davison_sky:
|
|
|
davison_raw = extract_bodies(davison_sky)
|
|
davison_raw = extract_bodies(davison_sky)
|
|
|
- davison_sidereal = davison_sky.get("sidereal_time", {})
|
|
|
|
|
- davison_lst = davison_sidereal.get("local_sidereal_time", 0.0)
|
|
|
|
|
- davison_houses = astrology.calculate_houses(davison_lst, davison_mid_lat, house_system)
|
|
|
|
|
|
|
+ davison_houses = extract_houses(davison_sky)
|
|
|
|
|
+ if davison_houses is None:
|
|
|
|
|
+ davison_sidereal = davison_sky.get("sidereal_time", {})
|
|
|
|
|
+ davison_lst = davison_sidereal.get("local_sidereal_time", 0.0)
|
|
|
|
|
+ davison_houses = astrology.calculate_houses(davison_lst, davison_mid_lat, house_system)
|
|
|
|
|
|
|
|
davison_planets = []
|
|
davison_planets = []
|
|
|
for body in davison_raw:
|
|
for body in davison_raw:
|
|
@@ -1030,13 +1043,16 @@ Returns:
|
|
|
# Use a date near the midpoint for house calculation
|
|
# Use a date near the midpoint for house calculation
|
|
|
comp_sky = await call_sky_state(
|
|
comp_sky = await call_sky_state(
|
|
|
datetime=person1_datetime, lat=comp_lat, lon=comp_lon, elevation=elevation,
|
|
datetime=person1_datetime, lat=comp_lat, lon=comp_lon, elevation=elevation,
|
|
|
|
|
+ house_system=house_system,
|
|
|
)
|
|
)
|
|
|
if "error" in comp_sky:
|
|
if "error" in comp_sky:
|
|
|
return {"error": f"composite ephemeris error: {comp_sky['error']}"}
|
|
return {"error": f"composite ephemeris error: {comp_sky['error']}"}
|
|
|
|
|
|
|
|
|
|
+ houses = extract_houses(comp_sky)
|
|
|
sidereal = comp_sky.get("sidereal_time", {})
|
|
sidereal = comp_sky.get("sidereal_time", {})
|
|
|
lst_hours = sidereal.get("local_sidereal_time", 0.0)
|
|
lst_hours = sidereal.get("local_sidereal_time", 0.0)
|
|
|
- houses = astrology.calculate_houses(lst_hours, comp_lat, house_system)
|
|
|
|
|
|
|
+ if houses is None:
|
|
|
|
|
+ houses = astrology.calculate_houses(lst_hours, comp_lat, house_system)
|
|
|
|
|
|
|
|
# Build composite planet list with house placement
|
|
# Build composite planet list with house placement
|
|
|
composite_planets = []
|
|
composite_planets = []
|
|
@@ -1126,15 +1142,17 @@ Returns:
|
|
|
|
|
|
|
|
sky = await call_sky_state(
|
|
sky = await call_sky_state(
|
|
|
datetime=davison_dt, lat=mid_lat, lon=mid_lon,
|
|
datetime=davison_dt, lat=mid_lat, lon=mid_lon,
|
|
|
- elevation=elevation, geocentric=True,
|
|
|
|
|
|
|
+ elevation=elevation, geocentric=True, house_system=house_system,
|
|
|
)
|
|
)
|
|
|
if "error" in sky:
|
|
if "error" in sky:
|
|
|
return {"error": f"davison ephemeris error: {sky['error']}"}
|
|
return {"error": f"davison ephemeris error: {sky['error']}"}
|
|
|
|
|
|
|
|
raw_bodies = extract_bodies(sky)
|
|
raw_bodies = extract_bodies(sky)
|
|
|
|
|
+ houses = extract_houses(sky)
|
|
|
sidereal = sky.get("sidereal_time", {})
|
|
sidereal = sky.get("sidereal_time", {})
|
|
|
lst_hours = sidereal.get("local_sidereal_time", 0.0)
|
|
lst_hours = sidereal.get("local_sidereal_time", 0.0)
|
|
|
- houses = astrology.calculate_houses(lst_hours, mid_lat, house_system)
|
|
|
|
|
|
|
+ if houses is None:
|
|
|
|
|
+ houses = astrology.calculate_houses(lst_hours, mid_lat, house_system)
|
|
|
|
|
|
|
|
planets = []
|
|
planets = []
|
|
|
for body in raw_bodies:
|
|
for body in raw_bodies:
|