yellide

Every species documented from India: open records, states, biogeographic regions and IUCN Red List status; count and list species by group, state or threat. Hosted at https://yellide.com/mcp, no key.

Hosted MCP Server

npx add-mcp 'https://yellide.com/mcp'

Installs into Claude Code, Codex, Cursor and more

Documentation

yellide

Species of India: find species, where they occur, and their conservation status, from open biodiversity data.

yellide (ಎಲ್ಲಿದೆ, Kannada for "where is it?") is the master list of India's species, and what changes in it each week. It was called Overlooked until November 2026, when the site moved from overlooked-india.pages.dev to yellide.com (11 Nov 2026).

Code licence: MIT Data licence: CC BY 4.0 Live site: yellide.com Checks MCP Registry: io.github.sathya-sankaran/yellide Runs on Cloudflare yellide MCP connector: tool definition quality and endpoint health on Glama yellide MCP connector on mcptry

The yellide home page: seven gaps in what we know about the species of India, with the share of documented species where each is known

Contents

What it does

yellide joins the public sources on India's species into one list: GBIF, iNaturalist, the Zoological and Botanical Surveys of India (checklists and annual discoveries), Kew WCVP, the lichen and bryophyte checklists of India, Plazi, Catalogue of Life and the IUCN Red List.

For each species, group, state and biogeographic region it shows:

  • whether the species has an open record (a specimen, photo or sighting anyone can check online);
  • how many observations of it wait for a name;
  • its IUCN status.

Species pages add evidence (type specimens, photos, DNA barcodes), interactions (GloBI), population trends (IUCN, State of India's Birds) and names in Indian languages (Wikidata).

Each week it builds a new dated list from the sources and compares it with the week before. It holds no sightings and takes no user input; every figure links back to its source. The larger aim is to track the health of India's species over time. It follows the data story The Overlooked Species.

Features

PageWhat it shows
/ ExploreSpecies of India by group and state: the seven gaps in what we know, open records, observations that wait for a name, IUCN status; search by Latin or English name.
/species/<key>/<slug>One species, for example Ardeotis nigriceps: its sources, the seven gaps, its web of partners (GloBI), map by district, records by decade, IUCN status and trend, evidence, photo, names in Indian languages, observations that wait for a name.
/inPlace pages: /in/<place> and /in/<place>/<group> ("Birds of Kerala"), with counts, threatened and endemic species, and every species linked.
/changesThe totals by week as tiles and a chart, then what moved since last week: IUCN category changed; a first open record in India or in a state; added to or taken off the list.
/fixRecords to fix, for data publishers: GBIF records from India with no exact place or no species name, by dataset, state and group.
/shortlistExperimental. Observations on iNaturalist that wait for a name, each with a short list of names from a model, for a person to check on iNaturalist.
/methodSources, credit, method, health of the sources at the last run, downloads.
/mcpFor people: how to add the MCP server to an AI assistant. For AI assistants: the MCP server itself (same address).

Other things worth knowing:

  • No coordinates are published. The smallest area shown is a district; the MCP server answers only by state or biogeographic province.
  • Open data: the site reads its files through /data/<key> (CORS open). The data layout for people and agents is in /llms.txt.
  • Species pages are served at their own address with a title, description, canonical address and schema.org Taxon in the HTML, so search engines and link previews see them.

The species page for the Great Indian Bustard (Ardeotis nigriceps): IUCN CR, population decreasing, open records in 9 states, and the seven gaps for this species   The yellide home page on a phone

Species page photo: Parth Kansara, CC BY 4.0, via iNaturalist.

Use it from an AI assistant (MCP)

yellide runs a remote Model Context Protocol server. It is read only, needs no key and no account, and reads the same weekly list as the site.

Claude Code:

claude mcp add --transport http --scope user yellide https://yellide.com/mcp

Codex:

codex mcp add yellide --url https://yellide.com/mcp

Any other client: add a remote (HTTP) server with the URL https://yellide.com/mcp.

ToolWhat it does
find_speciesFind species of India by Latin name or English common name ("great indian bustard", "naja", "cobra"). Returns up to 10 species with their key, group, IUCN category and status.
get_speciesOne species by its key: sources that list it, open record, states with an open record, WII regions, IUCN category with year, DOI and trend, endemic, year described and authority, family and order, evidence, names in Indian languages, a photo with its credit, and iNaturalist observations that wait for a name.
count_speciesHow many species: documented, with an open record, threatened (IUCN CR, EN, VU), recorded in the last 10 years, endemic, and per IUCN category. Optional filters combine: "threatened birds in Kerala", "endemic frogs of the Western Ghats".
list_speciesList species with the same filters: "snakes of the Western Ghats", "birds of Goa recorded since 2020". Up to 100 rows per page, with the total and a cursor for the next page.
new_speciesSpecies described from India since a year (2007 or later), from Plazi, BSI Plant Discoveries and ZSI Animal Discoveries: year, group, state of the type locality, journal and a link to the paper, and whether it has been recorded since.

Filters for count_species and list_species: group, state, region (WII biogeographic zone or province), iucn, endemic, order, suborder, family, open_record, recorded_since, described_since. The server also offers the resources yellide://about, yellide://groups, yellide://states and yellide://regions.

Try it without an assistant:

curl -s https://yellide.com/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"count_species",
       "arguments":{"region":"Western Ghats","iucn":["threatened"]}}}'

