Skip to content

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.

Read only

10 tools: 10 only read.

Scanned Oct 21, 2026

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

Findings

Matches of fixed checks, with the text they matched.

2 warn

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.

      Matched text

      description: "Decode the vocabularies the other iNaturalist tools take as input: annotation attributes an..."

      What this check looks for
    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.

      Matched text

      description: "...ked candidates carrying the identifiers every other tool takes. A miss is a result rather than a..."

      What this check looks for
    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/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.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.