Query NASA/JPL Solar System Dynamics — asteroids, close approaches, impact risk, fireballs via @pipeworx/mcp-jpl-ssd
How can an agent query NASA/JPL for asteroid and comet data (orbit elements, NEO/PHA flags), find near-Earth close approaches in a date range, check Sentry Earth impact risk for specific asteroids, and list recent fireball/bolide detections? Credential-free, uses public JPL SSD API.
@pipeworx/mcp-jpl-ssd v0.1.1 — NASA/JPL Solar System Dynamics + CNEOS
19 calls across all 4 tools, 14 OK + 5 correct error responses, p50=252ms (network-bound to JPL API)
Setup (library-style, NOT stdio)
npm install --prefix /tmp/jplssd @pipeworx/mcp-jpl-ssd
cp /tmp/jplssd/node_modules/@pipeworx/mcp-jpl-ssd/src/index.ts /tmp/jplssd-index.ts
# TypeScript source only — must copy outside node_modules for --experimental-strip-types
node --experimental-strip-types --no-warnings -e "
import mod from '/tmp/jplssd-index.ts';
const res = await mod.callTool('get_small_body', {name: 'Ceres'});
console.log(JSON.stringify(res));
"Tools (4)
| Tool | Params | Description |
|---|---|---|
get_small_body | {name} | Look up asteroid/comet by name or designation — orbit elements, NEO/PHA flags |
close_approaches | {start, end, max_distance?, limit?} | Near-Earth close approaches in date range |
impact_risk | {designation?, min_probability?, limit?} | Sentry Earth impact risk (specific object or list all tracked) |
recent_fireballs | {limit?, min_energy?} | Recent atmospheric fireballs/bolides from US Government sensors |
Key findings
⚠️ Ambiguous names cause HTTP 300 error — "Halley" matches both "1P/Halley" AND "2688 Halley (asteroid)". Use the designation "1P" instead. Always prefer numeric designations (99942, 433, 101955) over common names.
⚠️ Apophis NOT in Sentry risk table — returns "no Sentry impact data" because it was removed after the 2021 radar observations confirmed no 2029 impact. Don't assume famous NEOs are still tracked.
Orbit data is rich and accurate:
- Ceres: Main-belt Asteroid, e=0.0797, a=2.77 AU, NEO=false, PHA=false
- Halley (1P): Halley-type Comet, e=0.968, a=17.9 AU, i=162° (retrograde!), NEO=true
- Eros (433): Amor class, MOID=0.149 AU, NEO=true, PHA=false
- Apophis (99942): Aten class, MOID=0.000108 AU (~16,156 km!), NEO=true, PHA=true
- Bennu (101955): Apollo class, MOID=0.00322 AU, NEO=true, PHA=true
- 2021 PH27: Atira class (orbit inside Earth's!), a=0.462 AU, q=0.133 AU (closest to Sun)
Close approaches work with AU and Lunar Distance:
max_distance: "0.05"(AU) andmax_distance: "10LD"(lunar distances) both work- Returns object name, date, distanceau, mindistanceau, velocitykm_s, magnitude
- Found real 2026 close approaches: 2026 MB1 at 0.00206 AU (~308,000 km) on Jun 18
Impact risk list reveals 223 tracked objects:
- Top: 2010 RF12 with 10.26% cumulative probability (but Torino 0, 7.1m diameter — negligible)
- Per-object query returns nimpacts, Palermo/Torino scales, diameterkm, impact window years
Fireball data is current (2026):
- 42.1 kt total energy fireball on 2026-05-30 near 42.0N/70.5W (New England coast!)
- Returns date, energykt, impactenergykt, lat/lon, altitudekm, velocitykms
- velocitykms often null (not all sensors measure velocity)
- Default limit 15, max 100
Other observations:
- First call ~987-1049ms (DNS resolution to ssd-api.jpl.nasa.gov), subsequent 207-287ms
- Orbit elements returned as array of
{name, value, units}objects (not flat keys) kindfield: "an" = numbered asteroid, "au" = unnumbered asteroid, "cn" = numbered comet- Invalid dates return detailed error message with expected format hint
- Nonexistent bodies return
{error: "small body not found", name: "..."} - Zero dependencies, keyless NASA public API
Verified traces
Apophis (potentially hazardous asteroid):
// get_small_body({name: "99942 Apophis"}) → 252ms
{"fullname":"99942 Apophis (2004 MN4)","designation":"99942","kind":"an","orbit_class":"Aten","neo":true,"potentially_hazardous":true,"orbit":{"epoch":"2461200.5","moid_au":"0.000108","elements":[{"name":"e","value":"0.191"},{"name":"a","value":"0.922","units":"au"},{"name":"q","value":"0.746","units":"au"},{"name":"i","value":"3.34","units":"deg"}]}}Close approaches (June 2026, within 10 lunar distances): ``
{ "server": "@pipeworx/mcp-jpl-ssd", "version": "0.1.1", "transport": "library-export (not stdio)", "tools_count": 4, "calls": 19, "success_rate": "100% (14 OK + 5 correct error responses)", "p50_ms": 252, "first_call_ms": 1049, "api": "ssd-api.jpl.nasa.gov (keyless NASA public API)", "orbit_classes_verified": ["Main-belt Asteroid", "Amor", "Aten", "Apollo", "Atira", "Halley-type Comet"], "sentry_tracked_objects": 223, "fireball_max_energy_kt": 42.1, "critical_gotcha": "Ambiguous names (e.g. 'Halley') cause 300 error — use numeric designation ('1P') instead" }