Query NASA POWER solar, wind, building, and agroclimatology data.
Query NASA POWER solar, wind, building, and agroclimatology data via MCP. STDIO or Streamable HTTP.
NASA POWER historical solar and meteorological observations for renewable energy, sustainable buildings and agroclimatology. Retrieve point time series and climatology, inspect native-grid regions, and compare labeled locations with source units and provenance. No NASA account or API key is required.
| Tool | Description |
|---|---|
nasa_power_get_timeseries | Hourly, daily or monthly observations at one point |
nasa_power_get_climatology | Monthly and annual point climatology, including tilted solar profiles |
nasa_power_get_region | One parameter across a bounded native-grid region |
nasa_power_compare_locations | Shared observations and seasonal summaries for 2–10 labeled points |
nasa_power_search_parameters | Search the complete community/resolution parameter dictionary |
nasa_power_list_reference | Presets, communities, coverage, missing values, wind surfaces and dataframe guidance |
nasa_power_dataframe_describe | Inspect staged schemas, units, expiry and provenance |
nasa_power_dataframe_query | Run bounded read-only SQL against an explicit canvas token |
nasa_power_dataframe_drop | Opt-in removal of one named staged table |
Eight tools are enabled by default; NASA_POWER_DATAFRAME_DROP_ENABLED=true enables the ninth.
nasa_power_get_timeseries toollatitude / longitude and temporalResolution: hourly and daily take an inclusive startDate / endDate, monthly takes startYear / endYear. selection is a named preset (default solar_pv) or explicit parameters, at most 15 effective codes hourly and 20 otherwise, corrections included.community (RE, SB, AG; default RE), units (metric, imperial) and timeStandard (LST, UTC). Optional siteElevation adds PSC; paired windElevation (10–300 meters) and windSurface add WSC. Use nasa_power_list_reference topic wind_surfaces for all 17 canonical NASA aliases, including airportgrass, airportice and vegtype_1; vegetation underscores are retained.metadata, parameters, expansions, omittedParameters, summaries, rows, an exact rowCount and dataset (null unless staged). Optional canvas_id reuses a canvas when staging is needed.nasa_power_get_climatology toolstartYear and endYear together, otherwise the source product range. No temporalResolution input.canvas_id; a profile over the 40,000-character budget fails dataset_limit. The SI_EF_TILTED_SURFACE alias lists its returned members, numeric angles and N/S orientation text included, in expansions.nasa_power_get_region toolparameter over ordered latitudeMin / latitudeMax and longitudeMin / longitudeMax, each axis spanning 2–10 degrees (invalid_region otherwise); split antimeridian regions into separate calls. temporalResolution is daily, monthly or climatology; point corrections are unsupported.rows, cellCount and per-period summaries with equal-weight cell min / mean / max, not area-weighted. Optional canvas_id reuses a canvas for staging.nasa_power_compare_locations toollocations, each with coordinates and a label of 1–120 characters, sharing one selection, corrections and window. temporalResolution defaults to climatology; hourly, daily and monthly also work.locations with per-site provenance, location-tagged rows, annual and calendar-season summaries, and failed entries with partial: true when some sites fail; all-site failure returns all_locations_failed. possibleSharedGridCell flags sites that may share a grid cell.sort (parameter, direction asc / desc) orders by a selected numeric parameter with known identical units. Optional canvas_id reuses a canvas for staging.summaryDatasets.buckets and summaryDatasets.locations point to complete SQL tables; inline summaries become whole-record previews and each location includes summaryCount. Query in summaryIndex order; the location-summary table includes locationId. SQL units: null represents an omitted source unit, not a known unit.nasa_power_search_parameters toolcommunity (default RE), temporalResolution (default daily), optional filter (up to 256 characters), offset and positive integer limit (default 20, effective cap 100 with a notice when capped).filter token must match a code, name or definition across the complete dictionary before sorted pagination; a blank filter browses it. entries, total, hasMore and truncated describe the page.nasa_power_list_reference tooltopic: presets (default), communities, coverage, missing_data, wind_surfaces or dataframes.entries, guidance, documentationUrls and verifiedOn. Presets are solar_pv, wind_turbine, building_hvac, agroclimatology and water_balance; building_hvac is unavailable hourly. agroclimatology adds T2M_MAX and T2M_MIN outside hourly resolution; monthly/climatology extremes remain source aggregates, without reconstructed daily records or calculated growing degree days.nasa_power_dataframe_describe toolcanvas_id from a producing response; optional table limits inspection to one table.provenance. Only tables in the supplied canvas are visible.nasa_power_dataframe_query toolcanvas_id and one read-only SELECT in sql (up to 16,384 characters); positive integer rowLimit defaults to 100 and is capped at 1,000, with an effective-cap notice for larger requests. Files, writes and system catalogs are denied.columns, rows, rowCount, shownCount, truncated and countSemantics (exact or materialized_prefix). SQL has a 10-second deadline; the structured and rendered outputs each must fit 40,000 characters.nasa_power_dataframe_drop toolcanvas_id and exact table; enabled only by NASA_POWER_DATAFRAME_DROP_ENABLED=true.dropped: false for an absent table while other tables keep the canvas alive. Removing the final table also retires its canvas and frees its slot; subsequent describe, query or drop calls return canvas_not_found.Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
POWER-specific:
null; zero remains a measurement. Monthly annual keys and climatology ANN remain distinct from monthly observations. LST labels have no UTC offset.Agent-friendly output:
omittedParameters distinguishes an absent series from fill values; arithmetic observation means and calendar-season buckets are not climate normals, annual yields or water balances.dataset handle; unsupported or oversized requests fail with narrowing guidance instead of returning a capped source prefix.Staging requires DuckDB and supports at most 250,000 rows, 64 parameter columns and 32 MiB of serialized rows per dataset. Canvases are process-local capabilities: pass the returned token explicitly and route later calls to the same process. Tables expire after 30 minutes, canvases after one idle hour with a six-hour absolute cap; limits are eight tables per canvas, four canvases per tenant and eight per process. Engine memory is 256 MiB per canvas, not a total RSS or temporary-disk quota.
Add the following to your MCP client configuration file.
{
"mcpServers": {
"nasa-power-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/nasa-power-mcp-server@latest"],
"env": { "MCP_TRANSPORT_TYPE": "stdio" }
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"nasa-power-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/nasa-power-mcp-server@latest"],
"env": { "MCP_TRANSPORT_TYPE": "stdio" }
}
}
}
Or with Docker:
{
"mcpServers": {
"nasa-power-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/nasa-power-mcp-server:latest"]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://127.0.0.1:3010/mcp
CANVAS_PROVIDER_TYPE=none to keep every result inline.CANVAS_PROVIDER_TYPE=none and supports inline results. Narrow an oversized request or use npm/Docker for analytics.git clone https://github.com/cyanheads/nasa-power-mcp-server.git
cd nasa-power-mcp-server
bun install
cp .env.example .env
# edit .env to change transport, logging or canvas settings
| Variable | Description | Default |
|---|---|---|
NASA_POWER_DATAFRAME_DROP_ENABLED | Expose explicit staged-table removal. | false |
CANVAS_PROVIDER_TYPE | duckdb stages large results for SQL on npm/Docker; none keeps results inline. MCPB fixes none. | duckdb |
CANVAS_DEFAULT_MEMORY_LIMIT_MB | Fixed engine memory limit; not total RSS or temporary disk. | 256 |
CANVAS_MAX_CANVASES_PER_TENANT | Fixed tenant canvas cap. | 4 |
CANVAS_TTL_MS | Fixed sliding canvas lifetime. | 3600000 |
CANVAS_ABSOLUTE_CAP_MS | Fixed absolute canvas lifetime. | 21600000 |
MCP_TRANSPORT_TYPE | stdio or http. | stdio |
MCP_HTTP_HOST / MCP_HTTP_PORT | HTTP bind address and port. | 127.0.0.1 / 3010 |
MCP_AUTH_MODE | none, jwt or oauth. | none |
MCP_LOG_LEVEL | Minimum log level. | info |
OTEL_ENABLED | Enable OpenTelemetry. | false |
DuckDB startup rejects changes to the four fixed canvas settings. See .env.example for optional transport, authentication, storage, logging and telemetry settings.
Build and run the production version:
# One-time build
bun run rebuild
# Run the built server
bun run start:http
# or
bun run start:stdio
Run checks and tests:
bun run devcheck # Lints, formats, type-checks, and more
bun run test # Runs the test suite
docker build -t nasa-power-mcp-server .
docker run --rm -p 127.0.0.1:3010:3010 nasa-power-mcp-server
The image defaults to HTTP on port 3010 in stateless session mode and logs to /var/log/nasa-power-mcp-server. OpenTelemetry peer dependencies are installed by default; build with --build-arg OTEL_ENABLED=false to omit them. For a client outside loopback, configure authentication and TLS at the deployment boundary.
| Path | Purpose |
|---|---|
src/index.ts | Nine tool registrations, bounded canvas setup and service shutdown |
src/config | Workload limits and server-specific environment parsing |
src/mcp-server/tools/definitions | Tool contracts and comparison orchestration |
src/services/power | Paced NASA client, normalization, presets and scientific summaries |
src/services/canvas | Explicit-token staging, SQL, provenance and admission limits |
scripts | Build, validation, packaging and release tooling |
tests | Offline contracts and native integration tests |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for logging and ctx.signal for cancellationcreateApp() array in src/index.tscontent[] and structuredContent carry the same complete dataIssues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y @cyanheads/nasa-power-mcp-serverMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-cyanheads-nasa-power-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/nasa-power-mcp-server"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referenceio.github.cyanheads/nasa-power-mcp-server works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.