@pipeworx/noirlab-datalab
Connect: https://gateway.pipeworx.io/noirlab-datalab/mcp · Install: one-click buttons
No MCP client? Skip the connection: POST https://gateway.pipeworx.io/v1/tools/search_packs {"query":"..."} to find a tool below, GET /v1/tools/<name> for its schema, POST the same URL with arguments for the data — see For AI agents.
Tools: 3
NSF NOIRLab’s Astro Data Lab — the DECam, Mayall and Blanco survey catalogues (Legacy Surveys/DECaLS, DES, DELVE, DECaPS, SMASH, NSC) alongside mirrored all-sky catalogues (Gaia DR3, AllWISE, CatWISE, 2MASS, SDSS, DESI), queryable as database tables. Around 130 schemas and tens of billions of rows.
Tools
datalab_tables(schema?, table?, limit?)— list the survey data releases, one release’s tables, or one table’s columns. Call it first: table names are survey-specific and a guessed name is a query error, not an empty result.datalab_query(sql, limit?)— run a read-only ADQLSELECT. ATOP nis injected when you omit one, so a bare query cannot scan a billion-row table unbounded.datalab_cone_search(table, ra, dec, radius?, columns?, limit?)— sources within a radius of a sky position, nearest first, with exact angular separation in degrees.
Auth
Keyless — but only through the IVOA TAP endpoint. See the first trap below.
Data sources
- https://datalab.noirlab.edu/tap/sync —
REQUEST=doQuery&LANG=ADQL&FORMAT=csv&QUERY=…. Anonymous, and the only door this pack uses.
Traps
/query/query?sql=is NOT anonymous, despite being the documented front door. It is what thedatalabPython client uses and what the docs lead with, but without a login it answers401 The provided security token is invalid— and the widely-quotedX-DL-AuthToken: anonymous.0.0.anon_accessanswers HTTP 200 with the bodyError in query(). Try checking that you are logged in.A 200 carrying a failure is the worst shape a failure can take, and it is why this pack speaks TAP only. Measured 2026-09-17.- TAP reports every error as HTTP 200. Syntax errors, unknown tables, timeouts: all come back
200 with a VOTable whose single
INFOelement carriesQUERY_STATUS="ERROR". Read as data that is an empty result set. Every response is checked for that element before it is parsed. - ADQL geometry is not implemented, and neither is Q3C.
CONTAINS(POINT('ICRS',ra,dec), CIRCLE('ICRS',…))parses and is handed to PostgreSQL verbatim, which answersfunction circle(numeric, numeric, numeric) does not exist. The Q3C functions the backend actually has (q3c_radial_query) are rejected by the ADQL parser one layer up. So both obvious cone-search spellings fail.datalab_cone_searchbuilds the search from trigonometry both layers accept: an indexable RA/Dec box (RA widened by1/cos(dec), wrapping at 0h) to narrow the scan, then an exact great-circle distance to trim the box corners off and order by true separation. - Row limits are
SELECT TOP n, notLIMIT n. ADQL, not PostgreSQL. - Zero rows is usually footprint, not absence. The DECam surveys cover the southern sky and the
Galactic plane selectively, so a northern target legitimately returns nothing from
ls_dr10ordes_dr2. The zero-result note says to re-check againstgaia_dr3.gaia_source, which is all-sky.
Tools
- datalab_query — Run an ADQL (SQL) query against NSF NOIRLab Astro Data Lab — the DECam, Mayall and Blanco
- datalab_tables — List the schemas and tables available in NOIRLab Astro Data Lab, with each table’s
- datalab_cone_search — Find catalogue sources within a radius of a sky position, in any NOIRLab Data Lab table —
Tools
datalab_cone_search— Find catalogue sources within a radius of a sky position, in any NOIRLab Data Lab table —datalab_query— Run an ADQL (SQL) query against NSF NOIRLab Astro Data Lab — the DECam, Mayall and Blancodatalab_tables— List the schemas and tables available in NOIRLab Astro Data Lab, with each table's