About nasa-power-mcp-server
nasa-power-mcp-server provides NASA POWER historical solar and meteorological data for renewable-energy, building, and agroclimatology work. It supports point, regional, and multi-location queries, with optional staged datasets and read-only SQL for larger results.
Key features
- 01Retrieve point time series and climatology
- 02Query native-grid regions and compare locations
- 03Search parameters and reference information
- 04Stage larger datasets for bounded SQL queries
- 05Return source units and scientific provenance
Use cases
- 01Assess solar and wind resource histories
- 02Compare weather patterns across locations
- 03Explore building or agroclimatology parameters
- 04Query larger staged datasets for analysis
MCP support
Exposes nine tools to MCP clients over stdio or Streamable HTTP, including NASA POWER queries and optional dataset inspection, SQL querying, and removal. A hosted Streamable HTTP instance is also available.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://nasa-power.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-nasa-power https://nasa-power.caseyjhand.com/mcp{"mcpServers":{"cyanheads-nasa-power":{"type":"http","url":"https://nasa-power.caseyjhand.com/mcp"}}}Open in Cursor{"servers":{"cyanheads-nasa-power":{"type":"http","url":"https://nasa-power.caseyjhand.com/mcp"}}}Open in VS Code{"mcpServers":{"cyanheads-nasa-power":{"type":"http","url":"https://nasa-power.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-nasa-power":{"serverUrl":"https://nasa-power.caseyjhand.com/mcp"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
Tools
8This tool takes no parameters.
Details
From the project README@cyanheads/nasa-power-mcp-server
Query NASA POWER solar, wind, building, and agroclimatology data via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://nasa-power.caseyjhand.com/mcp
Overview
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.
Tools
| 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.
Capability reference
nasa_power_get_timeseries tool
latitude/longitudeandtemporalResolution:hourlyanddailytake an inclusivestartDate/endDate,monthlytakesstartYear/endYear.selectionis a namedpreset(defaultsolar_pv) or explicitparameters, at most 15 effective codes hourly and 20 otherwise, corrections included.community(RE,SB,AG; defaultRE),units(metric,imperial) andtimeStandard(LST,UTC). OptionalsiteElevationaddsPSC; pairedwindElevation(10–300 meters) andwindSurfaceaddWSC. Usenasa_power_list_referencetopicwind_surfacesfor all 17 canonical NASA aliases, includingairportgrass,airporticeandvegtype_1; vegetation underscores are retained.- Returns
metadata,parameters,expansions,omittedParameters,summaries,rows, an exactrowCountanddataset(null unless staged). Optionalcanvas_idreuses a canvas when staging is needed.
nasa_power_get_climatology tool
- Point coordinates with the same selection and corrections; optional
startYearandendYeartogether, otherwise the source product range. NotemporalResolutioninput. - Small profiles remain inline; larger profiles return a bounded preview and complete
datasethandle. Pass optionalcanvas_idto reuse an existing workspace. Without DuckDB, narrow oversized selections for inline output.SI_EF_TILTED_SURFACEand the distinctSI_TILTED_AVG,SI_TILTED_MIN,SI_TILTED_MAXgroups list only their actually returned members, numeric angles and N/S orientation text included, inexpansions. A group is omitted only when none of its members return.
nasa_power_get_region tool
- One
parameterover orderedlatitudeMin/latitudeMaxandlongitudeMin/longitudeMax, each axis spanning 2–10 degrees (invalid_regionotherwise); split antimeridian regions into separate calls.temporalResolutionisdaily,monthlyorclimatology; point corrections are unsupported. - Daily regions require date bounds and monthly regions require year bounds. Regional climatology accepts no year fields and reports the source's precomputed period; use
nasa_power_get_climatologyfor a custom point year window. - Returns cell-tagged
rows,cellCountand per-periodsummarieswith equal-weight cellmin/mean/max, not area-weighted. Optionalcanvas_idreuses a canvas for staging. - Oversized summary envelopes return
summaryDatasetwith all cross-cell summaries, exactsummaryCountand a whole-record inline preview. Query the table insummaryIndexorder; SQLunits: nullrestores an omitted source unit. Observations and summaries register together and retain linked provenance.
nasa_power_compare_locations tool
- 2–10
locations, each with coordinates and alabelof 1–120 characters, sharing one selection, corrections and window.temporalResolutiondefaults toclimatology;hourly,dailyandmonthlyalso work. - Returns successful
locationswith per-site provenance, location-taggedrows, annual and calendar-seasonsummaries, andfailedentries withpartial: truewhen some sites fail; all-site failure returnsall_locations_failed.possibleSharedGridCellflags sites that may share a grid cell. - Optional
sort(parameter,directionasc/desc) orders by a selected numeric parameter with known identical units. Optionalcanvas_idreuses a canvas for staging. - When summaries exceed the response budget,
summaryDatasets.bucketsandsummaryDatasets.locationspoint to complete SQL tables; inline summaries become whole-record previews and each location includessummaryCount. Query insummaryIndexorder; the location-summary table includeslocationId. SQLunits: nullrepresents an omitted source unit, not a known unit.
nasa_power_search_parameters tool
community(defaultRE),temporalResolution(defaultdaily), optionalfilter(up to 256 characters),offsetand positive integerlimit(default 20, effective cap 100 with a notice when capped).- Every case-insensitive
filtertoken must match a code, name or definition across the complete dictionary before sorted pagination; a blank filter browses it.entries,total,hasMoreandtruncateddescribe the page.
nasa_power_list_reference tool
topic:presets(default),communities,coverage,missing_data,wind_surfacesordataframes.- Returns typed
entries,guidance,documentationUrlsandverifiedOn. Presets aresolar_pv,wind_turbine,building_hvac,agroclimatologyandwater_balance;building_hvacis unavailable hourly.agroclimatologyaddsT2M_MAXandT2M_MINoutside hourly resolution; monthly/climatology extremes remain source aggregates, without reconstructed daily records or calculated growing degree days.
nasa_power_dataframe_describe tool
- Required
canvas_idfrom a producing response; optionaltablelimits inspection to one table. - Returns canvas and table expiry, SQL columns with source units, and original scientific
provenance. Only tables in the supplied canvas are visible.
nasa_power_dataframe_query tool
- Required
canvas_idand one read-only SELECT insql(up to 16,384 characters); positive integerrowLimitdefaults to 100 and is capped at 1,000, with an effective-cap notice for larger requests. Files, writes and system catalogs are denied. - Returns
columns,rows,rowCount,shownCount,truncatedandcountSemantics(exactormaterialized_prefix). SQL has a 10-second deadline; the structured and rendered outputs each must fit 40,000 characters. - SQL mistakes retain bounded identifiers or conversion values with recovery guidance. Operational failures use generic messages; engine paths and native causes are excluded.
nasa_power_dataframe_drop tool
- Required
canvas_idand exacttable; enabled only byNASA_POWER_DATAFRAME_DROP_ENABLED=true. - Returns
dropped: falsefor 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 returncanvas_not_found.
Features
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:
- Historical gridded observations, rather than site measurements or forecasts. Meteorological coverage starts in 1981, solar in 1984 and hourly in 2001; source configuration and publication latency further constrain availability.
- One active upstream request, starts at least two seconds apart, bounded retries and a 55-second overall call deadline. NASA publishes no numeric request allowance. References cache for 24 hours and observations for 10 minutes.
- Source fill values become
null; zero remains a measurement. Monthly annual keys and climatologyANNremain distinct from monthly observations. LST labels have no UTC offset. T_ZONESandTM_ZONESretain numeric climate-zone codes withvalueKind: categorical, including in SQL column metadata. They have no arithmetic summaries or comparison sort metrics; explicit numeric sorting by either is rejected.
Agent-friendly output:
- Scientific provenance — source API version, dataset identifiers, endpoint and access time accompany results; preserve returned units and attribute NASA POWER.
- Explicit gaps —
omittedParametersdistinguishes an absent series from fill values; arithmetic observation means and calendar-season buckets are not climate normals, annual yields or water balances. - Complete datasets — inline outputs each fit 40,000 characters. Larger datasets stage all rows with a preview of at most 20 rows and a
datasethandle; 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 with eight tables per canvas. Defaults are one idle hour and six absolute hours per canvas, four canvases per tenant, eight per process, and 256 MiB engine memory per canvas. Operators can size canvas capacity, memory and lifetime below; engine memory does not bound total RSS or temporary disk.
Getting started
Public Hosted Instance
A public instance is available at https://nasa-power.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"nasa-power-mcp-server": {
"type": "streamable-http",
"url": "https://nasa-power.caseyjhand.com/mcp"
}
}
}
Self-Hosted / Local
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
Prerequisites
- Bun v1.4.0 or higher (or Node.js v24+).
- npm and Docker install native DuckDB dependencies normally on supported platforms, and staging and SQL are on by default. Set
CANVAS_PROVIDER_TYPE=noneto keep every result inline. - The portable Claude Desktop MCPB bundle fixes
CANVAS_PROVIDER_TYPE=noneand supports inline results. Narrow an oversized request or use npm/Docker for analytics.
Installation
- Clone the repository:
git clone https://github.com/cyanheads/nasa-power-mcp-server.git
- Navigate into the directory:
cd nasa-power-mcp-server
- Install dependencies:
bun install
- Configure environment:
cp .env.example .env
# edit .env to change transport, logging or canvas settings
Configuration
| 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 | Per-canvas engine memory, integer ≥64 MiB; not total RSS or temporary disk. | 256 |
CANVAS_MAX_CANVASES_PER_TENANT | Positive tenant canvas cap; auth-none callers share one tenant. | 4 |
NASA_POWER_MAX_CANVASES_PER_PROCESS | Positive process canvas cap, including pending and failed cleanup reservations. | 8 |
CANVAS_TTL_MS | Positive sliding canvas lifetime in milliseconds. | 3600000 |
CANVAS_ABSOLUTE_CAP_MS | Absolute canvas lifetime in milliseconds, at least the sliding TTL. | 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 |
Unset, blank and whole-value placeholder settings retain these defaults. Invalid sizing fails startup. Byte budgets, table limits and producer concurrency remain fixed independently of operator canvas sizing. See .env.example for optional transport, authentication, storage, logging and telemetry settings.
Running the server
Local development
-
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
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.
Project structure
| 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 |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
- Handlers throw, framework catches — no
try/catchin tool logic - Use
ctx.logfor logging andctx.signalfor cancellation - Register new tools in the
createApp()array insrc/index.ts - Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields, and preserve source units and annual-period distinctions
content[]andstructuredContentcarry the same complete data
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
License
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.