NASA MCP Server

by ProgramComputer
Verified
import { z } from 'zod'; import axios from 'axios'; // Schema for validating JPL Small-Body Database request parameters 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') }); // Define the request parameter type based on the schema export type SbdbParams = z.infer<typeof sbdbParamsSchema>; /** * Handle requests for JPL's Small-Body Database */ 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; // Make the request to SBDB API const response = await axios.get(url, { params: queryParams }); // Return the response return { content: [{ type: "text", text: `Retrieved data for small body "${params.sstr}".` }], 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'}` }] }; } }