jpl_sbdb
Search for asteroid and comet data, including close approach details, using the Small-Body Database via NASA’s MCP Server to access space-related information.
Instructions
Small-Body Database (SBDB) - asteroid and comet data
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| cad | No | Include close approach data | |
| sstr | Yes | Search string (e.g., asteroid name, number, or designation) |
Implementation Reference
- src/handlers/jpl/sbdb.ts:26-93 (handler)Main execution logic for the 'jpl_sbdb' tool: constructs JPL SBDB API request, transforms parameters, fetches data via axios, and formats response.export async function jplSbdbHandler(params: SbdbParams) { try { const { sstr, full_precision, solution_epoch, orbit_class, body_type, phys_par, close_approach, ca_time, ca_dist, ca_tbl, format } = params; // Construct the SBDB query URL const url = 'https://ssd-api.jpl.nasa.gov/sbdb.api'; // Prepare the query parameters const queryParams: Record<string, any> = { sstr }; // Add optional parameters if (full_precision) queryParams.full_precision = full_precision ? 'yes' : 'no'; if (solution_epoch) queryParams.solution_epoch = solution_epoch; if (orbit_class) queryParams.orbit_class = orbit_class ? 'yes' : 'no'; if (body_type !== 'all') queryParams.body_type = body_type; if (phys_par) queryParams.phys_par = phys_par ? 'yes' : 'no'; if (close_approach) queryParams.close_approach = close_approach ? 'yes' : 'no'; if (ca_time !== 'all') queryParams.ca_time = ca_time; if (ca_dist !== 'au') queryParams.ca_dist = ca_dist; if (ca_tbl !== 'approach') queryParams.ca_tbl = ca_tbl; if (format !== 'json') queryParams.format = format; // Transform parameter names from underscore to hyphenated format const transformedParams = transformParamsToHyphenated(queryParams); // Make the request to SBDB API const response = await axios.get(url, { params: transformedParams }); // Return the response return { content: [ { type: "text", text: `Retrieved data for small body "${params.sstr}".` }, { type: "text", text: JSON.stringify(response.data, null, 2) } ], isError: false }; } catch (error: any) { console.error('Error in JPL SBDB handler:', error); return { isError: true, content: [{ type: "text", text: `Error: ${error.message || 'An unexpected error occurred'}` }] }; } }
- src/handlers/jpl/sbdb.ts:6-18 (schema)Zod input schema sbdbParamsSchema defining parameters for the JPL SBDB tool.export const sbdbParamsSchema = z.object({ sstr: z.string().min(1), full_precision: z.boolean().optional().default(false), solution_epoch: z.string().optional(), orbit_class: z.boolean().optional().default(false), body_type: z.enum(['ast', 'com', 'all']).optional().default('all'), phys_par: z.boolean().optional().default(false), close_approach: z.boolean().optional().default(false), ca_time: z.enum(['all', 'now', 'fut', 'past']).optional().default('all'), ca_dist: z.enum(['au', 'ld', 'lu']).optional().default('au'), ca_tbl: z.enum(['elem', 'approach']).optional().default('approach'), format: z.enum(['json', 'xml']).optional().default('json') });
- src/index.ts:503-506 (registration)Tool registration in tools/manifest response listing 'jpl_sbdb' tool.name: "jpl_sbdb", id: "jpl/sbdb", description: "Small-Body DataBase (SBDB) - primarily orbital data on all known asteroids and comets" },
- src/index.ts:1032-1048 (registration)Detailed tool registration in tools/list including name, description, and inputSchema for 'jpl_sbdb'.name: "jpl_sbdb", description: "Small-Body Database (SBDB) - asteroid and comet data", inputSchema: { type: "object", properties: { sstr: { type: "string", description: "Search string (e.g., asteroid name, number, or designation)" }, cad: { type: "boolean", description: "Include close approach data" } }, required: ["sstr"] } },
- src/utils/param-transformer.ts:9-19 (helper)Helper utility transformParamsToHyphenated used by jplSbdbHandler to convert underscore param names to hyphens for JPL API.export function transformParamsToHyphenated(params: Record<string, any>): Record<string, any> { const transformed: Record<string, any> = {}; for (const [key, value] of Object.entries(params)) { // Replace underscores with hyphens for parameter names const transformedKey = key.replace(/_/g, '-'); transformed[transformedKey] = value; } return transformed; }