A Model Context Protocol (MCP) server for NASA APIs, providing a standardized interface for AI models to interact with NASA's vast array of data sources. This server implements the official Model Context Protocol specification.
Big thanks to the MCP community for their support and guidance!
- Access to 20+ NASA data sources through a single, consistent interface
- Standardized data formats optimized for AI consumption
- Automatic parameter validation and error handling
- Rate limit management for NASA API keys
- Comprehensive documentation and examples
- Support for various NASA imagery formats
- Data conversion and formatting for LLM compatibility
- Cross-platform support (Windows, macOS, Linux)
Ask your MCP client things like:
- "Which asteroids fly past Earth today, and which one comes closest?"
- "Will any asteroid pass closer to Earth than the Moon in the next 90 days?"
- "What are the odds that Bennu hits Earth, according to JPL Sentry?"
- "Find NASA photos of the Apollo 11 lunar module taken in 1969."
- "Which tropical storms and hurricanes are active right now?"
- "Show me a detailed satellite view of the Nile Delta and the Sinai on 2025-07-15."
- "Find cloud-hosted sea ice concentration datasets in NASA Earthdata."
- "What were the daily highs, lows and solar energy in Denver during the first week of July 2025?"
- "List the nearest roughly Earth-sized, temperate exoplanets discovered since 2020."
This project is not affiliated with, endorsed by, or related to NASA (National Aeronautics and Space Administration) or any of its subsidiaries or its affiliates. It is an independent implementation that accesses NASA's publicly available APIs. All NASA data used is publicly available and subject to NASA's data usage policies.
env NASA_API_KEY=YOUR_API_KEY npx -y @programcomputer/nasa-mcp-server@latestYou can also pass the API key as a command line argument:
npx -y @programcomputer/nasa-mcp-server@latest --nasa-api-key=YOUR_API_KEY# Clone the repository
git clone https://github.com/ProgramComputer/NASA-MCP-server.git
# Install dependencies
cd NASA-MCP-server
npm install
# Build
npm run build
# Run with your API key
NASA_API_KEY=YOUR_API_KEY npm startReplace YOUR_API_KEY with your NASA API key from https://api.nasa.gov/. Requires Node.js 22 or newer.
The server can be configured with the following environment variables:
| Variable | Description |
|---|---|
NASA_API_KEY |
Your NASA API key (get at api.nasa.gov) |
FIRMS_MAP_KEY |
Your FIRMS MAP_KEY for fire data (get at firms.modaps.eosdis.nasa.gov/api/map_key); separate from NASA_API_KEY |
NASA_MCP_CMR_URL |
Optional CMR search URL (default: https://cmr.earthdata.nasa.gov/search) |
MCP_TRANSPORT |
Transport mode: stdio (default) or http for Streamable HTTP |
MCP_HTTP_HOST |
Host for Streamable HTTP mode (default: 127.0.0.1) |
MCP_HTTP_PORT |
Port for Streamable HTTP mode (default: 3000) |
MCP_HTTP_PATH |
MCP endpoint path for Streamable HTTP mode (default: /mcp) |
By default, the server runs over stdio for local MCP clients such as Cursor and Claude Desktop.
To run the optional Streamable HTTP transport:
MCP_TRANSPORT=http MCP_HTTP_PORT=3000 NASA_API_KEY=YOUR_API_KEY npm startThe Streamable HTTP endpoint will be available at:
http://127.0.0.1:3000/mcp
This MCP server integrates the following NASA APIs:
-
NASA Open API (api.nasa.gov):
- APOD (Astronomy Picture of the Day)
- EPIC (Earth Polychromatic Imaging Camera)
- DONKI (Space Weather Database Of Notifications, Knowledge, Information)
- Insight (Mars Weather Service)
- Mars Rover Photos
- NEO (Near Earth Object Web Service)
- EONET (Earth Observatory Natural Event Tracker)
- TLE (Two-Line Element)
- NASA Image and Video Library
- Exoplanet Archive
- NASA Sounds API (Beta)
- POWER (Prediction Of Worldwide Energy Resources)
-
JPL Solar System Dynamics API (ssd-api.jpl.nasa.gov):
- SBDB (Small-Body DataBase)
- SBDB Close-Approach Data
- Fireball Data
- Scout API
-
Earth Data APIs:
- GIBS (Global Imagery Browse Services)
- CMR (Common Metadata Repository) - Enhanced with advanced search capabilities
- EPIC (Earth Polychromatic Imaging Camera)
- FIRMS (Fire Information for Resource Management System)
Each NASA API is exposed through standardized MCP methods:
{
"method": "nasa/apod",
"params": {
"date": "2023-01-01", // Optional: YYYY-MM-DD format
"count": 5, // Optional: Return a specified number of random images
"thumbs": true // Optional: Return URL of video thumbnail
}
}{
"method": "nasa/mars-rover",
"params": {
"rover": "curiosity", // Required: "curiosity", "opportunity", or "spirit"
"sol": 1000, // Either sol or earth_date is required
"earth_date": "2023-01-01", // YYYY-MM-DD format
"camera": "FHAZ" // Optional: Filter by camera type
}
}{
"method": "nasa/neo",
"params": {
"start_date": "2023-01-01", // Required: YYYY-MM-DD format
"end_date": "2023-01-07" // Required: YYYY-MM-DD format (max 7 days from start)
}
}{
"method": "nasa/gibs",
"params": {
"layer": "MODIS_Terra_CorrectedReflectance_TrueColor", // Required: Layer ID
"date": "2023-01-01", // Required: YYYY-MM-DD format
"format": "png" // Optional: "png" or "jpg"
}
}{
"method": "nasa/power",
"params": {
"parameters": "T2M,PRECTOTCORR,WS10M", // Required: Comma-separated list
"community": "re", // Required: Community identifier
"latitude": 40.7128, // Required: Latitude
"longitude": -74.0060, // Required: Longitude
"start": "20220101", // Required: Start date (YYYYMMDD)
"end": "20220107" // Required: End date (YYYYMMDD)
}
}{
"method": "nasa/cmr",
"params": {
"keyword": "sea surface temperature", // Optional: Collections only
"search_type": "collections", // Optional: "collections" (default) or "granules"
"bounding_box": "-100,10,-60,40", // Optional: west,south,east,north ("bbox" also works)
"temporal": "2024-06-01T00:00:00Z,2024-09-30T23:59:59Z", // Optional: start,end
"limit": 5 // Optional: 1-100, default 10
}
}Results come back in a compact format by default ("response_mode": "raw" returns CMR's own metadata, and fields picks which fields to return). To get the next page, send back only the next_cursor from the response:
{
"method": "nasa/cmr",
"params": {
"cursor": "cmr1..." // Required: next_cursor from the previous response
}
}{
"method": "nasa/firms",
"params": {
"bbox": "-125,32,-114,42", // Required: west,south,east,north (or latitude, longitude and radius_km)
"days": 1, // Optional: 1-5
"source": "VIIRS_SNPP_NRT" // Optional: FIRMS data source
}
}For complete documentation of all available methods and parameters, see the API reference in the /docs directory.
The server includes comprehensive logging:
- Operation status and progress
- Performance metrics
- Rate limit tracking
- Error conditions
- Request validation
Example log messages:
[INFO] NASA MCP Server initialized successfully
[INFO] Processing APOD request for date: 2023-01-01
[INFO] Fetching Mars Rover data for Curiosity, sol 1000
[WARNING] Rate limit threshold reached (80%)
[ERROR] Invalid parameter: 'date' must be in YYYY-MM-DD format
This MCP server implements security best practices following the Model Context Protocol specifications:
- Input validation and sanitization using Zod schemas
- No execution of arbitrary code
- Protection against command injection
- Proper error handling to prevent information leakage
- Rate limiting and timeout controls for API requests
- No persistent state that could be exploited across sessions
# Clone the repository
git clone https://github.com/ProgramComputer/NASA-MCP-server.git
# Install dependencies
npm install
# Copy the example environment file and update with your API keys
cp .env.example .env
# Build the TypeScript code
npm run build
# Start the development server
npm run dev
# Run tests
npm testThe NASA MCP Server includes a script to help you test the APIs using the MCP Inspector:
# Run the provided test script
./scripts/test-with-inspector.shThis will:
- Build the project to ensure the latest changes are included
- Start the MCP Inspector with the NASA MCP server running
- Allow you to interactively test all the NASA APIs
The repository includes example test requests for each API that you can copy and paste into the MCP Inspector:
# View the example test requests
cat docs/inspector-test-examples.mdFor detailed examples, see the Inspector Test Examples document.
This server follows the official Model Context Protocol. For local clients, use the default stdio configuration shown above. For Streamable HTTP mode, start the server with MCP_TRANSPORT=http, then connect with the MCP SDK:
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import { CallToolResultSchema } from "@modelcontextprotocol/sdk/types.js";
const transport = new StreamableHTTPClientTransport(
new URL("http://127.0.0.1:3000/mcp")
);
const client = new Client({
name: "mcp-client",
version: "1.0.0",
});
await client.connect(transport);
// Example: Get today's Astronomy Picture of the Day
const apodResult = await client.request({
method: "tools/call",
params: {
name: "nasa/apod",
arguments: {}
}
}, CallToolResultSchema);
// Example: Get Mars Rover photos
const marsRoverResult = await client.request({
method: "tools/call",
params: {
name: "nasa/mars-rover",
arguments: { rover: "curiosity", sol: 1000 }
}
}, CallToolResultSchema);
// Example: Search for Near Earth Objects
const neoResults = await client.request({
method: "tools/call",
params: {
name: "nasa/neo",
arguments: {
start_date: "2023-01-01",
end_date: "2023-01-07"
}
}
}, CallToolResultSchema);
// Example: Get satellite imagery from GIBS
const satelliteImage = await client.request({
method: "tools/call",
params: {
name: "nasa/gibs",
arguments: {
layer: "MODIS_Terra_CorrectedReflectance_TrueColor",
date: "2023-01-01"
}
}
}, CallToolResultSchema);
// Example: Use the new POWER API
const powerData = await client.request({
method: "tools/call",
params: {
name: "nasa/power",
arguments: {
parameters: "T2M,PRECTOTCORR,WS10M",
community: "re",
latitude: 40.7128,
longitude: -74.0060,
start: "20220101",
end: "20220107"
}
}
}, CallToolResultSchema);- Fork the repository
- Create your feature branch
- Run tests:
npm test - Submit a pull request
ISC License - see LICENSE file for details