EO-MCP
Click on "Install 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., "@EO-MCPFind clearest Sentinel-2 scene over [73,33.65,73.12,33.75] and compute NDVI."
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.
EO-MCP
EO-MCP is a Python Model Context Protocol (MCP) server for discovering and analysing Sentinel-2 Level-2A imagery. It gives AI agents a small, focused toolset for finding scenes, checking their suitability, computing spectral indices, and summarising an index inside a polygon.
The server reads only the required windows from cloud-optimized GeoTIFFs hosted by the Microsoft Planetary Computer. It does not download complete Sentinel-2 scenes.
Features
Search the live Sentinel-2 L2A STAC catalog by bounding box, date, and cloud cover.
Inspect scene-level cloud and nodata metadata before performing analysis.
Confirm that a scene footprint covers the requested area of interest.
Compute NDVI, NDWI, and NBR from remote raster windows.
Calculate polygon-clipped min, max, mean, and pixel count.
Return structured, agent-friendly results with processing metadata.
The intended workflow is:
stac_search → scene_quality → compute_index
└─→ quick_statsAlways call scene_quality before computing an index.
Related MCP server: Planetary Computer MCP Server
Tools
Tool | Purpose | Key inputs |
| Find the clearest Sentinel-2 L2A scenes intersecting an area. |
|
| Check cloud cover, nodata, and scene-footprint coverage. |
|
| Compute summary statistics for NDVI, NDWI, or NBR over a rectangular area. |
|
| Compute index statistics clipped to a WGS84 GeoJSON Polygon or MultiPolygon. |
|
Bounding boxes use WGS84 coordinates in this order:
[west, south, east, north]Dates use ISO YYYY-MM-DD format.
Supported indices
Index | Formula | Typical use |
NDVI |
| Vegetation condition and greenness |
NDWI |
| Surface-water detection |
NBR |
| Burn severity and fire impact |
Sentinel-2 digital numbers are converted to reflectance before the index is calculated. EO-MCP also accounts for the offset introduced with processing baseline 04.00 and later.
Requirements
Python 3.12 or newer
Internet access to the Planetary Computer STAC API and Sentinel-2 COG assets
No Planetary Computer API key is required for the current public-data workflow.
Quick start
From the repository root:
uv sync --frozen
uv run python -c "import eo_mcp; print('eo_mcp import: ok')"
uv run fastmcp inspect src/eo_mcp/app.pyThe inspect command should report the server name EO-MCP and four tools.
To start the STDIO server manually:
uv run fastmcp run src/eo_mcp/app.pyAn STDIO server waits for an MCP client and usually produces no interactive
prompt. Use an MCP client or fastmcp call to invoke its tools.
Test from the command line
Search for Sentinel-2 scenes:
uv run fastmcp call \
--server-spec src/eo_mcp/app.py \
--target stac_search \
--input-json '{
"bbox": [73.0, 33.65, 73.12, 33.75],
"start_date": "2024-06-01",
"end_date": "2024-08-31",
"max_cloud_cover": 10,
"limit": 1
}' \
--jsonCheck the selected scene:
uv run fastmcp call \
--server-spec src/eo_mcp/app.py \
--target scene_quality \
--input-json '{
"scene_id": "S2B_MSIL2A_20240603T054639_R048_T43SCT_20240603T090813",
"bbox": [73.0, 33.65, 73.12, 33.75]
}' \
--jsonCompute NDVI after the quality check passes:
uv run fastmcp call \
--server-spec src/eo_mcp/app.py \
--target compute_index \
--input-json '{
"scene_id": "S2B_MSIL2A_20240603T054639_R048_T43SCT_20240603T090813",
"bbox": [73.0, 33.65, 73.02, 33.67],
"index_name": "NDVI"
}' \
--jsonFor the installed FastMCP version, pass src/eo_mcp/app.py as the server
specification without appending :mcp.
Connect to Codex or another MCP client
EO-MCP currently runs as a local STDIO server. Configure the client with an absolute project path so it can launch the server from any working directory.
{
"mcpServers": {
"eo-mcp": {
"command": "uv",
"args": [
"run",
"--project",
"/absolute/path/to/eo-mcp",
"--frozen",
"fastmcp",
"run",
"/absolute/path/to/eo-mcp/src/eo_mcp/app.py"
]
}
}
}If the client cannot find uv, replace "uv" with the absolute path returned
by:
command -v uvWith the Codex CLI, the equivalent registration command is:
codex mcp add eo-mcp -- \
/absolute/path/to/uv run \
--project /absolute/path/to/eo-mcp \
--frozen fastmcp run \
/absolute/path/to/eo-mcp/src/eo_mcp/app.pyRestart the client or open a new session after saving the configuration. In
Codex, use /mcp to confirm that eo-mcp is connected.
Example agent request:
Find a low-cloud Sentinel-2 scene for Lahore during July 2026. Check the
scene's quality, then compute NDVI for a small area and report the mean.GeoJSON polygon example
quick_stats accepts either a GeoJSON geometry or a GeoJSON Feature:
{
"type": "Polygon",
"coordinates": [
[
[73.002, 33.652],
[73.018, 33.652],
[73.018, 33.668],
[73.002, 33.668],
[73.002, 33.652]
]
]
}Coordinates must be WGS84 longitude/latitude values. Polygon and MultiPolygon geometries are supported.
How index processing works
EO-MCP retrieves the requested STAC item and signs its asset URLs.
It transforms the WGS84 area into the source raster coordinate system.
Rasterio reads only the intersecting COG window over HTTPS.
Bands on a different grid are aligned to the reference band.
Digital numbers are converted to reflectance and the selected index is calculated.
The server returns statistics and processing metadata rather than the full raster array.
compute_index reports min, max, mean, median, standard deviation, 2nd and
98th percentiles, pixel counts, CRS, resolution, and the source window.
quick_stats clips the index raster to the supplied polygon and reports min,
max, mean, and count.
Quality rules and operational limits
A scene is marked usable when all of the following are true:
Scene-level cloud cover is at most 20%.
Scene-level nodata is at most 10%.
The scene footprint covers at least 99% of the requested area.
Important limitations:
Cloud and nodata percentages come from scene-level STAC metadata; they are not calculated specifically for the requested bounding box.
Index calculations do not apply a per-pixel cloud mask. Select a suitable scene with
scene_qualityfirst.A rectangular index request is limited to 4,000,000 reference-grid pixels. Reduce the bounding box if this limit is exceeded.
compute_indexsummarises the full rectangular window. Usequick_statswhen results must be clipped to an exact administrative, farm, water, or other polygon boundary.Signed Planetary Computer asset URLs expire. Search again instead of storing them as permanent download links.
Large requests depend on remote-network speed and upstream service availability.
Project structure
eo-mcp/
├── pyproject.toml
├── src/
│ └── eo_mcp/
│ ├── __init__.py
│ ├── app.py # FastMCP server and registered tools
│ ├── tools.py # STAC, raster, index, and zonal-stat logic
│ └── utils.py # Input validation helpers
└── README.mdTechnology
FastMCP for the MCP server
PySTAC Client for STAC discovery
Microsoft Planetary Computer for the Sentinel-2 L2A catalog and signed assets
Rasterio and NumPy for windowed raster processing
Rasterstats and Shapely for polygon statistics
uvfor dependency and project management
Remote deployment
STDIO is intended for local clients. To share EO-MCP across machines, expose it using FastMCP's Streamable HTTP transport, add authentication, and deploy it on a Python or container hosting platform. Do not publish an unauthenticated analysis endpoint to the public internet.
See the FastMCP HTTP deployment guide for the supported remote-server patterns.
Available Tools
4 toolscompute_indexA
Compute NDVI, NDWI, or NBR after checking the scene with scene_quality.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | ||
| scene_id | Yes | ||
| index_name | No | NDVI |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only states the core function without revealing side effects, error handling, or safety properties. The behavior regarding scene quality failure is not addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence efficiently conveys the purpose and a key prerequisite. No extraneous information, but slightly more detail on parameters could be included without harming conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, return values need not be described. The description mentions a prerequisite (scene_quality) and lists index options, but fails to explain bbox and scene_id, leaving the tool incomplete for a 3-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description adds meaning only for index_name by listing possible indices (NDVI, NDWI, NBR). Bbox and scene_id remain unexplained, leaving significant gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'compute' and the specific resources 'NDVI, NDWI, or NBR', distinguishing it from siblings like scene_quality and stac_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises checking the scene with scene_quality first, providing clear context for when to use this tool. However, no exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quick_statsC
Return zonal index statistics inside a WGS84 GeoJSON polygon.
| Name | Required | Description | Default |
|---|---|---|---|
| polygon | Yes | ||
| scene_id | Yes | ||
| index_name | No | NDVI | |
| all_touched | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavioral traits, but it only states the basic action. It does not mention performance implications, error handling, data limits, or side effects. For example, it is silent on whether the polygon must be simple, what happens if the scene_id is invalid, or if the tool modifies data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence of 8 words, which is efficient but overly terse given the tool's complexity. It front-loads the core action, but could add essential parameter details without losing conciseness. It is acceptable but not optimally balanced.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters (2 required), a nested object, and an output schema, the description is too sparse. It does not explain the return structure, the role of the polygon and scene_id, the default index, or the 'all_touched' flag. Although an output schema exists, the description should provide enough context to understand the tool's scope and usage, which it fails to do.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% documentation coverage (no descriptions in the schema properties), so the description must compensate. However, it adds no meaning beyond the parameter names: it does not explain what 'polygon' (expected format), 'scene_id' (identifier meaning), 'index_name' (valid values beyond NDVI), or 'all_touched' (behavior) entail. The description fails to provide any parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns zonal index statistics within a WGS84 GeoJSON polygon. The verb 'Return' and resource 'zonal index statistics' are specific, and the scope distinguishes it from siblings like 'scene_quality' (quality metrics) and 'compute_index' (index computation).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites, constraints, or when not to use it. The description only states what the tool does, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scene_qualityB
Check scene cloud, nodata, and AOI coverage before index computation.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | ||
| scene_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It only mentions 'check' but does not disclose if the tool is read-only, what side effects occur, or what happens if checks fail (e.g., errors or warnings).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 8 words, with no redundant information. It is efficiently front-loaded with the purpose, though it could benefit from additional structure like bullet points or examples.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema (not shown), the description does not need to detail return values. However, it lacks information on parameter semantics and behavioral details, making it minimally complete for a two-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so description must compensate. It mentions 'cloud, nodata, and AOI coverage' but does not explain how the two parameters ('scene_id' and 'bbox') relate to these concepts. No details on format or constraints are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Check' and specifies the resources: 'scene cloud, nodata, and AOI coverage'. It also provides context ('before index computation'), which distinguishes it from sibling tools like 'compute_index' or 'stac_search'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is a prerequisite for index computation but does not explicitly state when to use it versus alternatives like 'quick_stats' or 'compute_index'. No exclusions or specific conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_searchC
Find clear Sentinel-2 L2A scenes over an area and date range.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | ||
| limit | No | ||
| end_date | Yes | ||
| start_date | Yes | ||
| max_cloud_cover | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It mentions 'clear' but does not explain the behavior (e.g., cloud filtering). Missing details on pagination, results format, or any side effects. The output schema exists but is not referenced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, 12 words front-loaded with the verb and resource. No extraneous information; every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters (3 required) and an output schema, the description is too brief. It fails to describe parameter roles, return values, or how it pairs with sibling tools. The output schema exists but is not leveraged in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%. The description hints at 'area and date range' but does not explicitly map to the 'bbox', 'start_date', 'end_date' parameters. 'Clear' suggests cloud cover but does not explain 'max_cloud_cover'. Format requirements for dates or bounding boxes are omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Find' and resource 'clear Sentinel-2 L2A scenes', and mentions key constraints ('over an area and date range'). It distinguishes from siblings like 'compute_index' by focusing on scene retrieval, though not explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like 'scene_quality' or 'compute_index'. No exclusions or context for appropriate usage are provided.
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. Dates show when Glama detected each change.
4 tool updates
v0.1.0- First observed
compute_index - First observed
quick_stats - First observed
scene_quality - First observed
stac_search
TDQS
Each tool has a clearly distinct purpose: searching for scenes, checking scene quality, computing indices, and getting statistics. No overlap or ambiguity.
All tool names use snake_case with a noun_noun or verb_noun pattern (e.g., stac_search, scene_quality). While not all are strictly verb_noun, they are consistent in format and readable.
Four tools is appropriate for the domain of satellite imagery analysis, covering the essential workflow from search to statistics without unnecessary bloat.
The tool set covers the key steps: search, quality check, index computation, and statistics. A minor gap is the lack of scene metadata retrieval, but stac_search likely provides some metadata.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Geospatial AI MCP server — satellite imagery, embeddings, weather, GNS governance
Real-time planetary signal engine and Model Context Protocol (MCP) server for autonomous AI agents.
- earthOAuthcom.mireye
MCP server for Mireye Earth — federal-source-cited geospatial data for any MCP-aware agent.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for interacting with Google Earth Engine, enabling geospatial analysis such as dataset visualization, statistics computation, and search via AI assistants.14MIT
- AlicenseAqualityCmaintenanceA Python MCP server that provides unified access to satellite and geospatial data through natural language queries, with automatic place name geocoding and support for raster, vector, and Zarr formats.24Apache 2.0
- AlicenseNot gradedqualityAmaintenanceAn MCP server that connects AI agents to cloud-native geospatial data via STAC metadata and DuckDB with H3 spatial indexing, enabling zero-configuration SQL queries on terabyte-scale datasets over S3.23BSD 3-Clause
- AlicenseCqualityCmaintenanceMCP server for the Geopera geospatial data platform that enables AI agents to discover imagery, place and manage orders, and run analytics using the same API as other Geopera clients.100MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/ShafHaider007/eo-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server