Skip to main content
Glama

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.

demo

Capabilities

Recent additions expose more of brahe's 1.7.0 astrodynamics surface as MCP tools:

Group

Tools

Notes

Frame transforms

list_frame_options, transform_frame

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

list_ephemeris_options, list_spice_kernels, load_spice_kernel, load_common_spice_kernels, unload_spice_kernel, get_body_state

Manage SPICE kernels and query planet/Moon/Sun/barycenter states via SPICE.

Small bodies

list_smallbody_options, lookup_small_body, get_small_body_ephemeris

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

plot_trajectory_3d, plot_synodic_3d

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

list_radec_options, convert_radec, apply_proper_motion

Right ascension/declination to inertial (ECI/GCRF) and topocentric (AZEL) frames, plus IAU SOFA proper-motion propagation. Proper motion is in mas/yr; pm_ra is the cos(dec)-weighted catalog convention.

Orbital elements

convert_equinoctial, convert_mean_osculating, convert_mean_osculating_batch

Equinoctial elements (with retrograde factor fr) and mean/osculating conversion via Brouwer-Lyddane or numerical windowed averaging.

Relative motion

list_relative_motion_options, convert_rtn_state, convert_roe_state, compute_rtn_rotation

RTN and quasi-nonsingular ROE conversions between a chief and deputy satellite.

Attitude

list_attitude_options, convert_attitude, axis_rotation_matrix, compose_rotations, quaternion_slerp

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. Read n_output and dropped_by_edge_handling from 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-mcp

or

pip install brahe-mcp

Then 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)

~/Library/Application Support/Claude/claude_desktop_config.json

Claude Desktop (Windows)

%APPDATA%\Claude\claude_desktop_config.json

Claude Code

.claude/settings.json (project-level or global)

Gemini CLI

~/.gemini/settings.json

OpenAI Codex CLI

~/.codex/config.toml (see below)

NOTE


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-mcp

To include SpaceTrack credentials:

codex mcp add brahe --env SPACETRACK_USER=your@email.com --env SPACETRACK_PASS=your-password -- brahe-mcp

SpaceTrack 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"
      }
    }
  }
}
NOTE


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 dev

Then 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 tools
compute_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

    A3.6/5.0

    Scored across 51 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count3/5

    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.

    Completeness4/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables 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).
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      Connects LLM agents to live and simulated satellite telemetry, NOAA space weather data, and space debris orbital conjunction analysis.
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Provides 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 npm
      MIT