Data sources and attribution

yellide reads these sources. Each keeps its own licence and is credited on the site, next to the figures that use it and in the footer.

SourceUsed forLicence or terms
GBIF.orgOccurrence records from India (four SQL downloads a week, each with its own DOI, cited on the site); name matchingGBIF terms; each dataset keeps its licence
Catalogue of Life (ChecklistBank)Names, classification, year describedCC BY 4.0
Royal Botanic Gardens, Kew (WCVP)Plant names and year describedCC BY 4.0
iNaturalistSpecies per state, research grade and needs ID; photosEach photo keeps its own Creative Commons licence, credited under it
PlaziNew species described from IndiaCC0
Botanical Survey of IndiaNational checklists, Plant Discoveries, Indian Virtual HerbariumReproduced with acknowledgement under BSI's web policy
Zoological Survey of IndiaAnimal DiscoveriesReproduced with acknowledgement under ZSI's website policy
Lichen checklist of IndiaNames, endemic mark, states (counts only)Sinha, Nayaka and Mishra (2024), doi:10.21756/cab.v8i2.01, CC BY-NC 4.0
Bryophyte checklist of IndiaNames (counts only)Dandotiya et al. (2011), Archive for Bryology 88: 1-126; no open licence, cleared for this use
IUCN Red ListCategory per species (from the GBIF copy, DOI 10.15468/0qnb58) and population trendIUCN (2026). The IUCN Red List of Threatened Species. Version 2026-1. Accessed via GBIF.org
GloBIInteraction partners (counts and partner names, never rows)Cite Poelen, Simons and Mungall (2014); each dataset keeps its licence
BOLD SystemsSpecies with a DNA barcode from India (counts)Credited
Wikidata and Wikimedia CommonsNames in Indian languages; photosWikidata CC0; each Commons photo keeps its licence, credited under it
State of India's BirdsBird population trendsMIT; doi:10.5281/zenodo.11124589
Bibliography of South Asian OrnithologyPapers per bird (counts and years, never the records)Compiled by Aasheesh Pittie; no licence stated; counts published with credit, with approval
Local Government Directory and Wildlife Institute of India biogeographic zones, via bharatlasDistricts; 10 zones and 26 provinces (Rodgers, Panwar and Mathur)LGD CC0-1.0 / CC BY 4.0; WII zones GODL-India

Limits, terms and how each source is used: docs/sources.md.

How it works

