# bhoonidhi-mcp (pypi · bhoonidhi-mcp)

Search, save, and download satellite scenes from ISRO's Bhoonidhi portal in natural language.

- Trust score: 76/100 (medium)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-21

## Components

- pypi · `bhoonidhi-mcp`: 76/100 (this document), [markdown](https://verifymcp.io/servers/geovicco-dev-bhoonidhi-mcp/bhoonidhi-mcp.md), [page](https://verifymcp.io/servers/geovicco-dev-bhoonidhi-mcp/bhoonidhi-mcp)

## Channel facts

- Registry: `pypi`
- Package: `bhoonidhi-mcp`
- Version: `0.3.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-21.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it.
  - 4 of 46 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 32/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - License check failed: no license is declared.
  - Actively maintained (last published 18 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 83/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2401 tokens (~150/item across 16 items; 15 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 63/100
  - Stability observed for 19 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 67/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 16 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the bhoonidhi-mcp server?

bhoonidhi-mcp runs locally as a PyPI package, launched with uvx bhoonidhi-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add geovicco-dev-bhoonidhi-mcp -- uvx bhoonidhi-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "geovicco-dev-bhoonidhi-mcp": {
      "command": "uvx",
      "args": [
        "bhoonidhi-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "geovicco-dev-bhoonidhi-mcp": {
      "command": "uvx",
      "args": [
        "bhoonidhi-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add geovicco-dev-bhoonidhi-mcp -- uvx bhoonidhi-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "geovicco-dev-bhoonidhi-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "bhoonidhi-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add geovicco-dev-bhoonidhi-mcp --command uvx --arg bhoonidhi-mcp
```

### Hermes

```yaml
mcp_servers:
  geovicco-dev-bhoonidhi-mcp:
    command: "uvx"
    args: ["bhoonidhi-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "geovicco-dev-bhoonidhi-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "bhoonidhi-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add geovicco-dev-bhoonidhi-mcp -t stdio -c uvx -a bhoonidhi-mcp
```

### Other

```json
{
  "mcpServers": {
    "geovicco-dev-bhoonidhi-mcp": {
      "command": "uvx",
      "args": [
        "bhoonidhi-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-21 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-19 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-17 (score 74, +1)

No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-15 (score 73, +1)

No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-13 (score 72, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-11 (score 71, +1)

No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-09 (score 70, +3)

- [functional improvement] Stability: unverified → 0.23

### 2026-09-03 (score 67, +15)

- [security improvement] Malware scan: unverified → pass

## MCP tools (15)

### `list_archive` (~70 tokens)

List every satellite and sensor the Bhoonidhi portal supports.

Returns the vocabulary of valid satellites, sensors, and exact search
tokens, with each product's resolution and date coverage. Call this to
discover what can be searched. Set refresh=True to bypass the local cache.

Input parameters:

- `refresh` (boolean)

### `resolve_location` (~84 tokens)

Resolve a place name to a centroid and bounding box.

Turns a place like "Shillong" or "Loktak Lake" into latitude/longitude and a
bounding box (minx, miny, maxx, maxy) that search_scenes can use as its area
of interest. Returns found=False when the place can't be resolved.

Input parameters:

- `name` (string, required)

### `search_scenes` (~442 tokens)

Search Bhoonidhi scenes for a satellite over an area and date range.

The satellite may be a casual name ("Sentinel-2", "cartosat"); it is matched
to the portal's exact tokens, and a constellation expands to all its
platforms. Dates are ISO (YYYY-MM-DD). Give the area either as a bounding box
(minx/maxx/miny/maxy) or a point with radius (lat/lon/radius_km) — typically
from resolve_location. sensor narrows to one sensor on the matched
satellite(s) (e.g. "SSAR", "LISS3"); product further narrows to one product
under that sensor (e.g. "GCOV", "L2C-Chlorophyll") — see list_archive for the
exact sensor/product names each satellite carries. The search is stateless
and needs no login.

If the satellite name is ambiguous, returns status="ambiguous_satellite"
with candidate names instead of guessing.

Each scene carries an "availability": Ready (downloadable now), Archived
(open data but may need a portal request first), OnOrder (must be requested),
or Priced (must be purchased). The result includes a plain-English "summary"
of these counts and a "how_to_act" block. Tell the user clearly when scenes
are Archived, OnOrder, or Priced and what each needs. This search is
stateless: to act on these scenes, call save_query with the same arguments to
persist them and get a <slug>, then download_query (open data) or cart_add
(on-order / priced) on that slug — both need a login (see auth_status).
Downloads cannot be resumed if interrupted (the portal has no range support).

Input parameters:

- `end_date` (string, required)
- `lat`
- `lon`
- `maxx`
- `maxy`
- `minx`
- `miny`
- `product`
- `radius_km`
- `satellite` (string, required)
- `sensor`
- `start_date` (string, required)

### `preview_download` (~287 tokens)

Dry-run a download for a search: show what would be fetched, no login.

Takes the same arguments as search_scenes, plus out_dir (where files would
go) and force (preview re-downloading files already present). It runs the
search and predicts, per scene, what a real download would do: would_download
(staged, ready), may_404 (open data but archived — attempted but may fail
until requested on the portal), already_here / already_elsewhere (a matching
file exists), or skipped_on_order / skipped_priced (needs the portal).

Use this before telling a user to download, so they know how many scenes are
actually fetchable. Nothing is downloaded and no login is used. File sizes
are not known until a download starts (the portal exposes them only in the
download response headers), and interrupted downloads cannot be resumed —
both are stated in the result's disclaimers.

Input parameters:

- `end_date` (string, required)
- `force` (boolean)
- `lat`
- `lon`
- `maxx`
- `maxy`
- `minx`
- `miny`
- `out_dir` (string)
- `product`
- `radius_km`
- `satellite` (string, required)
- `sensor`
- `start_date` (string, required)

### `save_query` (~256 tokens)

Persist a search as a saved query and return a reusable slug.

Takes the same arguments as search_scenes, plus an optional name and
description. Unlike search_scenes (which is stateless and leaves nothing
behind), this saves the search on the portal so it can be acted on later:
the returned slug is what downloading and cart staging key off. Call this
once the user has confirmed a search returns the scenes they want, then hand
the slug to the bhd CLI (download / cart) until those actions land in-server.

Returns status="ok" with the slug and the shaped saved query. If the
satellite is ambiguous or the request is invalid, returns the same
status="ambiguous_satellite" / "invalid_request" shapes as search_scenes,
and saves nothing.

Input parameters:

- `description`
- `end_date` (string, required)
- `lat`
- `lon`
- `maxx`
- `maxy`
- `minx`
- `miny`
- `name`
- `product`
- `radius_km`
- `satellite` (string, required)
- `sensor`
- `start_date` (string, required)

### `list_queries` (~77 tokens)

List every saved query as compact summaries.

Returns each saved query's slug, name, date range, satellites, area of
interest, scene count, and a plain-English availability summary — but not
the full scene lists (call show_query for one query's scenes). Use this to
find the slug for a query the user saved earlier.

### `show_query` (~72 tokens)

Return one saved query by slug, with its scenes.

Give the slug from save_query or list_queries. Returns the full saved query:
its selections, area of interest, date range, and shaped scenes with
availability. Returns status="not_found" if no query has that slug.

Input parameters:

- `slug` (string, required)

### `remove_query` (~60 tokens)

Delete a saved query by slug.

Give the slug from save_query or list_queries. Removes the saved query from
disk; the scenes themselves are unaffected. Returns status="not_found" if no
query has that slug.

Input parameters:

- `slug` (string, required)

### `auth_status` (~131 tokens)

Report whether a Bhoonidhi login is configured for downloads and cart.

Never asks for or returns a password or token. If credentials are set in the
server's environment (BHOONIDHI_USERNAME / BHOONIDHI_PASSWORD) it establishes
the session so the answer matches what a download or cart action would find.
Returns authenticated=True with the username when a usable session exists, or
authenticated=False with guidance to log in ('bhd auth login' out of band, or
set those environment variables). Call this before download or cart actions
to tell the user if a login is needed.

### `download_query` (~276 tokens)

Download a saved query's open-access scenes in the background.

Give the slug from save_query or list_queries. Downloads run to a fixed,
server-configured root (BHOONIDHI_MCP_DOWNLOAD_ROOT, default ~/Downloads),
under a per-slug folder — you cannot choose an arbitrary path. select
narrows to specific scenes (1-based indices or full scene IDs); omit it for
the whole query. force re-downloads files already present.

Needs a login (see auth_status). Priced and on-order scenes are skipped —
stage those with cart_add instead. Returns immediately with a job_id: the
download runs on its own and does NOT depend on this conversation, so never
block by sleeping and re-polling. To follow it hands-free, delegate a
background watcher that loops download_wait on the job_id and reports back,
keeping you free to keep talking; the result's 'handoff' note says so. File
sizes are unknown until each transfer starts (the portal reveals them only
then); once a download proves large, download_status/download_wait flag it
and 'large_download' offers a standalone command that outlives this session.
Interrupted downloads restart from scratch (no resume support).

Input parameters:

- `force` (boolean)
- `select`
- `slug` (string, required)

### `download_status` (~137 tokens)

Check a background download started by download_query (one-off).

Give the job_id from download_query. Returns the live state: running (with
bytes_downloaded, mb_downloaded, rate_mb_s, percent when the total size is
known, and per-scene detail), completed (with per-scene outcomes), or failed
(with the error). Use this for a single progress check. To follow a job to
completion without tying up the conversation, use download_wait from a
delegated watcher instead. Jobs exist only while the server runs; an unknown
id returns status="not_found".

Input parameters:

- `job_id` (string, required)

### `download_wait` (~146 tokens)

Wait for a background download to finish, then report — for a watcher.

Give the job_id from download_query. Blocks inside the server and returns as
soon as the download completes or fails, or after timeout_s (capped at 120s)
with the latest progress if still running. This is the efficient way to
follow a job: a delegated background watcher calls it in a loop and stops
when status is "completed" or "failed", so the main conversation is never
blocked on sleeps. Prefer this over repeated sleep+download_status. An
unknown id returns status="not_found".

Input parameters:

- `job_id` (string, required)
- `timeout_s` (number)

### `cart_add` (~118 tokens)

Stage a saved query's scenes to the Bhoonidhi cart.

Give the slug from save_query or list_queries. Each scene is routed to the
cart its access type needs (ready / on-order / priced); select narrows to
specific scenes (1-based indices or scene IDs). Needs a login (see
auth_status). Use this for on-order and priced scenes; priced ones still
need purchasing on the portal afterwards. Returns counts of what was staged
and what failed.

Input parameters:

- `select`
- `slug` (string, required)

### `cart_list` (~121 tokens)

List scenes currently staged in the Bhoonidhi cart.

Cart items are filed by the date they were added; with no window this
shows today only, so pass since/until (ISO dates, e.g. "2026-08-10") or
last (e.g. "1 week") to widen it. filter_by limits to a state: ready,
archived, onorder, or priced. Needs a login (see auth_status).

Input parameters:

- `filter_by`
- `last`
- `since`
- `until`

### `cart_remove` (~106 tokens)

Remove scenes from the Bhoonidhi cart.

Two ways to address rows: pass slug to index a saved query's scenes, or
omit it and let select index the merged cart itself (the same row numbers
cart_list shows under the same since/until/last/filter_by window). Needs
a login (see auth_status).

Input parameters:

- `filter_by`
- `last`
- `select`
- `since`
- `slug`
- `until`

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/geovicco-dev-bhoonidhi-mcp/bhoonidhi-mcp#diagnostics

## Score history

- 2026-09-21: 76
- 2026-09-20: 75
- 2026-09-19: 75
- 2026-09-18: 74
- 2026-09-17: 74
- 2026-09-16: 73
- 2026-09-15: 73
- 2026-09-14: 72
- 2026-09-13: 72
- 2026-09-12: 71
- 2026-09-11: 71
- 2026-09-10: 70
- 2026-09-09: 70
- 2026-09-08: 67
- 2026-09-07: 67
- 2026-09-06: 67
- 2026-09-05: 67
- 2026-09-04: 67
- 2026-09-03: 67
- 2026-09-02: 52

## Common questions

### What is the bhoonidhi-mcp server?

bhoonidhi-mcp is listed in the public MCP registry as io.github.geovicco-dev/bhoonidhi-mcp. Search, save, and download satellite scenes from ISRO's Bhoonidhi portal in natural language. This page covers its PyPI package (bhoonidhi-mcp).

### Is the bhoonidhi-mcp server safe to use?

bhoonidhi-mcp scores 76 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the bhoonidhi-mcp server expose?

bhoonidhi-mcp exposes 15 tools: list_archive, resolve_location, search_scenes, preview_download, save_query, and 10 more. Their descriptions and schemas cost roughly 2,383 tokens of context every time the server is loaded.

### Is the bhoonidhi-mcp server still maintained?

bhoonidhi-mcp is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- PyPI project: https://pypi.org/project/bhoonidhi-mcp/
- Socket report: https://socket.dev/pypi/package/bhoonidhi-mcp
- Repository: https://github.com/geovicco-dev/bhoonidhi-mcp
- Website: https://geovicco-dev.github.io/bhoonidhi-mcp/
- Changelog RSS feed: https://verifymcp.io/servers/geovicco-dev-bhoonidhi-mcp/bhoonidhi-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/geovicco-dev-bhoonidhi-mcp/bhoonidhi-mcp.json
- HTML version of this page: https://verifymcp.io/servers/geovicco-dev-bhoonidhi-mcp/bhoonidhi-mcp
