io. github. cyanheads/ inaturalist-mcp-server
by cyanheads · remote · local (npm) · no sign-in to list tools · v0.2.2 · published by GitHub user cyanheads
Search iNaturalist sightings, identification threads, phenology, and look-alike species.
10 tools: 10 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things0Claude Code: ask
- Only reads10Claude Code: allow: see these tools
2 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http inaturalist https://inaturalist.caseyjhand.com/mcpFindings
Matches of fixed checks, with the text they matched.
The description names a tool "iNaturalist" that this server does not list.
What this check looks forMatched text
description: "Decode the vocabularies the other iNaturalist tools take as input: annotation attributes an..."
The description contains "every other tool", wording about other tools or servers.
What this check looks forMatched text
description: "...ked candidates carrying the identifiers every other tool takes. A miss is a result rather than a..."
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
10 tools
Only reads 10Claude Code: allow
inaturalist_find_placesResolve a place name to a place id, or list the places containing a map area.No findings
Why it is in this group
- The name "inaturalist_find_places" says "find": a word for reading.
Description, as the server wrote it Resolve a place name to a place id, or list the places containing a map area. Pass q to match a place-name PREFIX, or all four of nelat, nelng, swlat and swlng to list every place covering that box — exactly one of the two, never both. Each result carries the bounding box, place type, and containment chain an area search needs. Place geometry is stripped: a single nearby response carries 247 KB of boundary polygons upstream, none of which reaches the caller.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
inaturalist_get_histogramBuild a phenology histogram for a taxon in an area — which months, weeks, or years it is recorded in.No findings
Why it is in this group
- The name "inaturalist_get_histogram" says "get": a word for reading.
Description, as the server wrote it Build a phenology histogram for a taxon in an area — which months, weeks, or years it is recorded in. The default month_of_year interval answers "when does this bloom or appear here" in twelve buckets; the absolute intervals (year, month, week, day, hour) bucket real dates and upstream applies a default start date to them. An area is given in exactly one form: place_id, the lat/lng/radius triple in kilometres, or a four-corner bounding box. Omit taxon_id to chart every taxon in the area. Narrow to one life stage or reproductive state with an annotation pair (term_id and term_value_id, e.g. Life Stage = Larva, or Flowers and Fruits = Flowers), or to broad groups with iconic_taxa. Defaults to research-grade, wild-only records and echoes those defaults back.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
inaturalist_get_leaderboardRank the most active observers or identifiers for an area, period, and taxon — who knows this place or this group.No findings
Why it is in this group
- The name "inaturalist_get_leaderboard" says "get": a word for reading.
Description, as the server wrote it Rank the most active observers or identifiers for an area, period, and taxon — who knows this place or this group. kind selects which: observers are ranked by how many observations they recorded, identifiers by how many identifications they made. An area is given in exactly one form: place_id, the lat/lng/radius triple in kilometres, or a four-corner bounding box. Both endpoints rank only the top 500 entries, so page multiplied by per_page must stay at or below 500 — narrow the area, period, or taxon to bring someone further down into reach. For the most-recorded species rather than the most active people, use inaturalist_get_species_counts.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
inaturalist_get_observationFetch up to 10 observations by id with their community identification thread — who identified what, whether each identification agrees, and the consensus taxon the community landed…No findings
Why it is in this group
- The name "inaturalist_get_observation" says "get": a word for reading.
Description, as the server wrote it Fetch up to 10 observations by id with their community identification thread — who identified what, whether each identification agrees, and the consensus taxon the community landed on. The whole batch costs one upstream request, so resolving ten ids here is far cheaper than ten separate lookups. Records come back in the requested order. A missing id is reported per id in unresolved rather than failing the batch; the call fails only when nothing resolved. Long threads and long observation-field lists are cut to fit one response budget shared across the batch — up to 40 identifications, 40 comments, and 40 filled fields for a single id, 4 of each per record for ten — and every record reports the size of each array beside what it kept.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
inaturalist_get_similar_speciesList the taxa this one is most often misidentified as, ranked by how many times identifiers made the correction — the field-identification check before committing to a look-alike.No findings
Why it is in this group
- The name "inaturalist_get_similar_species" says "get": a word for reading.
Description, as the server wrote it List the taxa this one is most often misidentified as, ranked by how many times identifiers made the correction — the field-identification check before committing to a look-alike. Scope it to an area in exactly one form (place_id, the lat/lng/radius triple in kilometres, or a four-corner bounding box) to see the confusion set a specific region actually produces, or leave the area off for the global set. The taxon must be a genus or finer (genus, species, or below) — upstream keeps no confusion set for a family, order, or anything coarser. Resolve the organism name to a taxon id with inaturalist_resolve_name first.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
inaturalist_get_species_countsRank the distinct species recorded in an area and period, most-observed first — the "what lives here" answer, without paging through individual sightings.No findings
Why it is in this group
- The name "inaturalist_get_species_counts" says "get": a word for reading.
Description, as the server wrote it Rank the distinct species recorded in an area and period, most-observed first — the "what lives here" answer, without paging through individual sightings. An area is given in exactly one form: place_id, the lat/lng/radius triple in kilometres, or a four-corner bounding box. Narrow to a clade by passing taxon_id, e.g. the birds of a park, or to one observer or one project by user_id, user_login, or project_id. Defaults to research-grade, wild-only records and echoes those defaults back. For the most active people rather than the most recorded species, use inaturalist_get_leaderboard.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
inaturalist_get_taxonFetch a taxon profile: the taxonomic path, per-authority conservation listings, the encyclopedia summary, the photo gallery, immediate children, and observation counts.No findings
Why it is in this group
- The name "inaturalist_get_taxon" says "get": a word for reading.
Description, as the server wrote it Fetch a taxon profile: the taxonomic path, per-authority conservation listings, the encyclopedia summary, the photo gallery, immediate children, and observation counts. Resolve a name to a taxon id with inaturalist_resolve_name first. The upstream record is 95 KB for a common species, so it is projected before anything else happens; a taxon that still overflows comes back as an outline of its sections with their byte sizes, and naming those sections in a re-call returns only those. The valid section names are summary, taxonomy, children, conservation, photos, and encyclopedia.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
inaturalist_list_referenceDecode the vocabularies the other iNaturalist tools take as input: annotation attributes and values, quality grades, license codes, taxonomic ranks, iconic taxa, and IUCN conservat…1 finding
Why it is in this group
- The name "inaturalist_list_reference" says "list": a word for reading.
Findings
- Warn
The description names a tool "iNaturalist" that this server does not list.
What this check looks forMatched text
description: "Decode the vocabularies the other iNaturalist tools take as input: annotation attributes an..."
Description, as the server wrote it Decode the vocabularies the other iNaturalist tools take as input: annotation attributes and values, quality grades, license codes, taxonomic ranks, iconic taxa, and IUCN conservation-status codes. An unrecognized filter value is not rejected upstream — it silently returns nothing — so read the codes here before filtering. Note that the conservation codes are the normalised csi search filter; a taxon record’s own conservation_statuses[].status is authority-specific free text and reads differently. With topic controlled_terms and a taxon_id, the response also carries which annotations identifiers have actually recorded for that taxon, with counts.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
inaturalist_resolve_nameResolve a common or scientific name to a taxon id, or a place, project, or observer name to its id.1 finding
Why it is in this group
- The name "inaturalist_resolve_name" says "resolve": a word for reading.
Findings
- Warn
The description contains "every other tool", wording about other tools or servers.
What this check looks forMatched text
description: "...ked candidates carrying the identifiers every other tool takes. A miss is a result rather than a..."
Description, as the server wrote it Resolve a common or scientific name to a taxon id, or a place, project, or observer name to its id. Returns ranked candidates carrying the identifiers every other tool takes. A miss is a result rather than a failure: found comes back false with guidance naming why. Taxon lookup matches a name PREFIX, not words inside a name, so "monarch butterfly" misses where "monarch" hits.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
inaturalist_search_observationsSearch georeferenced wildlife sightings by area, date, taxon, quality grade, annotation, conservation status, observer, project, and licence.No findings
Why it is in this group
- The name "inaturalist_search_observations" says "search": a word for reading.
Description, as the server wrote it Search georeferenced wildlife sightings by area, date, taxon, quality grade, annotation, conservation status, observer, project, and licence. Returns a projected record per sighting with coordinates, licence, first photo, and identification counts. An area is given in exactly one form — place_id, the lat/lng/radius triple in kilometres, or a four-corner bounding box — and defaults to research-grade, wild-only records, which are echoed back on every call. Identifications and comments are deliberately not expandable here (one thread is 28 KB); fetch them for specific records with inaturalist_get_observation. page walks the first 10,000 results under any ordering; past 10,000, order by id descending (order_by "id", order "desc") and pass each page’s next_cursor as cursor.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 0.2.2. Values in angle brackets are yours to fill in.
claude mcp add --transport http inaturalist https://inaturalist.caseyjhand.com/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__inaturalist__inaturalist_list_reference",
"mcp__inaturalist__inaturalist_resolve_name",
"mcp__inaturalist__inaturalist_find_places",
"mcp__inaturalist__inaturalist_search_observations",
"mcp__inaturalist__inaturalist_get_observation",
"mcp__inaturalist__inaturalist_get_species_counts",
"mcp__inaturalist__inaturalist_get_histogram",
"mcp__inaturalist__inaturalist_get_leaderboard",
"mcp__inaturalist__inaturalist_get_similar_species",
"mcp__inaturalist__inaturalist_get_taxon"
],
"ask": [],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as inaturalist. Review it before you use it.