GitHub Actions (weekly / daily)                      R2 overlooked-data          Cloudflare Pages
  request.yml + build.yml  -> GBIF snapshot      ->   snapshots/<week>/      \
  inat.yml                 -> iNaturalist layer  ->   layers/inat/<week>/     |
  newspecies.yml           -> new-species layer  ->   layers/newspecies/<week>/  -> master.yml -> layers/master/<week>/ -> /data/*, /mcp -> pages, agents
  globi.yml, iucn.yml      -> GloBI, IUCN trends ->   cache/ (internal)      /
  (BSI, ZSI, Kew, CoL, IUCN, lichens, bryophytes, BOLD, Wikidata, SoIB, Zotero read by master.py)
This machine (India)
  experiments/corpus_v0    -> shortlists (model, corpus, photos stay here) -> layers/shortlist/<run>/ (JSON only)
  • Pipeline (Python, pipeline/). GitHub Actions run the weekly GBIF snapshot and the daily layers, and write everything to Cloudflare R2. pipeline/master.py (master.yml, daily) joins the newest snapshot and layers with the other sources into layers/master/<week>/<build>/, plus the change feed and the MCP index. A build never changes once written; <week>/current.json and latest.json are written last, so the site reads one build or the other, never a mix.
  • Site (site/). Static HTML and JavaScript on Cloudflare Pages.
  • Pages Functions (functions/). /data/<key> streams files from R2. /mcp is the MCP server. /species/... and /in/... render species and place pages with their metadata. /sitemaps/* serves the species and place sitemaps.
  • D1. functions/_middleware.js keeps aggregate daily counts in D1: no IP, no cookies, no per-user rows (docs/metrics.md).
  • Shortlists are made on a machine in India, not on GitHub Actions: the corpus, image features and model stay there; only JSON rows go to R2 (docs/shortlist_data.md).

A week is named by its Monday in UTC (2026-10-26). Lists before 27 October 2026 were monthly (2026-10).

Workflows, steps of a snapshot, and why it is safe to run again

Workflows

WorkflowWhen (UTC)What it does
request.yml02:17 on Mondays, and by handChecks every source. Sends the first GBIF download request. Commits the run state to runs/<week>.json.
build.ymlEvery 6 hours, Monday to Thursday (at :47), and by handSends the next GBIF download when the last one is ready. When all are ready: builds, checks and publishes the snapshot to R2.
inat.yml05:23 daily, and by handiNaturalist layer: species per state, research grade and needs ID (about 1,400 requests a week, under 9,000 a day).
newspecies.yml06:41 daily, and by handNew-species layer: names from Plazi, BSI Plant Discoveries and ZSI Animal Discoveries, two GBIF downloads, matching.
master.yml10:37 daily, and by handMaster list, the change feed and the MCP index. Does nothing when no input changed.
globi.yml04:41 on Wednesdays, and by handGloBI interactions, only when GloBI's snapshot changed.
iucn.yml03:29 on the 3rd of each month, and by handIUCN Red List API: the population trend of each assessed species (needs IUCN_TOKEN).
checks.ymlEvery push to main and every pull requestRuns the tests.

Scheduled runs need the repository variable PIPELINE_ENABLED=true. Runs started by hand always work. A failed run comments on the open " failed" issue, or opens one (scripts/report_failure.sh).

Master list retention: this week keeps its current build and the one before; a past week keeps only its last build; GBIF snapshots are kept.

Steps of a snapshot

  1. Check the sources. One request to each source (pipeline/health.py). If GBIF or R2 does not answer, the run stops and opens an issue. If another source does not answer, that source keeps the data of the last run.
  2. Download. Four GBIF SQL downloads, one after another, each with its own DOI:
    • A, ledger_cube: species at each point (coordinates rounded to 3 decimals), first and latest year, records.
    • C, species_history: names, classification, and records by decade and kind of record.
    • U, unresolved_cube: records named only to genus, family or higher, with the genus.
    • L, unlocated_cube: records with no coordinates, by taxon, state as written, dataset and kind of record.
  3. Place. Each point goes to its LGD district and to its WII biogeographic province. A point less than 5 km from land goes to the nearest district; a point farther out is offshore. A record with no coordinates goes to a state when its state text names one (old names too, such as Orissa). If not, it has no place.
  4. Compute. The ledger, the page data (small JSON files per area), the species files, the records with no species name, unlocated.json, and the change feed against the previous snapshot.
  5. Check. Every download has a DOI; the ledger is not empty; species and ledger rows did not change by more than 20% from the last run. Records with no coordinates are not empty, and did not change by more than 20% if the last run has them.
  6. Publish. Files go to R2 under snapshots/<week>/, the manifest last, then latest.json.

Safe to run again

  • A finished step is not done again. Download keys and downloaded files are reused.
  • A build is skipped if a snapshot from the same inputs (download keys and boundary checksum) exists.
  • R2 uploads skip files that are already there with the same SHA-256, so a stopped upload continues.
  • A published snapshot never changes. Files derived later are added as new files only (scripts/backfill_derived.py).
  • If GBIF reports no India record added, changed or re-processed since the last published run, the week downloads nothing.

Project layout

pipeline/        Python pipeline: sources, GBIF downloads, master list, change feed, MCP index, R2 upload
functions/       Cloudflare Pages Functions: /data, /mcp, /species, /in, /sitemaps, /go, metrics middleware
  lib/           Shared code: mcp.js (the MCP server), species_page.js, place_page.js, metrics.js
site/            The static site served by Cloudflare Pages (HTML, assets, llms.txt, robots.txt, _routes.json)
site-parts/      Shared header, footer and head, copied into site/ by scripts/pages.py
migrations/      D1 schema for the usage counters
scripts/         Local server, page builder, backfills, failure reporting
tests/           Python tests (test_*.py) and Node tests (*.test.mjs)
.github/         Workflows and the issue template
runs/            Run state of each weekly snapshot (committed by request.yml)
experiments/     Shortlist corpus and model work (needs its own environment)
docs/            Sources, metrics, plan, progress, shortlist data contract, screenshots
server.json      The MCP Registry entry
PDGI.md          How the project follows People's Digital Goods and Infrastructure principles

Development

Needs Python 3.11 or later (CI uses 3.12) and Node 22.

git clone https://github.com/urbanmorph/overlooked.git
cd overlooked
python3 -m venv .venv && .venv/bin/pip install -e ".[dev]"

Run the checks (the same as checks.yml):

.venv/bin/python -m pyflakes pipeline tests scripts   # lint
.venv/bin/pytest -q                                   # Python tests
node --test tests/*.test.mjs                          # Node tests (functions and site scripts)

Work on the site:

.venv/bin/python scripts/serve.py    # the site at http://127.0.0.1:8790/
.venv/bin/python scripts/pages.py    # after editing site-parts/ or site/assets/: shared parts, and ?v= versions on every script and stylesheet

Run the pipeline:

.venv/bin/python -m pipeline.health                       # check every source
.venv/bin/python -m pipeline.run request --state Kerala   # a test run for one state (never published)
.venv/bin/python -m pipeline.run build --run-id <week>-kerala

Secrets go in .env (never committed): GBIF_USER, GBIF_PASSWORD, GBIF_EMAIL, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_ENDPOINT, R2_BUCKET, IUCN_TOKEN. GitHub Actions has the same names as repository secrets. The tests need none of them.

Deploy

The site deploys through Cloudflare Pages' git integration: a push to main builds and publishes site/ with the Functions in functions/. The Functions read R2 (the overlooked-data bucket, binding DATA) and D1 (the DB binding, optional; without it nothing is counted). Data is not part of the deploy: the GitHub Actions workflows publish it to R2, and the site reads it through /data/*. Only the small pointer site/data/latest.json is committed, by build.yml after it publishes a snapshot, and that commit starts a Pages build.

Contributing

Issues and pull requests are welcome at github.com/urbanmorph/overlooked.

  • Run the checks above before opening a pull request; checks.yml runs them on every pull request.
  • If you edit site-parts/ or site/assets/, run scripts/pages.py and commit the result.
  • A new source needs its limits and terms recorded in docs/sources.md and its credit on the site.
  • If showing a species by district puts it at risk, use the sensitive species location issue form. Do not write any location in it.

Plan and decisions: docs/plan.md. Progress: docs/progress.md. Usage counts: docs/metrics.md. How the project follows PDGI: PDGI.md.

Licence

  • Code: MIT, Sathya Sankaran.
  • Data and text on the site: CC BY 4.0, Sathya Sankaran.
  • Each source keeps its own licence and is credited on the site.