Skip to main content
Glama

get_epic_imagery

Retrieve Earth imagery from NASA's EPIC camera to access daily views of our planet from space. Choose between natural or enhanced collection types for different visual perspectives.

Instructions

Get images from the EPIC (Earth Polychromatic Imaging Camera).

Args: collection: Collection type. Options: natural, enhanced.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
collectionNonatural

Implementation Reference

  • The main handler function decorated with @mcp.tool() that implements the 'get_epic_imagery' tool. It fetches the latest EPIC images from the NASA API, processes the metadata, constructs image URLs, and formats the output.
    @mcp.tool() async def get_epic_imagery(collection: str = "natural") -> str: """Get images from the EPIC (Earth Polychromatic Imaging Camera). Args: collection: Collection type. Options: natural, enhanced. """ if collection not in ["natural", "enhanced"]: return "Invalid collection. Available options: natural, enhanced." # Use the 'images' endpoint to get the latest images api_path = f"/EPIC/api/{collection}/images" url = f"{NASA_API_BASE}{api_path}" data = await make_nasa_request(url) if not data: return f"Could not retrieve EPIC images for latest date due to a connection error." # Check for error response (must be a dictionary) if isinstance(data, dict): if "error" in data: return f"API Error: {data.get('error')} - Details: {data.get('details', 'N/A')}" if data.get("binary_content"): return f"Received unexpected binary content from EPIC API. URL: {data.get('url')}" # Ensure data is a list if not isinstance(data, list): logger.error(f"Unexpected non-list response from EPIC API: {data}") return "Received unexpected data format from EPIC API." try: if not data: # Empty list return f"No EPIC images available for the most recent date." result = [f"EPIC images found: {len(data)}"] display_limit = 10 count = 0 for image_meta in data: if count >= display_limit: result.append(f"n... and {len(data) - display_limit} more images.") break image_date_time = image_meta.get('date', 'Unknown') image_identifier = image_meta.get('identifier', 'Unknown') # Use identifier if available image_name = image_meta.get('image', 'Unknown') # Base name like epic_1b_... # Build image URL if image_date_time != 'Unknown' and image_name != 'Unknown': try: # Extract date parts for URL path dt_obj = datetime.strptime(image_date_time, '%Y-%m-%d %H:%M:%S') year, month, day = dt_obj.strftime('%Y'), dt_obj.strftime('%m'), dt_obj.strftime('%d') # Construct archive URL archive_url = f"https://api.nasa.gov/EPIC/archive/{collection}/{year}/{month}/{day}/png/{image_name}.png" # Add API key for direct access image_url_with_key = f"{archive_url}?api_key={API_KEY}" except ValueError: logger.warning(f"Could not parse date {image_date_time} for EPIC image URL construction.") image_url_with_key = "URL construction failed" else: image_url_with_key = "URL not available" result.append(f"nIdentifier: {image_identifier}") result.append(f"Date/Time: {image_date_time}") result.append(f"Caption: {image_meta.get('caption', 'No caption')}") result.append(f"Image Name: {image_name}") result.append(f"Archive URL: {image_url_with_key}") # Coordinates coords = image_meta.get('centroid_coordinates', {}) if coords: result.append(f"Centroid Coordinates: Lat {coords.get('lat', 'N/A')}, Lon {coords.get('lon', 'N/A')}") result.append("-" * 40) count += 1 return "n".join(result) except Exception as e: logger.error(f"Error processing EPIC image data: {str(e)}") return f"Error processing EPIC image data: {str(e)}"

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/AnCode666/nasa-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server