Personal astrological MCP server — natal charts, transits, aspects, composite & Davison relationship charts, backed by SQLite
Project description
w8s-astro-mcp
Personal astrological MCP server using the Swiss Ephemeris via pysweph. Provides natal charts, transit calculations, aspect analysis, chart visualization, and relationship chart support (composite & Davison) — all backed by a queryable SQLite database.
Features
- Natal charts — planetary positions, houses, and angles at birth
- Transit calculations — current sky positions auto-logged to history
- Transit history — query logged transits by date, planet, or sign
- Ingress forecasting — upcoming or past sign ingresses and stations; supports far-future and historical windows
- Aspect analysis — compare any two charts (natal vs natal, natal vs transits, natal vs event)
- House placements — determine which house each planet occupies
- Chart visualization — render natal chart wheels as PNG
- Multi-profile — manage charts for multiple people
- Relationship charts — composite and Davison charts for any group of 2+ people
- Event charts — cast charts for any moment and place; optionally save and compare
- Electional astrology — scan a time window for auspicious moments against configurable criteria
Installation
Add to Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"w8s-astro-mcp": {
"command": "uvx",
"args": ["w8s-astro-mcp"]
}
}
}
uvx pulls the package from PyPI and runs it in an isolated environment — no manual install needed. If you don't have uv, install it with:
brew install uv
Alternative: pip install
pip install w8s-astro-mcp
Then use "command": "w8s-astro-mcp" (no args) in your Claude Desktop config.
First-Time Setup
On first use, create your profile:
"Create an astro profile for me — my name is [Name], born [date] at [time] in [city, state]."
Claude will use create_profile to set up your birth data and set you as the active profile. Everything is stored in ~/.w8s-astro-mcp/astro.db.
Tools
Core (9)
| Tool | Description |
|---|---|
check_ephemeris |
Report ephemeris mode (Moshier/Swiss Ephemeris), pysweph version, and precision |
download_ephemeris_files |
Download Swiss Ephemeris .se1 files for higher precision (optional) |
setup_astro_config |
(deprecated) Legacy config wizard |
view_config |
Show current profile and saved locations |
get_natal_chart |
Planetary positions, houses, and angles at birth |
get_transits |
Current sky positions (auto-logged to history) |
compare_charts |
Aspects between any two charts |
find_house_placements |
Which house each planet occupies |
visualize_natal_chart |
Render natal chart wheel as PNG |
Transit History & Forecasting — Phase 4 (3)
| Tool | Description |
|---|---|
get_transit_history |
Query logged transits by date range, planet, or sign |
find_last_transit |
Most recent logged transit matching planet + sign/retrograde/house |
get_ingresses |
Ephemeris-backed sign ingress and station forecast; supports offset, future/past, and extended mode for historical or far-future windows |
Profile Management (7)
| Tool | Description |
|---|---|
list_profiles |
All profiles in the database |
create_profile |
Add a new person's birth data |
update_profile |
Edit name, birth date, or birth time |
delete_profile |
Remove a profile (must leave connections first) |
set_current_profile |
Switch the active profile |
add_location |
Save a named location to a profile |
remove_location |
Delete a saved location |
Connection Management — Phase 7 (6)
| Tool | Description |
|---|---|
create_connection |
Name a group of 2+ profiles |
list_connections |
All connections in the database |
add_connection_member |
Add a profile to a connection |
remove_connection_member |
Remove a profile (invalidates cached charts) |
get_connection_chart |
Calculate or retrieve composite/Davison chart |
delete_connection |
Remove a connection and all its charts |
Event Charts & Electional Astrology — Phase 8 (4)
| Tool | Description |
|---|---|
cast_event_chart |
Cast a chart for any date/time/location; optionally save by label for later reference |
list_event_charts |
List all saved event charts; filter by associated profile |
delete_event_chart |
Remove a saved event chart and all its positions |
find_electional_windows |
Scan a time window (up to 90 days) and return candidate moments scored against criteria: Moon not void, planets direct, benefics angular, Moon waxing/waning, ASC not late degree |
compare_charts also accepts event:<label> as a chart source, enabling comparisons like compare_charts(chart1_date="natal", chart2_date="event:wedding-2026").
Database
All data lives in ~/.w8s-astro-mcp/astro.db — a standard SQLite file you can query directly.
sqlite3 ~/.w8s-astro-mcp/astro.db
# Most-checked transit planets
SELECT planet, COUNT(*) AS checks
FROM transit_planets GROUP BY planet ORDER BY checks DESC;
# All connections
SELECT c.label, c.type FROM connections c;
See docs/DATABASE_SCHEMA.md for the full schema with ERDs and example queries.
Architecture
See docs/ARCHITECTURE.md for data flow diagrams, design decisions, and the full directory structure.
Key design choices:
- Natal and transit positions stored as normalized rows (not JSON blobs) — fully queryable
- Every
get_transitscall auto-logs to history with a denormalized location snapshot (saved locations only — ad-hoc geocoded locations are not persisted) get_transitsaccepts any city name inline — geocoded via Nominatim with accurate IANA timezone lookup viatimezonefinder- Connection charts cached with an
is_validflag — invalidated when members change, recalculated on next access - Position format normalized at write time via
_normalize_position()— both composite math output and pysweph decimal-degree output coerced todegree/minutes/seconds/absolute_position
Testing
# Full suite
pytest
# By domain
pytest tests/models/ # ORM model tests
pytest tests/test_connection_calculator.py # Composite & Davison math
pytest tests/test_connection_db_helpers.py # Integration tests (real SQLite)
# With coverage
pytest --cov=src/w8s_astro_mcp
302 tests. See docs/ARCHITECTURE.md for the full test command reference.
Roadmap
See docs/ROADMAP.md for planned phases including database self-healing tools (Phase 9).
Questions, Bugs, Ideas
Open an issue on GitHub — that's the best place for bug reports, feature requests, or questions.
License
AGPL-3.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file w8s_astro_mcp-0.11.0.tar.gz.
File metadata
- Download URL: w8s_astro_mcp-0.11.0.tar.gz
- Upload date:
- Size: 255.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
262e79618501827bcb5fdc7b321c2220ed624a7dff1b73f9487fd283b193e2e4
|
|
| MD5 |
e2045867791ca870c2d4c34d3a6217be
|
|
| BLAKE2b-256 |
031e514c1bc8a8c33daa0434759f2c9385b6a2c963677c4016929065d1544ad8
|
Provenance
The following attestation bundles were made for w8s_astro_mcp-0.11.0.tar.gz:
Publisher:
publish.yml on w8s/w8s-astro-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
w8s_astro_mcp-0.11.0.tar.gz -
Subject digest:
262e79618501827bcb5fdc7b321c2220ed624a7dff1b73f9487fd283b193e2e4 - Sigstore transparency entry: 990571030
- Sigstore integration time:
-
Permalink:
w8s/w8s-astro-mcp@fe74f091f83d1b488a0f9fe17b23392fb9d7fa02 -
Branch / Tag:
refs/tags/0.11.0 - Owner: https://github.com/w8s
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@fe74f091f83d1b488a0f9fe17b23392fb9d7fa02 -
Trigger Event:
push
-
Statement type:
File details
Details for the file w8s_astro_mcp-0.11.0-py3-none-any.whl.
File metadata
- Download URL: w8s_astro_mcp-0.11.0-py3-none-any.whl
- Upload date:
- Size: 95.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5dbd4809345a075a880886cc3b6919f0ae87e7e6d821ada610d6d203453e4ea6
|
|
| MD5 |
c46b61065ee4974740538857f08344ad
|
|
| BLAKE2b-256 |
f9802398c259edcdd7e8c7dad43fcf09e3d43f04db8fac1390c5d9066de07489
|
Provenance
The following attestation bundles were made for w8s_astro_mcp-0.11.0-py3-none-any.whl:
Publisher:
publish.yml on w8s/w8s-astro-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
w8s_astro_mcp-0.11.0-py3-none-any.whl -
Subject digest:
5dbd4809345a075a880886cc3b6919f0ae87e7e6d821ada610d6d203453e4ea6 - Sigstore transparency entry: 990571031
- Sigstore integration time:
-
Permalink:
w8s/w8s-astro-mcp@fe74f091f83d1b488a0f9fe17b23392fb9d7fa02 -
Branch / Tag:
refs/tags/0.11.0 - Owner: https://github.com/w8s
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@fe74f091f83d1b488a0f9fe17b23392fb9d7fa02 -
Trigger Event:
push
-
Statement type: