nasa_exoplanet
Query NASA's Exoplanet Archive database to retrieve data about planets beyond our solar system using customizable filters and parameters.
Instructions
NASA Exoplanet Archive - data about planets beyond our solar system
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Database table to query | |
| select | No | Columns to return | |
| where | No | Filter conditions | |
| order | No | Ordering of results | |
| limit | No | Maximum number of results |
Implementation Reference
- src/handlers/nasa/exoplanet.ts:24-111 (handler)Main handler function that queries the NASA Exoplanet Archive API, processes the response, adds a resource, and returns formatted content.export async function nasaExoplanetHandler(params: ExoplanetParams) { try { const { table, select, where, order, format, limit } = params; // Construct the API parameters directly - nstedAPI has different params than TAP/sync const apiParams: Record<string, any> = { table: table, format: format }; // Add optional parameters if provided if (select) { apiParams.select = select; } if (where) { apiParams.where = where; } if (order) { apiParams.order = order; } if (limit) { apiParams.top = limit; // Use 'top' instead of 'limit' for this API } // Make the request to the Exoplanet Archive const response = await axios.get(EXOPLANET_API_URL, { params: apiParams }); // Create a resource ID based on the query parameters const resourceId = `nasa://exoplanet/data?table=${table}${where ? `&where=${encodeURIComponent(where)}` : ''}${limit ? `&limit=${limit}` : ''}`; // Register the response as a resource addResource(resourceId, { name: `Exoplanet data from ${table}${where ? ` with filter` : ''}`, mimeType: format === 'json' ? 'application/json' : 'text/plain', text: format === 'json' ? JSON.stringify(response.data, null, 2) : response.data }); // Format response based on the data type if (Array.isArray(response.data) && response.data.length > 0) { // If we got an array of results const count = response.data.length; return { content: [ { type: "text", text: `Found ${count} exoplanet records from the ${table} table.` }, { type: "text", text: JSON.stringify(response.data.slice(0, 10), null, 2) + (count > 10 ? `\n... and ${count - 10} more records` : '') } ], isError: false }; } else { // If we got a different format or empty results return { content: [ { type: "text", text: `Exoplanet query complete. Results from ${table} table.` }, { type: "text", text: typeof response.data === 'string' ? response.data : JSON.stringify(response.data, null, 2) } ], isError: false }; } } catch (error: any) { console.error('Error in Exoplanet handler:', error); return { isError: true, content: [{ type: "text", text: `Error accessing NASA Exoplanet Archive: ${error.message || 'Unknown error'}` }] }; } }
- src/handlers/nasa/exoplanet.ts:9-16 (schema)Zod schema for validating input parameters to the nasa_exoplanet tool.export const exoplanetParamsSchema = z.object({ table: z.string(), select: z.string().optional(), where: z.string().optional(), order: z.string().optional(), format: z.enum(['json', 'csv', 'ipac', 'xml']).optional().default('json'), limit: z.number().int().min(1).max(1000).optional() });
- src/index.ts:1609-1623 (registration)Registers the MCP request handler for the 'nasa/exoplanet' method, which delegates to the dynamic handler import.server.setRequestHandler( z.object({ method: z.literal("nasa/exoplanet"), params: z.object({ table: z.string().optional(), select: z.string().optional(), where: z.string().optional(), order: z.string().optional(), limit: z.number().optional() }).optional() }), async (request) => { return await handleToolCall("nasa/exoplanet", request.params || {}); } );
- src/index.ts:883-910 (schema)Input schema definition for the nasa_exoplanet tool in the tools/list response.name: "nasa_exoplanet", description: "NASA Exoplanet Archive - data about planets beyond our solar system", inputSchema: { type: "object", properties: { table: { type: "string", description: "Database table to query" }, select: { type: "string", description: "Columns to return" }, where: { type: "string", description: "Filter conditions" }, order: { type: "string", description: "Ordering of results" }, limit: { type: "number", description: "Maximum number of results" } }, required: ["table"] }
- src/index.ts:478-481 (registration)Tool listing in the tools/manifest response.name: "nasa_exoplanet", id: "nasa/exoplanet", description: "Access NASA's Exoplanet Archive data" },