You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
add makefile target to validate public docker image
Add some more sanity checking and validation for docker, details about mcp in general
rename project to ephemeris-mcp
Copy file name to clipboardExpand all lines: .github/copilot-instructions.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
-
# GitHub Copilot Instructions for AstroMCP
1
+
# GitHub Copilot Instructions for Ephemeris MCP
2
2
3
3
## What This Project Does
4
-
AstroMCP is an MCP (Model Context Protocol) server that calculates planetary positions using the Swiss Ephemeris. It provides AI agents with ground-truth astrological data in Tropical Zodiac coordinates.
4
+
Ephemeris MCP is an MCP (Model Context Protocol) server that calculates planetary positions using the Swiss Ephemeris. It provides AI agents with precision astronomical ephemeris data in Tropical Zodiac coordinates.
5
5
6
6
## Architecture
7
7
-`server.py`: FastMCP server exposing `get_planetary_positions` tool
@echo "make format-check - Check code formatting without modifying"
@@ -22,6 +22,8 @@ help:
22
22
@echo "make docker-build - Build the Docker image"
23
23
@echo "make docker-run - Run the Docker container interactively"
24
24
@echo "make docker-happycase - Test the Docker image with a simple query"
25
+
@echo "make docker-happycase-public - Test the public GHCR image with a simple query"
26
+
@echo "make docker-happycase-mcp - Test the MCP server interface (agent-style)"
25
27
@echo "make docker-dev - Full Docker dev workflow (validate, build, test)"
26
28
@echo "make docker-clean - Remove Docker images"
27
29
@echo "make validate-happycase - Test engine locally with a simple query"
@@ -30,6 +32,13 @@ help:
30
32
@echo "make audit - Audit dependencies"
31
33
@echo "make act-ci - Run CI workflow locally with act"
32
34
@echo "make act-release - Run Release workflow locally with act (dry-run)"
35
+
@echo ""
36
+
@echo "PyPI Publishing:"
37
+
@echo "make build - Build distribution packages (wheel + sdist)"
38
+
@echo "make test-pypi-local - Test local build installation"
39
+
@echo "make validate-happycase-pypi - Test PyPI installed version"
40
+
@echo "make publish-test - Publish to TestPyPI (requires API token)"
41
+
@echo "make publish - Publish to PyPI (requires API token)"
33
42
34
43
# --- Development ---
35
44
@@ -39,7 +48,7 @@ lock:
39
48
40
49
sync: lock
41
50
@echo "📦 Syncing dependencies with Python $(PYTHON_VERSION)..."
42
-
uv sync --python $(PYTHON_VERSION)
51
+
uv sync --all-groups --python $(PYTHON_VERSION)
43
52
44
53
install: sync
45
54
@echo "✅ Dependencies installed."
@@ -71,7 +80,7 @@ validate-dev:
71
80
validate-happycase:
72
81
@echo "🧪 Testing engine locally with planetary positions query..."
73
82
@echo "📍 Querying: 2025-12-16T15:28:00Z at New York (40.7128, -74.0060)"
74
-
@uv run python -c "from astro_mcp.engine import calculate_chart; result = calculate_chart('2025-12-16T15:28:00Z', 40.7128, -74.0060); print('✅ Engine working!\n'); print('🌟 BODIES:'); [print(f' {name:18} {data[\"sign\"]:10} {data[\"sign_degrees\"]:6.2f}° ({data[\"motion\"]})') for name, data in result['bodies'].items()]; print('\n🏠 HOUSES:'); [print(f' {name:18} {data[\"sign\"]:10} {data[\"sign_degrees\"]:6.2f}°') for name, data in result['houses'].items()]"
83
+
@uv run python -c "from ephemeris_mcp.engine import calculate_chart; result = calculate_chart('2025-12-16T15:28:00Z', 40.7128, -74.0060); print('✅ Engine working!\n'); print('🌟 BODIES:'); [print(f' {name:18} {data[\"sign\"]:10} {data[\"sign_degrees\"]:6.2f}° ({data[\"motion\"]})') for name, data in result['bodies'].items()]; print('\n🏠 HOUSES:'); [print(f' {name:18} {data[\"sign\"]:10} {data[\"sign_degrees\"]:6.2f}°') for name, data in result['houses'].items()]"
75
84
@echo "\n✅ Happy case test passed!"
76
85
77
86
validate-dev-full: validate-dev
@@ -104,9 +113,21 @@ docker-run:
104
113
docker-happycase:
105
114
@echo "🧪 Testing Docker image with planetary positions query..."
106
115
@echo "📍 Querying: 2025-12-16T15:28:00Z at New York (40.7128, -74.0060)"
107
-
@docker run --rm $(IMAGE_NAME):latest python -c "from astro_mcp.engine import calculate_chart; import json; result = calculate_chart('2025-12-16T15:28:00Z', 40.7128, -74.0060); print('✅ Docker image working!\n'); print('🌟 BODIES:'); [print(f' {name:18} {data[\"sign\"]:10} {data[\"sign_degrees\"]:6.2f}° ({data[\"motion\"]})') for name, data in result['bodies'].items()]; print('\n🏠 HOUSES:'); [print(f' {name:18} {data[\"sign\"]:10} {data[\"sign_degrees\"]:6.2f}°') for name, data in result['houses'].items()]"
116
+
@docker run --rm $(IMAGE_NAME):latest python -c "from ephemeris_mcp.engine import calculate_chart; import json; result = calculate_chart('2025-12-16T15:28:00Z', 40.7128, -74.0060); print('✅ Docker image working!\n'); print('🌟 BODIES:'); [print(f' {name:18} {data[\"sign\"]:10} {data[\"sign_degrees\"]:6.2f}° ({data[\"motion\"]})') for name, data in result['bodies'].items()]; print('\n🏠 HOUSES:'); [print(f' {name:18} {data[\"sign\"]:10} {data[\"sign_degrees\"]:6.2f}°') for name, data in result['houses'].items()]"
108
117
@echo "\n✅ Docker test passed!"
109
118
119
+
docker-happycase-public:
120
+
@echo "🧪 Testing public GHCR image with planetary positions query..."
@echo "📍 Querying: 2025-12-16T15:28:00Z at New York (40.7128, -74.0060)"
124
+
@docker run --rm ghcr.io/scottchronicity/ephemeris-mcp:latest python -c "from ephemeris_mcp.engine import calculate_chart; import json; result = calculate_chart('2025-12-16T15:28:00Z', 40.7128, -74.0060); print('✅ Public image working!\n'); print('🌟 BODIES:'); [print(f' {name:18} {data[\"sign\"]:10} {data[\"sign_degrees\"]:6.2f}° ({data[\"motion\"]})') for name, data in result['bodies'].items()]; print('\n🏠 HOUSES:'); [print(f' {name:18} {data[\"sign\"]:10} {data[\"sign_degrees\"]:6.2f}°') for name, data in result['houses'].items()]"
125
+
@echo "\n✅ Public image test passed!"
126
+
127
+
docker-happycase-mcp:
128
+
@echo "🧪 Testing MCP server interface (agent-style)..."
@echo "📍 Querying: 2025-12-16T15:28:00Z at New York (40.7128, -74.0060)"
195
+
@/tmp/ephemeris-mcp-pypi-test/bin/python -c "from ephemeris_mcp.engine import calculate_chart; result = calculate_chart('2025-12-16T15:28:00Z', 40.7128, -74.0060); print('✅ PyPI version working!\n'); print('🌟 BODIES:'); [print(f' {name:18} {data[\"sign\"]:10} {data[\"sign_degrees\"]:6.2f}° ({data[\"motion\"]})') for name, data in result['bodies'].items()]; print('\n🏠 HOUSES:'); [print(f' {name:18} {data[\"sign\"]:10} {data[\"sign_degrees\"]:6.2f}°') for name, data in result['houses'].items()]"
196
+
@echo "\n✅ PyPI happy case test passed!"
197
+
@rm -rf /tmp/ephemeris-mcp-pypi-test
198
+
199
+
publish-test:
200
+
@echo "🚀 Publishing to TestPyPI..."
201
+
@echo "⚠️ Requires TWINE_PASSWORD env var with TestPyPI token"
202
+
@uv build
203
+
@uv run twine upload --repository testpypi dist/* --username __token__
204
+
205
+
publish:
206
+
@echo "🚀 Publishing to PyPI..."
207
+
@echo "⚠️ Requires TWINE_PASSWORD env var with PyPI token"
208
+
@echo "⚠️ This will publish to production PyPI!"
209
+
@read -p "Are you sure? [y/N] " -n 1 -r;echo;\
210
+
if [[ $$REPLY =~ ^[Yy]$$ ]];then \
211
+
uv build && uv run twine upload dist/* --username __token__;\
0 commit comments