Most orbital tooling assumes you already have a Two-Line Element in hand. The useful move here is the other direction: describe the orbit you are designing, get elements generated, and see passes over a named city in the same conversation — with lighting conditions attached, which is what actually decides whether a pass is usable.
A Python MCP server for orbital mechanics. It converts orbital descriptions into Two-Line Elements, computes access windows between a satellite and a ground location, and reports ground and satellite lighting — civil, nautical and astronomical twilight — for each pass.
- Access windows — `calculate_access_windows`, `calculate_access_windows_by_city`, and `calculate_bulk_access_windows` for many satellites and locations from CSV
- Orbits from text — `parse_orbital_elements` reads a phrase like "satellite at 700km in SSO", and `calculate_access_windows_from_orbital_elements` and `calculate_access_windows_from_orbital_elements_by_city` go straight from that text to passes
- Reference lookups — `search_cities` against a built-in database of 200+ cities, `validate_tle`, and `get_orbit_types`
- Support for 6 orbit types: LEO, MEO, GEO, SSO, Molniya and Polar
- Positions computed with Skyfield
Docker is the documented path — `make docker-build`, then run the image with `-i` from your client config. Locally it needs Python and the dependencies installed by `make install`, and runs as `python -m src.mcp_server`. The server speaks JSON-RPC over stdio, so the client runs on the same machine.
One command — docker run --rm -i satellite-mcp-server:latest
