Skip to main content
Glama
arhancanli

satellite-imagery-mcp

Satellite Imagery

CI npm downloads OpenSSF Scorecard License: MIT

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

Install in Cursor Install in VS Code Install in Goose

Needs Node.js 20 or newer. No account or key.

Claude Code

claude mcp add satellite-imagery -- npx -y satellite-imagery-mcp

Claude 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-mcp

Hosted (Streamable HTTP): node src/server.mjs --http serves stateless MCP at POST /mcp (port from PORT, default 3000).

Related MCP server: eo-mcp

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

find_imagery

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.

scene_assets

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.json under factory.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

7/10

17936

1039

15

3.9 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

  • Citation Check: Verifies citations: finds fabricated or mismatched references and retractions, returns clean BibTeX.

  • Drug Label: FDA drug label answers with section citations, RxNorm name resolution, recalls and shortages.

  • End of Life: Is this version still supported? EOL dates, latest patch and upgrade target for 470+ products.

  • Internet Standards: RFC sections, status, obsoleted-by chains, errata and IANA registries for coding agents.

  • Package Truth: Checks packages exist before install: version, deprecation, vulnerabilities, licence. 7 ecosystems.

  • Recall Check: One recall check across CPSC, FDA and NHTSA: match by name, model number, UPC or VIN.

  • The whole collection

License

MIT, Copyright (c) 2026 Arhan Canli.

Available Tools

2 tools
find_imageryFind satellite imageryA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoYYYY-MM-DD, default today
latNo
lonNo
bboxNo[west, south, east, north]
sortNo
limitNo
startYesYYYY-MM-DD
max_cloudNoPercent, default 20
radius_kmNoAround lat/lon; default 1
collectionNoDefault sentinel-2

Output Schema

ParametersJSON Schema
NameRequiredDescription
areaYes
scenesYes
matchedYes
collectionYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given the annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, the safety profile is covered. The description adds useful behavioral context beyond that: it explains that scenes are ranked by area coverage, cloud cover, and date, and that each result includes preview, true-colour image, and STAC item links with the data licence. This gives the agent a clear picture of what to expect from the call and how results are prioritized, which is valuable beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no fluff. It front-loads the core purpose (finding scenes), then lists supported sources and the ranking/return details. Every clause conveys useful information, and the structure leads with the most important facts, making it easy for an agent to grasp quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 10 parameters and an output schema present, the description covers the main functionality but is brief. It explains the purpose, supported collections, ranking, and return types, but does not elaborate on parameter interactions (e.g., how radius_km works with lat/lon, the behavior of sort options, or how limit affects results). Given the complexity, some information is left to the schema and the agent's inference, so the description is adequate but not fully comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 60%, leaving four parameters (lat, lon, sort, limit) without descriptions. The tool description indirectly clarifies that area can be specified via bbox or lat/lon, and it mentions the date range (implicitly start/end) and collections. However, it does not explain the meaning of sort, limit, or the default behaviors beyond what the schema already provides (e.g., default collection, default max_cloud). The description adds some meaning but does not fully compensate for the undocumented parameters, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb ('Finds satellite scenes of an area') and specifies the resource (satellite imagery), the area input (bbox or lat/lon), and date range. It also lists the supported collections (Sentinel-2, Landsat, Sentinel-1, NAIP) and what it returns (preview, true-colour image, STAC links). This is specific and distinguishes it from the sibling 'scene_assets', which implies asset-level operations, though it doesn't explicitly name the alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states what the tool does but provides no guidance on when to use it versus the sibling tool 'scene_assets' or any other alternative. It does not mention when not to use it, prerequisite conditions, or why one would choose this over another method. The usage is only implied (find imagery), not explicit, and there are no exclusions or conditional recommendations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scene_assetsScene bands and filesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
collectionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
assetsYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, establishing safety. The description adds value by enumerating the returned content (key, band name, resolution, etc.), giving the agent a concrete picture of the output without contradicting any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, information-dense sentence that front-loads the action and then lists the key details. It is efficient and readable, though the enumeration is slightly packed, which warrants a 4 rather than a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value details are already covered. The description gives enough context about the tool's purpose and its relationship to find_imagery. It does not mention prerequisites explicitly, but the phrase 'found with find_imagery' implies them. This is adequate for a simple read-only tool with annotations covering safety.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the burden falls on the description, but it only indirectly references parameters via 'one scene found with find_imagery'. It does not explain the format of 'id' or the meaning of 'collection' beyond the schema's enum. This is insufficient for a tool with two required parameters and no property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Lists') and the resource ('bands and files of one scene'), and explicitly ties it to find_imagery, distinguishing it from the sibling by focusing on per-scene details rather than scene discovery. This leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'found with find_imagery' implies the correct workflow: first locate scenes with find_imagery, then use this tool to retrieve bands/files for a specific scene. It does not explicitly state when NOT to use it, but the context is clear enough for an agent to infer the appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv0.1.0
    • First observedfind_imagery
    • First observedscene_assets

TDQS

A3.8/5.0

Scored across 2 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count3/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Provides tools to search, download, and manage satellite imagery from all Copernicus Sentinel missions via the Copernicus Data Space ecosystem. It enables advanced geospatial queries, temporal coverage analysis, and automated data management for Earth observation tasks.
    13
    7
    LGPL 3.0
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to autonomously discover, stream, and compute satellite analytics from free government Earth observation archives. Provides tools for STAC search, spectral indices, elevation profiles, SAR water detection, and sandboxed geospatial scripting.
    29
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables keyless search of the EU Copernicus Data Space catalogue, letting you find Sentinel-1/2/3/5P, DEM, land-cover, and burnt-area products by area and date and retrieve item ids, footprints, dates, and asset paths.
    MIT