Open projects and tools

Open astronomy tools

A read-only set of 46 astronomy tools for AI agents and scripts, with a benchmark for how well language models use them. They are clients of public services and offline calculators, and need no CASPER account.

Available now These tools and the benchmark are in use today: every registered CASPER member can use the tools from CASPER, with no project access needed. The open package (a public repository, a Python package and an archive record) is released separately, and this page will link to it as soon as it is public.

What they are

The tools cover the everyday needs of an astronomer who asks an AI assistant for help: converting positions and times, moving a star to another epoch, working with units, magnitudes and fluxes, cosmology and extinction, planning observations, searching the literature, and querying public archives and virtual observatory services. Every tool is read-only.

They are designed to be open, documented, citable and measured. The set is meant to be usable as a Python library, as a command line program and as a Model Context Protocol server, with any language model. Every tool returns units, assumptions or the service and query that produced the result, so that an answer can be checked.

Browse the 46 tools

46 tools

Offline calculators (17)

Run on your own machine, no network: coordinates, time, units, cosmology, extinction, spectral lines and observing planning.

  • astro_angular_separation

    Angular separation (deg, arcmin, arcsec) and position angle (from north through east) between two points, plus the east/north offset in arcseconds.

    Runs offline · read-only
  • astro_barycentric_correction

    Light-travel-time (to BJD_TDB or HJD_TDB) and radial-velocity correction (km/s, to add to the observed velocity) for a target at an observatory, using astropy's built-in ephemeris (no download).

    Runs offline · read-only
  • astro_best_nights

    Best nights to observe a field over a date range (up to 366 nights): per night the dark hours, hours the target is above a minimum altitude in the dark with the Moon far enough or down, Moon illumination; returns the top nights.

    Runs offline · read-only
  • astro_convert_coordinates

    Convert a position between ICRS, FK5 (J2000), FK4 (B1950), Galactic, ecliptic (J2000) and supergalactic, and between sexagesimal and degrees. A string right ascension is HOURS ('18h36m56.3s', '18:36:56.3'); numbers are degrees. Returns the target frame plus ICRS, Galactic and ecliptic for reference.

    Runs offline · read-only
  • astro_convert_time

    Convert times between UTC, TAI, TT, TDB and UT1 and between ISO, JD, MJD, Unix and decimal years. Returns UTC/TAI/TT/TDB, JD and MJD, TT-UTC and UT1-UTC. 1900-2100, up to 200 times.

    Runs offline · read-only
  • astro_convert_units

    Convert a value between astronomical/physical units (astropy), with optional equivalencies: 'spectral' (wavelength/frequency/energy), 'spectral_density' (F_nu/F_lambda at a wavelength), 'parallax', 'temperature', Doppler.

    Runs offline · read-only
  • astro_cosmology

    Redshift and distance in a selectable cosmology (Planck18 default; planck15, planck13, wmap9, or a custom flat/open one from h0, om0, ode0): comoving, luminosity and angular-diameter distances, distance modulus, lookback time, age, proper scale (kpc/arcsec); optionally the absolute magnitude (NO K-correction) and luminosity. Or solve z from a luminosity distance.

    Runs offline · read-only
  • astro_extinction_law

    A(lambda)/A(V) and A(lambda) from the Cardelli-Clayton-Mathis (1989) extinction law for a given E(B-V) and R_V (default 3.1), 1000-33333 Angstrom. The dust column along a sightline is YOUR input: this package bundles no dust map (no offline map is available), so it cannot look up E(B-V) for a position.

    Runs offline · read-only
  • astro_fov_check

    Which of a list of targets (up to 2000) fall inside a circular field around a centre, of a radius you give: separation, position angle and east/north offsets. A first-cut membership test, not a fibre or detector configuration.

    Runs offline · read-only
  • astro_list_sites

    The observatories bundled for planning (La Palma WHT/INT/GTC, Paranal, Cerro Pachon, Siding Spring) with latitude, longitude (east positive) and height.

    Runs offline · read-only
  • astro_magnitude_flux

    Magnitude and flux density in the AB, ST or Vega system (Vega bands U B V R I J H Ks bundled). Returns Jy, mJy, uJy, erg/s/cm2/Hz and, with a wavelength, erg/s/cm2/Angstrom.

    Runs offline · read-only
  • astro_night_info

    The timeline of a night at an observatory: sunset, civil/nautical/astronomical twilight (evening and morning), night length, local sidereal time at start/mid/end, moonrise, moonset and Moon illumination. Times UTC (optionally also a fixed local offset).

    Runs offline · read-only
  • astro_propagate_proper_motion

    Move a star's ICRS position from one epoch to another using its proper motion (mas/yr; pmra is mu_alpha* = includes cos dec, as in Gaia) and optionally parallax and radial velocity. Epochs: a Julian year (2016.0 or 'J2016.0', the Gaia DR3 epoch) or an ISO date.

    Runs offline · read-only
  • astro_redshift_convert

    z and velocity (relativistic Doppler and cz) and rest and observed wavelength: give z, or a velocity, or rest and observed wavelengths; with only one wavelength it computes the other.

    Runs offline · read-only
  • astro_sidereal_time

    Local and Greenwich sidereal time (mean and apparent) at an observatory for given UTC times.

    Runs offline · read-only
  • astro_spectral_lines

    Look up standard spectral lines from a small bundled table (hydrogen Lyman/Balmer/Paschen/Brackett, [OII], [OIII], [NII], [SII], [OI], He I/II, Ca II H&K and triplet, Mg b, Na D, UV lines): vacuum and air rest wavelengths, shifted by a redshift or velocity, optionally only those landing in an observed wavelength window.

    Runs offline · read-only
  • astro_target_visibility

    Visibility of up to 20 targets over one night at an observatory: altitude, azimuth, airmass and Moon separation every N minutes, maximum altitude and when, hours above a minimum altitude, first/last time above it, and a warning near a bright Moon. Geometric altitudes, Pickering airmass.

    Runs offline · read-only

