satellite-imagery-mcp
Finds the best satellite scenes of a place and time and lists the bands/files of any scene found, read-only and with no account or key.
find_imagery: search Sentinel-2, Landsat, Sentinel-1 radar or NAIP for an area (bbox, or lat/lon with a radius) over a date range.Rank results by area actually covered, then cloud cover, then date — or ask for
best,clearestornewestsorting.Set a
max_cloudlimit, alimitof up to 10 scenes, and get a preview thumbnail, true-colour image and STAC item link per scene, plus the required data licence and credit line.Know what costs money: Landsat, Sentinel-1 and NAIP files live in requester-pays AWS buckets, so those scenes are flagged as billed to the downloader.
scene_assets: list every band and file of one scene — key, title, common band name, resolution, media type and download URL — with the scene's date, cloud cover, projection and footprint bbox.Nothing is downloaded or changed: everything is links and metadata, compact JSON matching an output schema, over HTTPS to a fixed set of hosts with caching for repeats.
Use it from Claude Code, Claude Desktop, Cursor, VS Code, Goose, Docker or any MCP client, or run it hosted via
--http.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@satellite-imagery-mcp Find the clearest Sentinel-2 image of San Francisco from last week."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Satellite Imagery
Find the right satellite image of any place and time: the clearest Sentinel-2 or Landsat scene of a field, a city block or a coastline, Sentinel-1 radar when it is cloudy, or NAIP aerial photos of the US, with preview images, true-colour and band download links, and the licence each needs.
A catalogue search returns every scene whose footprint touches your area, including slivers at the edge of a tile, sorted by whatever the catalogue likes. Satellite Imagery measures how much of your area each scene actually covers and ranks by that first, then by cloud cover, then by date (or by clearness or recency if you ask), so the first result is the one you would have picked by hand.
find_imagery: an area (bounding box, or a point and radius), a date range, a collection and a cloud limit in; ranked scenes out, each with its date, cloud cover, share of your area covered, preview, true-colour image and STAC item link.scene_assets: every band and file of one scene, with band name, wavelength, resolution and URL.
It is explicit about what things cost: Landsat, Sentinel-1 and NAIP files sit in requester-pays AWS buckets, so downloading them is billed to the downloader, and those scenes are flagged. Each answer carries the credit line its data provider asks for.
No account or key needed. Built and maintained by Arhan Canli.
Install
Needs Node.js 20 or newer. No account or key.
Claude Code
claude mcp add satellite-imagery -- npx -y satellite-imagery-mcpClaude Desktop: download satellite-imagery-mcp-<version>.mcpb from the latest release and open it. The bundle is signed; verify it with gh attestation verify <file> --repo arhancanli/satellite-imagery-mcp.
Any other client (Windsurf, Zed, Cline, Continue and others), in its MCP config file:
{
"mcpServers": {
"satellite-imagery": {
"command": "npx",
"args": [
"-y",
"satellite-imagery-mcp"
]
}
}
}Docker
docker build -t satellite-imagery-mcp https://github.com/arhancanli/satellite-imagery-mcp.git && docker run -i --rm satellite-imagery-mcpHosted (Streamable HTTP): node src/server.mjs --http serves stateless MCP at POST /mcp (port from PORT, default 3000).
Related MCP server: screenshot-website-fast
Example
An agent calls find_imagery with:
{
"lat": 25.197,
"lon": 55.274,
"start": "2026-08-01",
"end": "2026-09-26",
"limit": 3
}and gets back (recorded from the live server on 2026-09-26):
{
"collection": "Sentinel-2 surface reflectance (Collection 1, L2A), 10 m, every 5 days",
"area": [
55.264072,
25.188017,
55.283928,
25.205983
],
"matched": 14,
"scenes": [
{
"id": "S2B_T40RCN_20260830T065854_L2A",
"date": "2026-08-30T07:02:38",
"cloud_cover": 0,
"area_covered_pct": 100,
"platform": "sentinel-2b",
"thumbnail": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/40/R/CN/2026/8/S2B_T40RCN_20260830T065854_L2A/L2A_PVI.jpg",
"true_color": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/40/R/CN/2026/8/S2B_T40RCN_20260830T065854_L2A/TCI.tif",
"item": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T40RCN_20260830T065854_L2A"
},
{
"id": "S2B_T40RCN_20260919T065429_L2A",
"date": "2026-09-19T07:02:39",
"cloud_cover": 0,
"area_covered_pct": 100,
"platform": "sentinel-2b",
"thumbnail": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/40/R/CN/2026/9/S2B_T40RCN_20260919T065429_L2A/L2A_PVI.jpg",
"true_color": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/40/R/CN/2026/9/S2B_T40RCN_20260919T065429_L2A/TCI.tif",
"item": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T40RCN_20260919T065429_L2A"
},
{
"id": "S2B_T40RCN_20260909T070216_L2A",
"date": "2026-09-09T07:02:38",
"cloud_cover": 0,
"area_covered_pct": 100,
"platform": "sentinel-2b",
"thumbnail": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/40/R/CN/2026/9/S2B_T40RCN_20260909T070216_L2A/L2A_PVI.jpg",
"true_color": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/40/R/CN/2026/9/S2B_T40RCN_20260909T070216_L2A/TCI.tif",
"item": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T40RCN_20260909T070216_L2A"
}
],
"examined": 14,
"licence": "Copernicus Sentinel data: free and open use; credit 'Contains modified Copernicus Sentinel data [year]'."
}Tools
Tool | What it does |
| Finds satellite scenes of an area (bbox or lat/lon) between two dates: Sentinel-2, Landsat, Sentinel-1 radar or NAIP. Ranks by how much of the area each scene covers, cloud cover and date, and returns preview, true-colour image and STAC item links with the data licence. |
| Lists the bands and files of one scene found with find_imagery: key, title, common band name, resolution, media type and download URL, with the scene's date, cloud cover, projection and footprint bbox. |
Collections: sentinel-2 (Sentinel-2 Collection 1 L2A surface reflectance, 10 m, about every 5
days), landsat (Landsat 8 and 9 Collection 2 Level 2, 30 m), sentinel-1 (radar, through cloud and
at night), naip (US aerial, about 1 m, 2010 to 2022).
How it behaves
Read-only: no tool changes anything outside this process, and nothing is downloaded: results are links.
Network: HTTPS only, to the hosts listed in
package.jsonunderfactory.allowHosts, with a deadline, a size cap and bounded retries; a stalled read is retried. Nothing else is contacted, and nothing is logged except unexpected failures (to stderr, without your inputs).The 50 best scenes by the catalogue's own order (clearest for optical collections, newest for radar) are ranked, and the answer says when more matched.
Coverage is computed in longitude and latitude scaled by the cosine of the latitude, which is accurate for the areas scene selection deals with; areas crossing the antimeridian are not supported.
Results are compact JSON with a matching output schema.
Benchmark
Measured 2026-09-26 with gpt-5.4-mini, 10 fixed tasks graded by fixed checks (bench/tasks.json, raw results in bench/results/).
Server | Correct | Input tokens | Output tokens | Tool calls | Median time |
This server | 10/10 | 20400 | 650 | 9 | 3.0 s |
planetary-computer-mcp (run with mcp<2 pinned; its default install fails to start) | 10/10 | 23709 | 980 | 14 | 3.4 s |
Performance
Measured 2026-09-26 from Dubai, home connection against the live upstream, Node 24.19.0 (bench/perf.json, scripts/perf.mjs in the factory).
Call | First call | Repeat | Result size |
find_imagery: Sentinel-2 around a point in Dubai, 8 weeks | 2157 ms | 1.4 ms | 1,971 chars |
find_imagery: Landsat over San Francisco, a summer | 1249 ms | 0.8 ms | 1,647 chars |
find_imagery: Sentinel-1 radar over London, newest first | 1273 ms | 1 ms | 1,292 chars |
scene_assets: one Sentinel-2 scene | 726 ms | 0.7 ms | 5,602 chars |
find_imagery: open ocean, no cloud allowed | 451 ms | 0.3 ms | 441 chars |
First call: a fresh server process, including the TLS connection and the upstream's own time. Repeat: the same call again, answered from the in-process cache, so it shows this server's own overhead.
Tool definitions the model reads on every turn (name, description, input schema): 1,731 characters, against 2,776 for planetary-computer-mcp (run with mcp<2 pinned; its default install fails to start). The full tool list, with the output schemas and annotations clients use to validate results, is 2,641 characters (4,812 for the alternative).
Data sources
Earth Search by Element 84, a public STAC API over the AWS Open Data Registry copies of Sentinel-2, Landsat Collection 2, Sentinel-1 and NAIP.
Licences: Copernicus Sentinel data are free and open (credit "Contains modified Copernicus Sentinel data [year]"); Landsat data from the USGS and NAIP from the USDA are public domain.
More MCP servers by Arhan Canli
Actions Check: Checks GitHub Actions workflows: outdated actions, old Node runtimes, retired runners, injection.
Citation Check: Verifies citations: finds fabricated or mismatched references and retractions, returns clean BibTeX.
Config Check: Validates config files against their official schemas: tsconfig, compose, workflows, 1,400+ more.
Contact Check: Validates and formats phone numbers, email addresses and postal addresses for any country.
Cron Check: Explains cron expressions, lists next run times in any time zone, converts between cron dialects.
Dockerfile Check: Checks Dockerfiles: build-breaking mistakes, base image tags that exist, digests, platforms, EOL.
Domain Health: Email and domain checks: SPF lookup limits, DKIM keys, DMARC, DNS records, registration expiry.
Drug Label: FDA drug label answers with section citations, RxNorm name resolution, recalls and shortages.
The whole collection, 12 more
License
MIT, Copyright (c) 2026 Arhan Canli.
Available Tools
2 toolsfind_imageryFind satellite imageryARead-onlyIdempotent
Finds satellite scenes of an area (bbox or lat/lon) between two dates: Sentinel-2, Landsat, Sentinel-1 radar or NAIP. Ranks by how much of the area each scene covers, cloud cover and date, and returns preview, true-colour image and STAC item links with the data licence.
Inputs: start (required), end, lat, lon, +6 more. Returns: area, scenes, matched, collection
scene_assetsScene bands and filesARead-onlyIdempotent
Lists the bands and files of one scene found with find_imagery: key, title, common band name, resolution, media type and download URL, with the scene's date, cloud cover, projection and footprint bbox.
Inputs: id (required), collection (required). Returns: id, assets
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: find_imagery searches and ranks scenes, while scene_assets retrieves file-level details for a specific scene. There is no overlap or ambiguity between them.
Both tool names follow a consistent verb_noun pattern (find_imagery, scene_assets), though scene_assets uses a noun-first structure rather than a verb. The pattern is still predictable and readable.
With only two tools, the server feels minimal but coherent: one for discovery and one for asset access. It is borderline because a satellite imagery workflow might expect additional operations like downloading or processing, but the two tools cover the core search-to-assets flow.
The server covers the essential discovery-to-asset pipeline, but lacks operations like direct download, scene metadata browsing, or comparison of multiple scenes. Agents can work around this by using the provided URLs, but the surface is thin for a full satellite imagery workflow.
Maintenance
Related MCP Connectors
Find recent or archived satellite imagery for any place on Earth by location and date.
Sentinel and Landsat imagery catalogue from Element 84's Earth Search over the AWS Open Data…
Earth-observation imagery catalogue from Microsoft's Planetary Computer — search its open…
Search, preview, and measure Umbra open SAR from any MCP client. Umbra ships no search API.
Related MCP Servers
AlicenseAqualityBmaintenanceLive search on six engines (Google, Bing, Yandex, Baidu, DuckDuckGo, Ecosia), image search and single/batch page extraction for AI agents. Keeps source engine and rank. Runs against a self-hosted OpenSERP server or OpenSERP Cloud.810320 npm3MIT- FlicenseNot gradedqualityAmaintenanceEnables fast, fresh webpage screenshots for AI vision workflows, including full-page tiling, element capture, and timed screencasts. Screenshots are optimized into 1072x1072 chunks and can return base64 images or save PNG/WebP files.-
- FlicenseNot gradedqualityAmaintenanceEnables searching Google, Bing, Yahoo, DuckDuckGo, YouTube, eBay and many other engines for real-time results like organic listings, news, images, shopping, weather and stock data, returned as JSON or Markdown. Also offers optional tools that render results as an interactive table or dashboard in supporting hosts.-
- FlicenseNot gradedqualityAmaintenanceEnables querying Google, Bing, Yahoo, DuckDuckGo, YouTube, eBay and many other engines to retrieve organic results, news, images, shopping, weather and stock data in real time. Returns structured JSON or token-efficient Markdown, with optional interactive table and dashboard views.-