brahe-mcp
The brahe-mcp server provides a comprehensive suite of astrodynamics and space situational awareness tools via the Model Context Protocol (MCP), enabling language models to perform orbital mechanics, satellite data queries, propagation, access analysis, and visualization.
Constants & Time
Retrieve astrodynamics constants (e.g., Earth's radius, gravitational parameter)
Get current time; convert between time systems (UTC, GPS, TAI, TT, UT1) and formats (ISO, MJD, JD, GPS)
Coordinate & Frame Transforms
Convert positions and states between ECEF, geodetic, geocentric, ECI, GCRF, ITRF, EME2000
Convert relative positions to topocentric frames (ENZ, SEZ, AZEL)
Convert RA/Dec to ECI/GCRF and topocentric coordinates with proper motion
Orbital Mechanics
Compute orbital properties (period, mean motion, etc.)
Convert between mean, eccentric, and true anomalies
Convert equinoctial and mean/osculating elements (Brouwer-Lyddane, numerical averaging)
Convert between RTN and ROE relative states
Attitude
Convert between quaternion, Euler axis/angle, and rotation matrix representations
Compose rotations and perform quaternion spherical interpolation
Orbit Propagation
SGP4/SDP4 from TLE data
Two-body Keplerian analytical propagation
High-fidelity numerical integration with configurable force models (gravity, drag, SRP, third-body, relativity)
Propagate directly from GP records fetched from CelesTrak or SpaceTrack
Satellite Catalog & Data
Query CelesTrak for GP records, supplemental GP data, and SATCAT
Query SpaceTrack for GP records, historical GP, SATCAT, conjunction data messages (CDMs), and decay predictions (requires
SPACETRACK_USER/SPACETRACK_PASScredentials)Query GCAT (Jonathan McDowell's catalog) for SATCAT and PSATCAT records with rich filtering
Look up small bodies (asteroids, comets) via JPL SBDB and ephemerides via JPL Horizons
Manage SPICE kernels and query planetary/small-body ephemerides
Ground Stations
List and query ground station locations by provider, geography, and frequency band
Access & Visibility Analysis
Compute satellite access windows to ground locations with configurable constraints (elevation, off-nadir, range, etc.)
Compute access directly from GP records for streamlined workflows
Plotting & Visualization
Orbital element history trends from GP records
Satellite altitude vs. time
Ground tracks on a world map (with optional ground station overlays)
Keplerian orbital element evolution over a propagation arc
Access geometry (polar, elevation, elevation-azimuth views)
Gabbard diagrams (apogee/perigee vs. orbital period)
Interactive 3D trajectory plots (Earth-centered or synodic frame); 3D plots return an inline PNG and save an interactive HTML file to disk
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@brahe-mcp Get the current Two-Line Element set for the ISS"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
brahe-mcp
This project provides a Model Context Protocol (MCP) server that exposes the astrodynamics capabilities of the Brahe library enabling language models to get smarter about astrodynamics and space situational awareness.

Capabilities
Recent additions expose more of brahe's 1.7.0 astrodynamics surface as MCP tools:
Group | Tools | Notes |
Frame transforms |
| Position/state/rotation transforms across GCRF, ITRF, EME2000, GSE, EMR, SER, EMBI, SSBI, lunar (LCI/LFME/LFPA), Mars (MCI/MCMF), the Synodic rotating frame, and generic body frames. |
SPICE & body ephemerides |
| Manage SPICE kernels and query planet/Moon/Sun/barycenter states via SPICE. |
Small bodies |
| Look up asteroids/comets via the JPL Small-Body Database (SBDB) and sample ephemerides generated on demand via JPL Horizons. Both make live JPL network calls. |
3D plots |
| Interactive 3D trajectory plots about Earth or in a synodic (rotating two-body) frame; each returns an inline PNG plus a saved interactive HTML file. |
RA/Dec coordinates |
| Right ascension/declination to inertial (ECI/GCRF) and topocentric (AZEL) frames, plus IAU SOFA proper-motion propagation. Proper motion is in mas/yr; |
Orbital elements |
| Equinoctial elements (with retrograde factor |
Relative motion |
| RTN and quasi-nonsingular ROE conversions between a chief and deputy satellite. |
Attitude |
| Quaternion, Euler axis, Euler angle, and rotation matrix representations, principal-axis rotations, composition, and spherical interpolation. |
Numerical propagation
propagate_numerical supports non-Earth central bodies via the body-specific force model presets (lunar_default, mars_default, cislunar_default), or by setting force_model="central_body" with central_body set to moon, mars, or emb; the bci/bcbf output frames report state relative to that body. (central_body is only consulted for the central_body preset — other presets bake in their own body.) Two optional structured config dicts also replace the previous per-force keyword arguments:
force_config:{gravity, drag, srp, third_body, tides, relativity, frame_transform}integrator:{preset, method, abs_tol, rel_tol, initial_step, max_step, store_accelerations}
Call list_propagation_options() to discover the valid keys and values for both dicts.
Mean and osculating elements
convert_mean_osculating handles a single state using the Brouwer-Lyddane
analytical theory. convert_mean_osculating_batch handles a time series and
additionally supports the numerical windowed-averaging method.
Two things to know about the numerical method:
It is batch-only. The single-state tool rejects it.
With
edge="truncate"(the default), osculating-to-mean returns fewer states than it receives, because the averaging window consumes the edges of the series. Readn_outputanddropped_by_edge_handlingfrom the response rather than assuming the length is preserved.
Numerical mean-to-osculating inverts the averaging by differential correction
and therefore requires a force_config; call list_propagation_options() for
the valid keys. Brouwer-Lyddane is a first-order theory, so mean-to-osculating
followed by osculating-to-mean does not return the input exactly.
Plotting output
Plotting depends on the brahe[plots] extra, which is installed automatically as a dependency of brahe-mcp. The 3D plot tools also write an interactive HTML file to disk; the directory is configurable via the BRAHE_MCP_OUTPUT_DIR environment variable (default <tempdir>/brahe-mcp-plots).
Related MCP server: spacedata
Installation
uv tool install brahe-mcpor
pip install brahe-mcpThen configure your MCP client to use the installed tool:
{
"mcpServers": {
"brahe": {
"command": "brahe-mcp"
}
}
}The MCP configuration location depends on your client. For popular tools you can find it here:
Client | Config Location |
Claude Desktop (macOS) |
|
Claude Desktop (Windows) |
|
Claude Code |
|
Gemini CLI |
|
OpenAI Codex CLI |
|
ChatGPT Desktop does not support local stdio MCP servers — it requires remote HTTPS endpoints
OpenAI Codex CLI
Codex CLI stores MCP configuration in TOML format at ~/.codex/config.toml (or project-scoped .codex/config.toml):
[mcp_servers.brahe]
command = "brahe-mcp"
args = []You can also add it via the CLI:
codex mcp add brahe -- brahe-mcpTo include SpaceTrack credentials:
codex mcp add brahe --env SPACETRACK_USER=your@email.com --env SPACETRACK_PASS=your-password -- brahe-mcpSpaceTrack Configuration
The SpaceTrack tools require a Space-Track.org account. Add your credentials via the env key in the server config:
{
"mcpServers": {
"brahe": {
"command": "brahe-mcp",
"env": {
"SPACETRACK_USER": "your@email.com",
"SPACETRACK_PASS": "your-password"
}
}
}
}
Claude Desktop does not expand shell variables like ${SPACETRACK_USER} — you must put the actual values in the config. Claude Code inherits your shell environment, so you can alternatively set the variables in ~/.zshrc and omit the env block.
Without these variables, the CelesTrak tools will still work normally — only the SpaceTrack tools will return an error prompting you to set the credentials.
Local Setup
To run the server from a local clone (useful for development or testing before installing):
git clone https://github.com/duncaneddy/brahe-mcp.git
cd brahe-mcp
uv sync --group devThen configure your MCP client to launch the server via uv run. Add the following to your MCP settings file:
{
"mcpServers": {
"brahe": {
"command": "uv",
"args": ["run", "--directory", "/path/to/brahe-mcp", "brahe-mcp"]
}
}
}Replace /path/to/brahe-mcp with the absolute path to your local clone.
Development
uv sync --group dev
uv run pytest tests/Available Tools
51 toolscompute_accessA
Compute access windows (visibility periods) between a satellite and a ground location.
Finds time intervals when a satellite is visible from a location, subject to geometric constraints (elevation, off-nadir, look direction, etc.).
Use list_access_options() to see constraint types, satellite input formats, and configuration options.
Args: location: Ground location dict with lon, lat, and optional altitude_m/name. satellite: Satellite spec dict. Must include "source" key ("tle", "gp_record", or "state"). search_start: Start of search window (ISO epoch string). search_end: End of search window (ISO epoch string). constraints: List of constraint spec dicts. Each needs a "type" key. constraint_logic: How to combine constraints: "all" (AND) or "any" (OR). min_elevation_deg: Convenience shortcut to add an elevation constraint. property_computers: List of property computer specs (e.g. [{"type": "range"}]). config: Optional AccessSearchConfig overrides dict.
Inputs: location (required), satellite (required), search_end (required), search_start (required), +5 more.
compute_access_from_gpA
Compute access windows from a GP record (from celestrak/spacetrack tools).
Convenience wrapper that creates a satellite spec from a GP record dict and delegates to compute_access(). This is the most common workflow: fetch GP data with get_celestrak_gp() or query_spacetrack_gp(), then compute accesses.
Args: gp_record: GP record dict from get_celestrak_gp or query_spacetrack_gp tools. location: Ground location dict with lon, lat, and optional altitude_m/name. search_start: Start of search window (ISO epoch string). search_end: End of search window (ISO epoch string). propagator_type: Propagator to use: "sgp4" (default), "keplerian", or "numerical". constraints: List of constraint spec dicts. Each needs a "type" key. constraint_logic: How to combine constraints: "all" (AND) or "any" (OR). min_elevation_deg: Convenience shortcut to add an elevation constraint. force_model: Force model preset for numerical propagation (e.g. "two_body", "leo_default"). spacecraft_params: [mass_kg, drag_area_m2, Cd, srp_area_m2, Cr] for numerical propagation. property_computers: List of property computer specs (e.g. [{"type": "range"}]). config: Optional AccessSearchConfig overrides dict.
Inputs: location (required), gp_record (required), search_end (required), search_start (required), +8 more.
compute_orbital_propertyA
Compute an orbital property using brahe astrodynamics functions.
Use list_orbital_computations() to see all available computations and their parameters.
Args: computation: Name of the computation (case-insensitive), e.g. "orbital_period". a: Semi-major axis in meters. e: Eccentricity (dimensionless). n: Mean motion (deg/s or rad/s depending on angle_format). period: Orbital period in seconds. state_eci: ECI state vector as comma-separated string "x,y,z,vx,vy,vz" (m, m/s). gm: Gravitational parameter (m^3/s^2). Defaults to Earth if omitted. r_body: Body radius (m). Defaults to Earth equatorial radius if omitted. angle_format: Angle unit - "degrees" (default) or "radians".
Inputs: computation (required), a, e, n, +5 more.
convert_anomalyA
Convert between orbital anomaly types (mean, eccentric, true).
Use list_orbital_computations() to see all available conversions.
Args: conversion: Conversion name (case-insensitive), e.g. "eccentric_to_mean". anomaly: Input anomaly value in the specified angle_format. e: Orbital eccentricity (dimensionless). angle_format: Angle unit - "degrees" (default) or "radians".
Inputs: e (required), anomaly (required), conversion (required), angle_format.
convert_epochA
Convert an epoch between time representations and time systems.
Supports ISO strings, MJD, JD, GPS seconds, GPS nanoseconds, and GPS date (week,seconds). Time systems: UTC, GPS, TAI, TT, UT1.
Args: value: The epoch value as a string. For ISO: '2024-01-01T12:00:00Z'. For MJD/JD/GPS: numeric string. For gps_date: 'week,seconds'. input_format: Input format - one of: iso, mjd, jd, gps_seconds, gps_nanoseconds, gps_date. input_time_system: Time system of input (ignored for iso and gps_* formats). One of: UTC, GPS, TAI, TT, UT1. output_format: Output format - one of: iso, iso_precise, string, mjd, jd, gps_seconds, gps_nanoseconds, gps_date. output_time_system: Time system for output. Empty string means same as input (or GPS for gps_* inputs).
Inputs: value (required), input_format, output_format, input_time_system, +1 more.
convert_positionA
Convert a 3-element position vector between coordinate frames.
Supported conversions: GEODETIC<->ECEF, GEOCENTRIC<->ECEF, GEODETIC<->GEOCENTRIC, ECI<->ECEF (requires epoch), GCRF<->ITRF (requires epoch), GCRF<->EME2000.
Args: vector: 3-element position vector [x, y, z] or [lon, lat, alt] etc. from_frame: Source frame (ECEF, GEODETIC, GEOCENTRIC, ECI, GCRF, ITRF, EME2000). to_frame: Target frame (same set). angle_format: "degrees" (default) or "radians" for geodetic/geocentric angles. epoch: ISO epoch string, required for ECI<->ECEF and GCRF<->ITRF.
Inputs: vector (required), to_frame (required), from_frame (required), epoch, +1 more.
convert_relative_positionA
Convert a position relative to a ground station between ECEF and topocentric frames.
Supported conversions: ECEF<->ENZ, ECEF<->SEZ, ENZ->AZEL, SEZ->AZEL.
Args: station: 3-element station position (geodetic [lon,lat,alt] or ECEF [x,y,z]). vector: 3-element position to convert. from_frame: Source frame (ECEF, ENZ, SEZ). to_frame: Target frame (ECEF, ENZ, SEZ, AZEL). station_type: How station is specified: "geodetic" (default), "geocentric", or "ecef". angle_format: "degrees" (default) or "radians" for AZEL output and station angles.
Inputs: vector (required), station (required), to_frame (required), from_frame (required), +2 more.
convert_stateA
Convert a 6-element state vector between coordinate frames.
Supported conversions: KOE<->ECI, ECI<->ECEF (requires epoch), GCRF<->ITRF (requires epoch), GCRF<->EME2000.
Args: vector: 6-element state vector [x,y,z,vx,vy,vz] or [a,e,i,RAAN,omega,M]. from_frame: Source frame (ECI, KOE, ECEF, GCRF, ITRF, EME2000). to_frame: Target frame (same set). angle_format: "degrees" (default) or "radians" for KOE angles. epoch: ISO epoch string, required for ECI<->ECEF and GCRF<->ITRF.
Inputs: vector (required), to_frame (required), from_frame (required), epoch, +1 more.
current_timeA
Return the current time as an epoch.
Args: output_format: Output format - one of: iso, iso_precise, string, mjd, jd, gps_seconds, gps_nanoseconds, gps_date. output_time_system: Time system for output. One of: UTC, GPS, TAI, TT, UT1.
Inputs: output_format, output_time_system.
get_celestrak_gpA
Look up GP (General Perturbations) ephemeris records from CelesTrak.
Provide exactly one identifier to query by. Use list_celestrak_options() to see available groups and other options.
Args: catnr: NORAD catalog number (e.g. 25544 for ISS). group: Satellite group name (e.g. "stations", "active", "starlink"). name: Satellite name substring search. intdes: International designator (e.g. "1998-067A"). limit: Maximum number of records to return.
Inputs: name, catnr, group, limit, +1 more.
get_celestrak_satcatA
Look up satellite catalog (SATCAT) records from CelesTrak.
At least one filter parameter must be provided.
Args: catnr: NORAD catalog number. active: Filter to active objects only. payloads: Filter to payloads only. on_orbit: Filter to on-orbit objects only. limit: Maximum number of records to return.
Inputs: catnr, limit, active, on_orbit, +1 more.
get_celestrak_sup_gpA
Look up supplemental GP records from CelesTrak by source.
Supplemental GP data provides operator-provided ephemerides that may be more accurate than standard GP data for certain constellations.
Args: source: Supplemental source name (case-insensitive), e.g. "starlink", "spacex". limit: Maximum number of records to return.
Inputs: source (required), limit.
get_constantA
Get a single brahe constant by name (case-insensitive).
Args: name: The constant name, e.g. "R_EARTH" or "gm_earth".
Inputs: name (required).
get_gcat_psatcatA
Look up GCAT PSATCAT (payload satellite catalog) records by identifier.
Provide exactly one of jcat or name to query by. The PSATCAT contains mission-level data including program, result, disposal orbit, and UN registration information.
Use list_gcat_options() to see field descriptions and enumeration code meanings (category, class_, result, etc.).
Args: jcat: JCAT identifier (e.g. "S00049"). name: Name substring search (case-insensitive). limit: Maximum number of records to return (default 100).
Inputs: jcat, name, limit.
get_gcat_satcatA
Look up GCAT SATCAT records by identifier.
Provide exactly one of jcat, satcat_num, or name to query by. The GCAT SATCAT contains ~60k records of orbital objects from Jonathan McDowell's General Catalog.
Use list_gcat_options() to see field descriptions and enumeration code meanings (status, object_type, op_orbit, etc.).
Args: jcat: JCAT identifier (e.g. "S00001"). satcat_num: SATCAT/NORAD catalog number as string (e.g. "00001"). name: Name substring search (case-insensitive). limit: Maximum number of records to return (default 100).
Inputs: jcat, name, limit, satcat_num.
get_groundstationsA
Load groundstation locations by provider or all providers.
Args: provider: Provider name (case-insensitive). Use list_groundstation_options() to see available providers. If omitted, loads all stations. limit: Maximum number of stations to return.
Inputs: limit, provider.
get_spacetrack_cdmA
Query conjunction data messages (CDM) from SpaceTrack.
At least one filter parameter must be provided. Returns raw CDM records as dicts. Requires SPACETRACK_USER and SPACETRACK_PASS environment variables.
Args: norad_cat_id: NORAD catalog number for SAT_1_ID or SAT_2_ID. epoch_range: ISO datetime range string "start--end" to filter by TCA (e.g. "2024-01-01--2024-01-31"). limit: Maximum number of records to return.
Inputs: limit, epoch_range, norad_cat_id.
get_spacetrack_decayA
Query decay predictions from SpaceTrack.
At least one filter parameter must be provided. Returns raw decay records as dicts. Requires SPACETRACK_USER and SPACETRACK_PASS environment variables.
Args: norad_cat_id: NORAD catalog number. epoch_range: ISO datetime range string "start--end" to filter by MSG_EPOCH (e.g. "2024-01-01--2024-01-31"). limit: Maximum number of records to return.
Inputs: limit, epoch_range, norad_cat_id.
get_spacetrack_gpA
Query GP (General Perturbations) records from SpaceTrack.
At least one filter parameter must be provided. Requires SPACETRACK_USER and SPACETRACK_PASS environment variables.
Args: norad_cat_id: NORAD catalog number (e.g. 25544 for ISS). name: Satellite name substring search (case-insensitive). epoch_range: ISO datetime range string "start--end" to filter by EPOCH (e.g. "2024-01-01--2024-01-31"). limit: Maximum number of records to return.
Inputs: name, limit, epoch_range, norad_cat_id.
get_spacetrack_gp_historyA
Query historical GP records from SpaceTrack.
Unlike get_spacetrack_gp which returns only the latest element set, this tool returns all historical element sets for matching objects. Useful for tracking orbital evolution over time.
At least one filter parameter must be provided. An epoch_range is strongly recommended to avoid very large result sets. For queries spanning more than a couple of days, use the decimation parameter to thin results (e.g. '1d' for ~1 record per day).
Requires SPACETRACK_USER and SPACETRACK_PASS environment variables.
Args: norad_cat_id: NORAD catalog number (e.g. 25544 for ISS). name: Satellite name substring search (case-insensitive). epoch_range: ISO datetime range string "start--end" to filter by EPOCH (e.g. "2024-01-01--2024-01-31"). limit: Maximum number of records to return. decimation: Thin results to ~1 record per interval. Accepts a number followed by a unit: s (seconds), m (minutes), h (hours), d (days), w (weeks). Examples: "1d", "12h", "1w".
Inputs: name, limit, decimation, epoch_range, +1 more.
get_spacetrack_satcatB
Query satellite catalog (SATCAT) records from SpaceTrack.
At least one filter parameter must be provided. Requires SPACETRACK_USER and SPACETRACK_PASS environment variables.
Args: norad_cat_id: NORAD catalog number. name: Satellite name substring search (case-insensitive). country: Country code filter (e.g. "US", "CIS"). object_type: Object type filter (e.g. "PAYLOAD", "ROCKET BODY", "DEBRIS"). limit: Maximum number of records to return.
Inputs: name, limit, country, object_type, +1 more.
list_access_optionsA
List available access computation options, constraint types, and input formats.
Use this to discover how to call compute_access() and compute_access_from_gp().
Inputs: no named parameters.
list_celestrak_optionsA
List available CelesTrak lookup methods, groups, supplemental sources, and filter options.
Returns discovery information for all CelesTrak tools including valid group names, supplemental GP sources, SATCAT query options, filter operators, and GP record field names.
Inputs: no named parameters.
list_constantsA
List all available brahe astrodynamics constants, organized by category.
Inputs: no named parameters. Returns: object
list_coordinate_systemsA
List all supported coordinate frames, their components, and valid conversions.
Returns groups for position frames, state frames, and relative frames, along with allowed conversion pairs for each tool.
Inputs: no named parameters.
list_gcat_optionsA
List available GCAT catalog types, field descriptions, enumeration values, and filter options.
Returns comprehensive discovery information for all GCAT tools including catalog types, detailed field descriptions with enumeration code meanings, and available filters. Call this first to understand what fields and codes mean before querying GCAT data.
Inputs: no named parameters.
list_groundstation_optionsA
List available groundstation providers and query options.
Returns discovery information for groundstation tools including available providers and field descriptions.
Inputs: no named parameters.
list_orbital_computationsA
List all available orbital property computations and anomaly conversions.
Returns names, descriptions, and parameter requirements for each computation.
Inputs: no named parameters.
list_plotting_optionsA
List available plotting tools, plot types, and their parameters.
Use this to discover which plotting tool to use and what inputs are required.
Inputs: no named parameters.
list_propagation_optionsA
List available propagator types, output frames, force model presets, and their options.
Use this to discover which propagation tool to use and what parameters are available.
Inputs: no named parameters.
list_spacetrack_optionsA
List available SpaceTrack tools, request classes, filter fields, and operators.
Returns discovery information for all SpaceTrack tools. No authentication required for this tool — it returns static reference data.
Inputs: no named parameters.
list_time_systemsA
List all supported time systems for epoch conversion.
Inputs: no named parameters.
plot_access_geometryA
Plot access geometry between a satellite and ground location.
Computes access windows and plots the satellite pass geometry.
Args: location: Ground location dict with lon, lat, optional altitude_m/name. satellite: Satellite spec dict (same format as compute_access). search_start: Start of search window (ISO epoch string). search_end: End of search window (ISO epoch string). plot_type: "polar" (default), "elevation", or "elevation_azimuth". constraints: List of constraint spec dicts. constraint_logic: "all" (AND) or "any" (OR). min_elevation_deg: Convenience shortcut for elevation constraint.
Inputs: location (required), satellite (required), search_end (required), search_start (required), +4 more. Returns: result
plot_access_geometry_from_gpA
Plot access geometry from a GP record.
Convenience wrapper that creates a satellite spec from a GP record dict and delegates to plot_access_geometry().
Args: gp_record: GP record dict from celestrak/spacetrack tools. location: Ground location dict with lon, lat, optional altitude_m/name. search_start: Start of search window (ISO epoch string). search_end: End of search window (ISO epoch string). propagator_type: "sgp4" (default) or "keplerian". plot_type: "polar" (default), "elevation", or "elevation_azimuth". constraints: List of constraint spec dicts. constraint_logic: "all" (AND) or "any" (OR). min_elevation_deg: Convenience shortcut for elevation constraint.
Inputs: location (required), gp_record (required), search_end (required), search_start (required), +5 more. Returns: result
plot_altitudeA
Plot satellite altitude (above WGS84 ellipsoid) versus time.
Propagates the orbit and converts each ECEF position to geodetic altitude. Useful for visualizing orbital decay, altitude variations due to eccentricity, and maneuver effects.
Args: satellite: Satellite spec dict (same format as compute_access). Must include "source" key ("tle", "gp_record", or "state"). start_epoch: Start epoch (ISO string). end_epoch: End epoch (ISO string). step_seconds: Propagation step size in seconds (default 60). title: Optional plot title.
Inputs: end_epoch (required), satellite (required), start_epoch (required), title, +1 more. Returns: result
plot_altitude_from_gpA
Plot satellite altitude versus time from a GP record.
Convenience wrapper that creates a satellite spec from a GP record dict and delegates to plot_altitude().
Args: gp_record: GP record dict from celestrak/spacetrack tools. start_epoch: Start epoch (ISO string). end_epoch: End epoch (ISO string). propagator_type: "sgp4" (default) or "keplerian". step_seconds: Propagation step size in seconds (default 60). title: Optional plot title.
Inputs: end_epoch (required), gp_record (required), start_epoch (required), title, +2 more. Returns: result
plot_gabbard_diagramA
Plot a Gabbard diagram (apogee/perigee altitude vs orbital period).
Useful for visualizing debris clouds or constellation distributions. Each GP record becomes a point on the diagram.
Args: gp_records: List of GP record dicts from celestrak/spacetrack tools. altitude_units: Units for altitude axis ("km" or "m"). period_units: Units for period axis ("min", "hr", or "s"). title: Optional plot title.
Inputs: gp_records (required), title, period_units, altitude_units. Returns: result
plot_gp_history_elementsA
Plot orbital element trends from GP history records.
Visualizes how orbital elements change over time from a series of GP records. Provide either pre-fetched gp_records or a norad_cat_id to auto-fetch history from SpaceTrack.
Args: gp_records: List of GP record dicts (from spacetrack/celestrak tools). norad_cat_id: NORAD catalog ID to fetch GP history from SpaceTrack. elements: Element names to plot. None plots all 6 classical elements. Valid: semimajor_axis, eccentricity, inclination, ra_of_asc_node, arg_of_pericenter, mean_anomaly, mean_motion, bstar, period, apoapsis, periapsis. title: Optional plot title.
Inputs: title, elements, gp_records, norad_cat_id. Returns: result
plot_ground_trackC
Plot satellite ground track on a world map.
Propagates the satellite and plots its sub-satellite point trace.
Args: satellite: Satellite spec dict (same format as compute_access). Must include "source" key ("tle", "gp_record", or "state"). start_epoch: Start of ground track (ISO epoch string). end_epoch: End of ground track (ISO epoch string). step_seconds: Propagation step size in seconds (default 60). ground_stations: Optional list of location dicts to plot on map. show_grid: Show latitude/longitude grid lines. show_legend: Show plot legend.
Inputs: end_epoch (required), satellite (required), start_epoch (required), show_grid, +3 more. Returns: result
plot_ground_track_from_gpA
Plot satellite ground track from a GP record.
Convenience wrapper that creates a satellite spec from a GP record dict and delegates to plot_ground_track().
Args: gp_record: GP record dict from celestrak/spacetrack tools. start_epoch: Start of ground track (ISO epoch string). end_epoch: End of ground track (ISO epoch string). propagator_type: "sgp4" (default) or "keplerian". step_seconds: Propagation step size in seconds (default 60). ground_stations: Optional list of location dicts to plot on map. show_grid: Show latitude/longitude grid lines. show_legend: Show plot legend.
Inputs: end_epoch (required), gp_record (required), start_epoch (required), show_grid, +4 more. Returns: result
plot_orbit_elementsB
Plot Keplerian orbital element evolution over a propagation arc.
Uses brahe's plot_keplerian_trajectory to show how each of the 6 classical orbital elements changes over time.
Args: satellite: Satellite spec dict (same format as compute_access). start_epoch: Start epoch (ISO string). end_epoch: End epoch (ISO string). step_seconds: Propagation step size in seconds (default 60).
Inputs: end_epoch (required), satellite (required), start_epoch (required), step_seconds. Returns: result
plot_orbit_elements_from_gpC
Plot Keplerian orbital element evolution from a GP record.
Args: gp_record: GP record dict from celestrak/spacetrack tools. start_epoch: Start epoch (ISO string). end_epoch: End epoch (ISO string). propagator_type: "sgp4" (default) or "keplerian". step_seconds: Propagation step size in seconds (default 60).
Inputs: end_epoch (required), gp_record (required), start_epoch (required), step_seconds, +1 more. Returns: result
propagate_from_gp_recordA
Propagate from a GP record dict (from celestrak/spacetrack query tools).
Bridges GP data queries directly into propagation. For SGP4, uses the OMM elements directly (avoiding TLE precision loss). For Keplerian/Numerical, converts OMM elements to an ECI state.
Args: gp_record: Dict from get_celestrak_gp or query_spacetrack_gp tools. propagator_type: "sgp4" (default), "keplerian", or "numerical". target_epoch: Single target epoch (ISO string). start_epoch: Range start epoch (ISO string). end_epoch: Range end epoch (ISO string). step_seconds: Step size in seconds for range propagation (default 60). output_frame: Output coordinate frame (eci, ecef, gcrf, itrf, eme2000, koe_osc, koe_mean). angle_format: Angle format for KOE output ("degrees" or "radians"). force_model: Force model preset for numerical propagation (default "default"). spacecraft_params: [mass_kg, drag_area_m2, Cd, srp_area_m2, Cr] for numerical propagation. gravity_degree: Override gravity degree (numerical only). gravity_order: Override gravity order (numerical only). drag_model: Override drag model (numerical only). enable_srp: Override SRP toggle (numerical only). enable_third_body: Override third-body toggle (numerical only). enable_relativity: Override relativity toggle (numerical only).
Inputs: gp_record (required), end_epoch, drag_model, enable_srp, +12 more.
propagate_keplerianA
Propagate a satellite orbit using two-body (Keplerian) analytical dynamics.
Initialize with either an ECI Cartesian state vector or Keplerian elements. Provide either target_epoch for a single point, or start_epoch + end_epoch for a range.
Args: epoch: Initial epoch (ISO string). state_eci: ECI Cartesian state [x,y,z,vx,vy,vz] in meters and m/s. elements_koe: Keplerian elements [a,e,i,RAAN,omega,M] (a in meters, angles in input_angle_format). input_angle_format: Angle format for input KOE elements ("degrees" or "radians"). target_epoch: Single target epoch (ISO string). start_epoch: Range start epoch (ISO string). end_epoch: Range end epoch (ISO string). step_seconds: Step size in seconds for range propagation (default 60). output_frame: Output coordinate frame (eci, ecef, gcrf, itrf, eme2000, koe_osc, koe_mean). angle_format: Angle format for KOE output ("degrees" or "radians").
Inputs: epoch (required), end_epoch, state_eci, start_epoch, +6 more.
propagate_numericalA
Propagate a satellite orbit using high-fidelity numerical integration.
Uses configurable force models: gravity, atmospheric drag, solar radiation pressure, third-body perturbations, and relativistic corrections.
Use list_propagation_options() to see available force model presets and overrides.
Args: epoch: Initial epoch (ISO string). state_eci: ECI Cartesian state [x,y,z,vx,vy,vz] in meters and m/s. target_epoch: Single target epoch (ISO string). start_epoch: Range start epoch (ISO string). end_epoch: Range end epoch (ISO string). step_seconds: Step size in seconds for range propagation (default 60). output_frame: Output coordinate frame (eci, ecef, gcrf, itrf, eme2000, koe_osc, koe_mean). angle_format: Angle format for KOE output ("degrees" or "radians"). force_model: Force model preset name (default "default"). spacecraft_params: [mass_kg, drag_area_m2, Cd, srp_area_m2, Cr]. Required for most presets. gravity_degree: Override gravity spherical harmonic degree. gravity_order: Override gravity spherical harmonic order. drag_model: Override drag model ("harris_priester", "nrlmsise00", "none"). enable_srp: Override solar radiation pressure toggle. enable_third_body: Override third-body perturbations toggle. enable_relativity: Override relativistic corrections toggle.
Inputs: epoch (required), state_eci (required), end_epoch, drag_model, +12 more.
propagate_sgp4A
Propagate a satellite orbit using the SGP4/SDP4 model from TLE data.
Provide either target_epoch for a single point, or start_epoch + end_epoch for a range.
Args: tle_line1: TLE line 1. tle_line2: TLE line 2. target_epoch: Single target epoch (ISO string, e.g. "2024-01-01T12:00:00Z"). start_epoch: Range start epoch (ISO string). end_epoch: Range end epoch (ISO string). step_seconds: Step size in seconds for range propagation (default 60). output_frame: Output coordinate frame (eci, ecef, gcrf, itrf, eme2000, koe_osc, koe_mean). angle_format: Angle format for KOE output ("degrees" or "radians").
Inputs: tle_line1 (required), tle_line2 (required), end_epoch, start_epoch, +4 more.
query_celestrakA
Build and execute an advanced CelesTrak query with filtering and sorting.
This tool provides full access to the CelesTrak query builder, including client-side filtering and ordering that the simpler tools don't expose.
Args: query_type: One of "gp", "sup_gp", or "satcat" (case-insensitive). group: Satellite group name (GP queries). name: Satellite name search (GP queries). catnr: NORAD catalog number (GP/SATCAT queries). intdes: International designator (GP queries). source: Supplemental source name (sup_gp queries). active: Filter to active objects (SATCAT queries). payloads: Filter to payloads only (SATCAT queries). on_orbit: Filter to on-orbit objects (SATCAT queries). filters: List of filter dicts with "field" and "value" keys, e.g. [{"field": "INCLINATION", "value": ">50"}]. order_by: Field name to sort results by. order_ascending: Sort ascending (True) or descending (False). limit: Maximum number of records to return.
Inputs: query_type (required), name, catnr, group, +9 more.
query_gcat_psatcatA
Query GCAT PSATCAT with advanced chainable filters.
At least one filter parameter must be provided (active_only=True counts). Filters are applied sequentially to narrow results. Use list_gcat_options() for full enumeration code descriptions.
Args: name: Name substring search (case-insensitive). category: Mission category code — COM=Communications, IMG=Imaging, NAV=Navigation, SCI=Science, SIG=Signals intelligence, MET=Meteorology, TECH=Technology demo. Compound codes like "COM/MET" also exist. Use list_gcat_options() for full list. object_class: Object class code — A=Astronomy/deep space, B=Biological, C=Communications/utility, D=Defense/military. result_code: Mission result code — S=Successful, F=Failed, U=Unknown, N=Not yet determined. active_only: Filter to active payloads only. limit: Maximum number of records to return (default 100).
Inputs: name, limit, category, active_only, +2 more.
query_gcat_satcatA
Query GCAT SATCAT with advanced chainable filters.
At least one filter parameter must be provided. Filters are applied sequentially to narrow results. Use list_gcat_options() to see valid enumeration codes for object_type, status, etc.
Args: name: Name substring search (case-insensitive). object_type: Object type prefix — P=Payload, R1-R4=Rocket stages, D=Debris, C=Craft. Use list_gcat_options() for full codes. owner: Owner/operator organization code (e.g. "NASA", "SpX"). state: State/country code (e.g. "US", "CN", "JP", "SU"). status: Orbital status code — O=In orbit, R=Reentered, D=Deorbited, E=Escaped, C=Non-functional. Use list_gcat_options() for full codes. perigee_min: Minimum perigee altitude in km. perigee_max: Maximum perigee altitude in km. apogee_min: Minimum apogee altitude in km. apogee_max: Maximum apogee altitude in km. inc_min: Minimum inclination in degrees. inc_max: Maximum inclination in degrees. limit: Maximum number of records to return (default 100).
Inputs: name, limit, owner, state, +8 more.
query_groundstationsA
Query groundstations with geographic and attribute filters.
At least one filter parameter must be provided. All filters are combined (AND logic).
Args: provider: Provider name (case-insensitive). name: Station name substring search (case-insensitive). lat_min: Minimum latitude in degrees. lat_max: Maximum latitude in degrees. lon_min: Minimum longitude in degrees. lon_max: Maximum longitude in degrees. frequency_band: Required frequency band (e.g. "S", "X", "Ka"). limit: Maximum number of stations to return.
Inputs: name, limit, lat_max, lat_min, +4 more.
query_spacetrackA
Build and execute an advanced SpaceTrack query with full control.
Provides direct access to the SpaceTrack query builder with arbitrary filters, sorting, and pagination. Requires SPACETRACK_USER and SPACETRACK_PASS environment variables.
Args: request_class: One of "gp", "gp_history", "satcat", "cdm_public", "decay" (case-insensitive). filters: List of filter dicts with "field" and "value" keys, e.g. [{"field": "NORAD_CAT_ID", "value": "25544"}]. order_by: Field name to sort results by. order_ascending: Sort ascending (True) or descending (False). limit: Maximum number of records to return. offset: Number of records to skip (requires limit).
Inputs: request_class (required), limit, offset, filters, +2 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 51 tools
Most tools have clearly distinct purposes, with detailed descriptions. Minor ambiguity exists between convenience wrappers (e.g., compute_access vs compute_access_from_gp) that could be merged, but overall an agent can distinguish them.
Uses a consistent verb_noun pattern across most tools (get_, list_, compute_, plot_, propagate_). Minor deviations like propagate_from_gp_record (longer) and varying verb prefixes are acceptable but not perfectly uniform.
51 tools is high but justified by the broad domain (propagation, access, catalog queries, plotting, conversions). Some convenience wrappers could be consolidated, but the count is borderline appropriate for such a comprehensive astrodynamics server.
Covers a wide range of astrodynamics tasks: data retrieval, propagation, access, plotting, conversions, constants. Missing minor features like orbit determination, but the surface is very comprehensive for its intended domain.
Maintenance
Related MCP Connectors
Flight and sky conditions for agents, from METAR/TAF and airports to aurora and satellite passes.
Live space data for AI agents - rocket launches, ISS passes, launch news. Free, no auth.
Astronomical logical calculator for AI clients.
An MCP server for Perigee, the open-source 3D viewer of the artificial objects orbiting the Earth, the Moon and Mars and of the spacecraft crossing the solar system. It lets an AI assistant (a teaching assistant, for example) answer questions such as “how far is Mars from the Earth on 1 December 2026?”, “where is the ISS now?” or “what is Lucy's mission?”, and hand the student a live 3D view, with how each number was obtained, from which data, how fresh and how accurate.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables satellite orbital mechanics calculations including visibility predictions, access window analysis, and TLE generation from natural language descriptions. Supports 200+ world cities and multiple orbit types (LEO, MEO, GEO, SSO, Molniya, Polar).-
- AlicenseNot gradedqualityDmaintenanceAggregated public space data — satellite orbits, catalogs and launches — as a single AI-friendly CLI.2MIT
- AlicenseNot gradedqualityDmaintenanceConnects LLM agents to live and simulated satellite telemetry, NOAA space weather data, and space debris orbital conjunction analysis.MIT
- AlicenseNot gradedqualityCmaintenanceProvides satellite tracking data using Two-Line Element sets from a free public API. Enables querying satellite orbits and positions through natural language or direct tool calls.285 npmMIT