Literature (10)

Search NASA ADS and arXiv. The ADS tools need your own ADS token.

  • ads_citations

    The papers that CITE one paper, from ADS (use year_from for recent ones, sort 'date desc' for the newest first).

    Uses the network · needs your own ADS_API_TOKEN · read-only
  • ads_get_paper

    Full ADS record of one paper by bibcode: abstract, all metadata, keywords, citation and read counts, links, provenance.

    Uses the network · needs your own ADS_API_TOKEN · read-only
  • ads_libraries

    List the ADS libraries (reading lists) of the ADS account that owns your token. Read-only.

    Uses the network · needs your own ADS_API_TOKEN · read-only
  • ads_library

    Read the papers of one ADS library by its id (the code in the library's ADS address), with their metadata. Read-only; 50 papers per page.

    Uses the network · needs your own ADS_API_TOKEN · read-only
  • ads_object_literature

    What has been written about an astronomical object: ADS papers that mention it (name resolved through SIMBAD/NED by ADS), refereed by default, most cited first. Use it for 'what is known about NGC 6397', then ads_get_paper on the best hits. Summaries of abstracts are not a review of the papers.

    Uses the network · needs your own ADS_API_TOKEN · read-only
  • ads_references

    The papers that one paper CITES (its reference list), from ADS, most cited first by default.

    Uses the network · needs your own ADS_API_TOKEN · read-only
  • ads_search

    Search NASA ADS for papers. Give any of: query (ADS syntax, e.g. 'abs:"Gaia" AND bibstem:A&A'), author ('Lastname, F'), first_author, title words, abstract words, object (a name ADS resolves via SIMBAD/NED), bibcode, year_from/year_to, refereed_only. Returns title, authors, year, venue, citation count, DOI/arXiv links and provenance (the exact ADS query). Needs an ADS API token in ADS_API_TOKEN ('ads_not_configured' if absent).

    Uses the network · needs your own ADS_API_TOKEN · read-only
  • arxiv_get_paper

    Metadata and abstract of ONE arXiv paper by identifier (new '2101.01234', versioned '2101.01234v2' or old 'astro-ph/0601001'), with journal reference if the authors gave one.

    Uses the network · read-only
  • arxiv_recent

    Recent arXiv submissions of a category (the listing of the last days), newest first, with the start of each abstract. Example uses: 'what is new in astro-ph.GA'.

    Uses the network · read-only
  • arxiv_search

    Search arXiv (all of it, or one category). Give any of: query (words), title, author ('Lastname' or 'Lastname, F'), abstract words, category (e.g. astro-ph.GA). Needs no token. arXiv asks for one request every three seconds: calls queue and repeats are cached. Preprints are not peer reviewed.

    Uses the network · read-only

Public archives and services (19)

Clients of public services such as SIMBAD, NED, VizieR, the CDS cross-match, the Gaia archive and the Virtual Observatory registry.

  • archive_list

    The archives archive_search knows (SDSS, Pan-STARRS, Legacy Surveys, DESI, MAST, ESO, IRSA, HEASARC, CADC, ALMA, Gaia): what each holds, its products, whether it can be queried from here, and its web links.

    Uses the network · read-only
  • archive_search

    Search ONE archive around a position (or named object) and return metadata, links and a small table: never the data themselves. archive: see archive_list (sdss, panstarrs, legacy_survey, desi, mast, eso, irsa, heasarc, cadc, alma, gaia_dr3). `product` picks the table where an archive has several; `table` picks another IRSA/HEASARC table. Example: archive_search(archive='mast', target='M 51', radius_arcmin=3).

    Uses the network · read-only
  • astro_services_status

    Probe every upstream service this server uses with a tiny request and report reachable or not, HTTP status and time. Useful when an archive answers with an error.

    Uses the network · read-only
  • cds_crossmatch

    CDS cross-match of a SMALL list of positions (at most 100) against a catalogue: for each position the nearest source within the radius. catalogue: gaia_dr3, 2mass, allwise, panstarrs, sdss, simbad, or 'vizier:<table id>'. Example: cds_crossmatch(positions=[[279.2347, 38.7837]], catalogue='gaia_dr3', radius_arcsec=5).

    Uses the network · read-only
  • gaia_adql

    Run ONE read-only ADQL SELECT on the Gaia archive (gaiadr3.gaia_source, gaiadr3.astrophysical_parameters, ...). Anything but a single SELECT is refused; no comments, no semicolon; TOP is added or lowered to the row cap. Example: SELECT source_id, parallax FROM gaiadr3.gaia_source WHERE parallax > 100.

    Uses the network · read-only
  • gaia_cone

    Gaia DR3 cone search (ESA archive): source_id, position, parallax, proper motion, G/BP/RP, radial velocity, RUWE, nearest first. Radius in arcsec, at most 3600. Example: gaia_cone(ra=279.2347, dec=38.7837, radius_arcsec=60, max_g_mag=15).

    Uses the network · read-only
  • gaia_source

    Everything useful about ONE Gaia DR3 source by source_id: astrometry, photometry, quality flags and the GSP-Phot astrophysical parameters when present. Example: gaia_source(source_id='2099719994020044800').

    Uses the network · read-only
  • hips_list

    List HiPS sky surveys (all-sky image sets) from the CDS HiPS list by keyword, for example 'DSS', 'PanSTARRS', 'WISE', 'Legacy'. Returns the survey id to use in image_cutout.

    Uses the network · read-only
  • image_cutout

    An image cut-out of the sky from a HiPS survey (CDS hips2fits): returns the LINK to the picture, its size in bytes and the pixel size; the picture itself is not returned. Example: image_cutout(target='M 51', fov_arcmin=10, hips='CDS/P/DSS2/color'). Format jpg, png or fits (fits: at most 512 pixels).

    Uses the network · read-only
  • ned_object

    NED (NASA/IPAC Extragalactic Database) lookup of ONE object by name: preferred name, position, object type and redshift with its reference. Example: ned_object(name='M101').

    Uses the network · read-only
  • resolve_name

    Name to position: resolve an object name with CDS Sesame (SIMBAD, NED, VizieR resolvers) into ICRS coordinates, object type and aliases. Example: resolve_name(name='M 51') to ra 202.4696, dec 47.1952. Use it before a cone search when the person gives a name.

    Uses the network · read-only
  • simbad_cone

    SIMBAD cone search: objects within a radius of a position (or of a named object), nearest first: identifier, type, coordinates, V magnitude, redshift. Radius in arcmin, at most 120. Example: simbad_cone(target='M 51', radius_arcmin=2, object_type='Galaxy').

    Uses the network · read-only
  • simbad_object

    SIMBAD (CDS) record of ONE object by name: main identifier, coordinates, object type, spectral type, parallax, proper motion, radial velocity and redshift, magnitudes per filter and the list of identifiers. Example: simbad_object(name='Vega').

    Uses the network · read-only
  • vizier_columns

    Column metadata of one VizieR catalogue: name, unit, UCD, type and description. Example: vizier_columns(catalogue='I/355/gaiadr3').

    Uses the network · read-only
  • vizier_cone

    Cone search in ONE VizieR catalogue around a position (or named object). Returns the chosen columns (default: the catalogue's standard ones). Example: vizier_cone(catalogue='II/246/out', target='Vega', radius_arcsec=30). Radius in arcsec, at most 3600.

    Uses the network · read-only
  • vizier_find_catalogues

    Find VizieR catalogues (tables) by keywords in their name or description, for example 'Gaia', '2MASS', 'cepheid period'. Returns the catalogue identifier (such as I/355/gaiadr3) and its title. Use the identifier in vizier_columns and vizier_cone.

    Uses the network · read-only
  • vo_registry_search

    Search the Virtual Observatory registry for TAP (table access) services by keywords in their title or description, for example 'radio continuum' or 'supernova'. Returns title, identifier and the TAP address. If the registry cannot be reached, this server's own list of known services is searched instead (the answer says which). A service found here can be used in vo_tap_tables and vo_tap_query.

    Uses the network · read-only
  • vo_tap_query

    Run ONE read-only ADQL SELECT on a TAP service (same names as vo_tap_tables). Refused unless it is a single SELECT; TOP is added or lowered to the row cap; the call has a time limit. Look at the tables first with vo_tap_tables. Example: vo_tap_query(service='irsa', query="SELECT designation, ra, dec, w1mpro FROM allwise_p3as_psd WHERE 1=CONTAINS(POINT('ICRS',ra,dec),CIRCLE('ICRS',202.48,47.23,0.01))").

    Uses the network · read-only
  • vo_tap_tables

    List the tables of a TAP service, or the columns of one table (give `table`). `service` is a built-in name (simbad, vizier, gaia, ned, datalab, mast, eso, irsa, heasarc, cadc, esasky, euclid, alma, gavo) or the https TAP address returned by vo_registry_search. Example: vo_tap_tables(service='irsa', table='allwise_p3as_psd').

    Uses the network · read-only

The benchmark: AstroToolBench

AstroToolBench is a benchmark for language models that use astronomy tools. It asks whether a model can pick the right tool, call it with valid arguments, chain results, and report a number or a name that can be checked. Version 0.1 is a seed, not a finished benchmark. It has 73 offline tasks: 25 that need one tool, 24 that need several in sequence, and 24 in which the model must choose among look-alike tools. The tasks run against recorded answers of the public services, so that a score does not depend on the network or the date. Most correct answers (54 of the 73) come from formulas written independently of the tools.

Measured baselines

AstroToolBench baselines: tasks answered correctly out of 73 Reference run (gold tool calls, no model): 73 of 73. gpt-oss-120b (open weights): 70 of 73. Ministral 3 14B (open weights): 63 of 73. Single offline runs; the authors of the tools wrote the tasks. Tasks answered correctly, out of 73 Reference run (gold tool calls, no model) 73 of 73 (100.0%) gpt-oss-120b (open weights) 70 of 73 (95.9%) Ministral 3 14B (open weights) 63 of 73 (86.3%)
Single offline runs on 30 October 2026, in-sample: the authors of the tools wrote the tasks. One task is about 1.4 points. Not a ranking.
Offline set, one run each, 30 October 2026. Accuracy is the share of the 73 tasks answered correctly.
SystemCorrectAccuracyOne toolSeveral toolsChoosing a tool
Reference run with the gold tool calls (no model) 73 of 73100.0%100.0%100.0%100.0%
gpt-oss-120b (open weights) 70 of 7395.9%100.0%91.7%95.8%
Ministral 3 14B (open weights) 63 of 7386.3%96.0%75.0%87.5%
Read these numbers with care. They come from single runs, and the authors of the tools wrote the tasks, so they are in-sample. With 73 tasks, one task is about 1.4 points. The strict replay marks a legitimate call as wrong when it was not recorded. Only the two open-weight models named above were run, and no number for any other model is claimed. They are a starting point for discussion, not a ranking.

Using and citing

The licence, the public home of the project and the way to cite it have not been fixed yet, and nothing here should be read as a licence. See the paper page for how to refer to CASPER in the meantime, and the acknowledgements for the public services these tools rely on.