Skip to main content
Glama

inaturalist-mcp-server

Server Details

Search iNaturalist sightings, identification threads, phenology, and look-alike species.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 20 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/inaturalist-mcp-server
GitHub Stars
1
Server Listing
@cyanheads/inaturalist-mcp-server

TDQS

A4.7/5.0

Scored across 10 tools

Disambiguation4/5

Most tools are cleanly separated by resource and action—search, detail, aggregation, and reference—and cross-references help. The only real overlap is find_places and resolve_name, both of which can turn a place name into a place id; descriptions mostly disambiguate by purpose, but an agent could still pick the wrong one.

Naming Consistency5/5

Every tool uses the consistent inaturalist_<verb>_<noun> snake_case pattern: find, get, list, resolve, search. The prefix and verb-object structure make expected behavior predictable and avoid mixed conventions.

Tool Count5/5

Ten tools cover a broad but focused read-only iNaturalist domain—lookup, search, detail, aggregation, and reference. None feels redundant, and the count is ideal for an MCP surface.

Completeness5/5

The surface forms a complete read-only workflow: resolve names and places, look up vocabularies, search observations, fetch full observation threads, get taxon profiles, and compute species counts, phenology, leaderboards, and similar-species confusion sets. There are no dead ends; tools reference each other for next steps.

Available Tools

10 tools
inaturalist_find_placesInaturalist Find PlacesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoPlace-name prefix to search. Matches the start of a name, not words inside it. Mutually exclusive with the bounding box.
nelatNoNorth-east corner latitude of the map area, at or north of swlat. All four corners or none.
nelngNoNorth-east corner longitude of the map area. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian.
swlatNoSouth-west corner latitude of the map area. All four corners or none.
swlngNoSouth-west corner longitude of the map area. All four corners or none.
per_pageNoMaximum places per list. Honoured on the bounding-box arm only, where it bounds the standard and community lists separately, so up to twice this many places come back. The name-prefix endpoint publishes no page size and returns a fixed page.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe most places this response could carry — per_page × 2 on the bounding-box arm, where per_page bounds each list separately; the fixed page upstream served on the name-prefix arm.
errorNoPresent when the call failed. Absent on success.
shownNoHow many places this response carries.
noticeNoGuidance when nothing matched, or when the page capped the result set.
placesNoName-prefix matches. Present on the q arm.
standardNoCurated administrative places covering the area. Present on the bounding-box arm.
communityNoMember-created places covering the area. Present on the bounding-box arm.
truncatedNoTrue when more places may exist than were returned — on the bounding-box arm, when the standard or community list reached per_page.
totalCountNoPlaces upstream reports. On the name-prefix arm, every match before the fixed page; on the bounding-box arm, only the places returned (standard plus community), so it is bounded by the page size rather than a full count.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only readOnlyHint and openWorldHint annotations, the description carries the behavioral burden and does so richly: it discloses prefix matching, antimeridian handling, the per_page double-list behavior, and that geometry is stripped with a concrete payload-size example. None of this is available from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the primary purpose, then efficiently covers the two modes, output contents, and an important performance behavior. Every sentence contributes information; there is no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two modes, six parameters, an output schema, and read-only annotations, the description is complete enough for an agent to invoke it correctly. It explains the constraint that exactly one mode must be used, what results contain, and a notable payload optimization, leaving no critical gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by framing q and the four corners as mutually exclusive modes and clarifying that all four corners must be supplied together. It also adds context around per_page applying only to the bounding-box arm, which is valuable semantic guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: resolving a place name to a place id or listing places covering a map area. It clearly distinguishes the two operational modes and gives the criteria for each, which is enough to tell this tool apart from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly explains when to pass q versus the four bounding-box coordinates, and warns that exactly one mode must be used, never both. It does not name sibling alternatives or say when to prefer this tool over them, but the internal usage guidance is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inaturalist_get_histogramInaturalist Get HistogramA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
d1NoEarliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2. With interval set to day or hour, a wide range can exceed the 800-bucket cap — narrow d1/d2 to reach buckets past it.
d2NoLatest observation date, YYYY-MM-DD. Inclusive.
latNoLatitude of the search centre, in decimal degrees. Requires lng and radius.
lngNoLongitude of the search centre, in decimal degrees. Requires lat and radius.
nelatNoNorth-east corner latitude of the bounding box, at or north of swlat. All four corners or none.
nelngNoNorth-east corner longitude of the bounding box. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian.
swlatNoSouth-west corner latitude of the bounding box. All four corners or none.
swlngNoSouth-west corner longitude of the bounding box. All four corners or none.
radiusNoSearch radius around lat/lng, in KILOMETRES, greater than 0. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes.
captiveNoWhether to include captive and cultivated records — zoo animals, garden plantings. Defaults to wild organisms only.
term_idNoAnnotation attribute ids, from inaturalist_list_reference topic controlled_terms — e.g. 1 for Life Stage.
intervalNoBucketing. month_of_year and week_of_year fold every year together into a seasonal curve; the rest bucket absolute dates. day and hour over a wide date range can generate thousands of buckets — the response is capped at 800, kept from the start of the range; narrow d1/d2 or use a coarser interval to see the rest.month_of_year
place_idNoNumeric iNaturalist place id from inaturalist_find_places. Mutually exclusive with the lat/lng/radius triple and the bounding box. A non-numeric value answers HTTP 500 upstream.
taxon_idNoRestrict to this taxon and its descendants. Omit to chart every taxon in the area. Resolve a name to an id with inaturalist_resolve_name.
date_fieldNoWhich date to bucket by: when the organism was observed, or when the record was uploaded.observed
iconic_taxaNoBroad organism groups, by their scientific iconic-taxon name. A common-name value such as "Birds" matches nothing upstream, so only the listed values are accepted.
quality_gradeNoIdentification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence.
term_value_idNoAnnotation value ids, from the same attribute listing — e.g. 6 for Larva. Requires term_id; sent alone it is ignored upstream and the unfiltered corpus comes back.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe bucket cap that was applied.
errorNoPresent when the call failed. Absent on success.
shownNoHow many buckets this response carries.
totalNoSum of every bucket count upstream returned, including buckets past the cap that are not in the buckets array.
noticeNoGuidance when every bucket came back zero, or when the cap was reached.
bucketsNoEvery bucket upstream returned, in order, including the zero ones — up to 800, the first in upstream key order. See the truncated/shown/cap enrichment when more exist.
intervalNoThe bucketing that was applied.
truncatedNoTrue when upstream returned more than 800 buckets.
applied_filtersNoThe server-applied defaults that determine what this answer means.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and openWorldHint=true, so the safety profile is already covered. The description adds valuable behavioral context beyond annotations: it discloses that the upstream applies a default start date to absolute intervals, that the response is capped at 800 buckets kept from the start of the range, that a non-numeric place_id answers HTTP 500 upstream, and that term_value_id sent alone is ignored upstream. It also states defaults (research-grade, wild-only) and that they are echoed back. Minor gap: it doesn't describe the exact response shape, but an output schema exists, so that burden is lifted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph that front-loads the core purpose and default behavior, then covers area forms, taxon omission, annotation narrowing, and defaults. Every sentence earns its place, but the paragraph is long and packs many distinct facts together; a bit of structural separation (e.g., listing the three area forms) would improve scannability. Still, it is efficient and information-dense without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with 18 optional parameters, no required parameters, and an output schema, the description covers all the essential decision points: how to specify an area (three mutually exclusive forms), how to choose an interval, how to narrow by taxon/annotation/iconic_taxa, what the defaults are, and what upstream quirks to expect (500 km cap, 800-bucket cap, HTTP 500 on non-numeric place_id, ignored term_value_id). The output schema handles return values, and annotations handle safety. Nothing critical is missing for an agent to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining the semantic distinction between month_of_year/week_of_year (folded seasonal curve) and absolute intervals, by clarifying that the bounding box can cross the antimeridian, by noting the 500 km radius is a server-imposed verified ceiling, and by explaining that term_value_id requires term_id. It also gives concrete examples (Life Stage = Larva, Flowers and Fruits = Flowers) that make the annotation pair concept tangible. It doesn't fully compensate for the fact that 18 parameters is a lot, but the schema already documents each parameter well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Build a phenology histogram') and names the resource (a taxon in an area) and the bucketing intervals (months, weeks, years). It clearly distinguishes this from sibling tools like inaturalist_get_species_counts or inaturalist_search_observations by focusing on temporal distribution rather than counts or raw observations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the area must be given in exactly one form (place_id, lat/lng/radius, or bounding box), explains when to omit taxon_id, and describes how to narrow by annotation pairs or iconic_taxa. It also gives concrete guidance on interval selection (month_of_year for seasonal questions, absolute intervals for real dates) and warns about the 800-bucket cap with day/hour intervals. This is rich, actionable usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inaturalist_get_leaderboardInaturalist Get LeaderboardA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
d1NoEarliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2.
d2NoLatest observation date, YYYY-MM-DD. Inclusive.
latNoLatitude of the search centre, in decimal degrees. Requires lng and radius.
lngNoLongitude of the search centre, in decimal degrees. Requires lat and radius.
kindYesWhich leaderboard: "observers" ranks by observations recorded, "identifiers" by identifications made.
pageNoPage number. Defaults to 1.
nelatNoNorth-east corner latitude of the bounding box, at or north of swlat. All four corners or none.
nelngNoNorth-east corner longitude of the bounding box. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian.
swlatNoSouth-west corner latitude of the bounding box. All four corners or none.
swlngNoSouth-west corner longitude of the bounding box. All four corners or none.
radiusNoSearch radius around lat/lng, in KILOMETRES, greater than 0. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes.
per_pageNoEntries per page, maximum 250. An entry costs roughly 140 bytes across structuredContent and the rendered text together, so 250 is a full page near 34 KB — and two such pages cover the whole 500-entry window these endpoints rank.
place_idNoNumeric iNaturalist place id from inaturalist_find_places. Mutually exclusive with the lat/lng/radius triple and the bounding box. A non-numeric value answers HTTP 500 upstream.
taxon_idNoRestrict to this taxon and its descendants. Resolve a name to an id with inaturalist_resolve_name.
quality_gradeNoIdentification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe per_page that was applied.
kindNoWhich leaderboard was ranked.
errorNoPresent when the call failed. Absent on success.
shownNoHow many entries this page carries.
noticeNoGuidance when nobody matched, when the page is past the last one holding entries, or how to reach further down the ranking.
entriesNoThe ranked members, most active first.
truncatedNoTrue when the page filled per_page and more entries follow.
count_metricNoWhat the count on each entry measures.
total_resultsNoHow many people upstream reports as matching. Far larger than the 500 this leaderboard can actually address.
applied_filtersNoThe server-applied default that determines what this answer means.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a read-only, open-world call, and the description adds a consequential behavioral fact not in the schema: both endpoints cap rankings at 500 entries, which drives the pagination constraint. It also clarifies that kind changes the metric being ranked. No contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, with the core purpose front-loaded before the selection guidance and fallback tool. Every sentence carries either a functional definition, a constraint, or an actionable alternative; there is no filler or schema repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter tool with an output schema, this description covers the selection axis, the area exclusivity rule, the pagination ceiling, and the key sibling. The only residual ambiguity is that 'An area is given in exactly one form' does not explicitly say that area, period, and taxon filters are optional, though the schema's required-only-kind signal implies this.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is met by the parameter descriptions. The description adds value beyond the schema by grouping area parameters into three mutually exclusive forms and by tying page and per_page together through the 500-entry cap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a concrete verb ('Rank'), a specific resource ('most active observers or identifiers'), and the filtering axes (area, period, taxon). The kind distinction is explained and the description explicitly differentiates itself from inaturalist_get_species_counts, so an agent can select it without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states the exact competing tool and the condition to choose it: 'For the most-recorded species rather than the most active people, use inaturalist_get_species_counts.' It also gives operational rules: area must be supplied in exactly one form, and page × per_page must stay at or below 500, with advice to narrow filters to reach lower ranks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inaturalist_get_observationInaturalist Get ObservationA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoEmbedded arrays to expand per record. identifications is the default and is what carries the thread; the others cost context, so check photo_count and sound_count first. identifications and comments — like the observation_fields every record carries — share a 40-entry budget across the batch: each record keeps at most 40 ÷ records returned entries per array (never fewer than 4), and reports identifications_total, comments_total, and observation_fields_total beside what it kept — request one id alone for the 40-entry view.
observation_idYesObservation ids to fetch, 1 to 10. Find current ids for an area with inaturalist_search_observations.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when part of the batch did not resolve, or when a thread or observation-field list was cut to fit the response.
unresolvedNoRequested ids upstream returned nothing for. They may have been deleted, or never existed.
observationsNoThe observations that resolved, in the requested order with unresolved ids left out, carrying the expansions that were requested.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations already mark this as readOnly/openWorld/idempotent, the description adds substantial behavioral detail: one upstream request per batch, results in requested order, per-id missing handling, the failure condition (only when nothing resolves), budget-based truncation (40/40/40 for one id, 4 each for ten), and size reporting for each truncated array. This is exactly the kind of context annotations cannot provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place. The main capability is front-loaded, followed by cost, failure semantics, and truncation behavior. No filler or repetition; the detail about missing ids and budget sharing is essential for correct invocation and interpretation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and only two parameters, the description covers all necessary runtime behaviors: batching, ordering, failure modes, truncation budgets, and per-record size reporting. There are no gaps an agent needs to call this tool correctly or interpret its results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Though schema coverage is 100%, the description meaningfully extends both parameters. It explains the include default and what 'identifications' carries (the thread), warns that other includes cost context, and reveals the shared 40-entry budget mechanism. For observation_id it explains the 1-10 limit and points to the sibling search tool for finding current ids. The description adds real decision-making value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('Fetch up to 10 observations by id') and states the key differentiator: it returns the community identification thread (who identified, agreement status, consensus taxon). This clearly separates it from search-based siblings like inaturalist_search_observations, which the description explicitly references for finding ids.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use context: batch resolution is cheaper than ten separate lookups, missing ids are handled per-id instead of failing the batch, and the batch fails only when nothing resolves. It also provides concrete selection guidance for the include parameter (check photo_count and sound_count first) and warns that large batches truncate thread data, recommending a single id for the full 40-entry view.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inaturalist_get_similar_speciesInaturalist Get Similar SpeciesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
d1NoEarliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2.
d2NoLatest observation date, YYYY-MM-DD. Inclusive.
latNoLatitude of the search centre, in decimal degrees. Requires lng and radius.
lngNoLongitude of the search centre, in decimal degrees. Requires lat and radius.
limitNoMaximum look-alikes to return. Applied in-process — the upstream endpoint publishes no page size and returns its whole confusion set.
nelatNoNorth-east corner latitude of the bounding box, at or north of swlat. All four corners or none.
nelngNoNorth-east corner longitude of the bounding box. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian.
swlatNoSouth-west corner latitude of the bounding box. All four corners or none.
swlngNoSouth-west corner longitude of the bounding box. All four corners or none.
radiusNoSearch radius around lat/lng, in KILOMETRES, greater than 0. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes.
captiveNoWhether to include captive and cultivated records — zoo animals, garden plantings. Defaults to wild organisms only.
place_idNoNumeric iNaturalist place id from inaturalist_find_places. Mutually exclusive with the lat/lng/radius triple and the bounding box. A non-numeric value answers HTTP 500 upstream.
taxon_idYesNumeric taxon id to find look-alikes for, at genus or finer — a genus, species, or subspecies; a family or anything coarser is refused. Resolve a name to an id with inaturalist_resolve_name.
quality_gradeNoIdentification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit that was applied.
errorNoPresent when the call failed. Absent on success.
shownNoHow many look-alikes this response carries.
noticeNoGuidance when no look-alikes are recorded, or when the limit cut the set.
taxon_idNoThe taxon the look-alikes were found for.
truncatedNoTrue when the limit cut the confusion set.
totalCountNoHow many look-alikes upstream returned, before the limit was applied.
similar_speciesNoLook-alikes ranked by misidentification_count, most-confused first.
truncationCeilingNoMisidentification count of the last look-alike shown. The ranking is descending, so no omitted look-alike exceeds it.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even with readOnlyHint and openWorldHint annotations present, the description adds substantial behavioral detail: ranking by identifier corrections, global vs. regional confusion sets, the taxon-rank restriction (genus or finer), and the upstream's refusal to supply confusion sets for coarser taxa. It also surfaces the prerequisite of resolving names first. This exceeds what annotations alone provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three dense sentences with zero fluff. The core action is front-loaded, followed by scoping rules, then the taxon constraint and prerequisite. Every sentence carries distinct value, and the structure guides the agent from what → how → when.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (14 parameters, rich schema, and an output schema), the description covers the critical decision points: purpose, area scoping modes, taxon rank restriction, and the resolve-name prerequisite. It leaves detailed per-parameter semantics to the schema, which is appropriate. It could mention the default behavior of limit or quality_grade, but those are fully documented in the schema, so the omission is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful group semantics beyond the schema: it clarifies that area scoping accepts exactly one of three forms, that omitting the area yields the global set, and that the taxon must be genus or finer. It also ties the spatial parameters together conceptually, which the schema conveys only through individual mutual-exclusion notes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List the taxa this one is most often misidentified as, ranked by how many times identifiers made the correction.' This clearly distinguishes it from sibling tools like inaturalist_get_histogram or inaturalist_get_species_counts, which serve different analytical purposes. The field-identification framing leaves no ambiguity about the tool's role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: as a field-identification check before committing to a look-alike. It explicitly instructs the agent to resolve names first with inaturalist_resolve_name and explains the three mutually exclusive area scoping options. It does not explicitly name sibling alternatives or state 'do not use for X,' so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inaturalist_get_species_countsInaturalist Get Species CountsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
d1NoEarliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2.
d2NoLatest observation date, YYYY-MM-DD. Inclusive.
latNoLatitude of the search centre, in decimal degrees. Requires lng and radius.
lngNoLongitude of the search centre, in decimal degrees. Requires lat and radius.
pageNoPage number. Defaults to 1.
nelatNoNorth-east corner latitude of the bounding box, at or north of swlat. All four corners or none.
nelngNoNorth-east corner longitude of the bounding box. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian.
swlatNoSouth-west corner latitude of the bounding box. All four corners or none.
swlngNoSouth-west corner longitude of the bounding box. All four corners or none.
radiusNoSearch radius around lat/lng, in KILOMETRES, greater than 0. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes.
captiveNoWhether to include captive and cultivated records — zoo animals, garden plantings. Defaults to wild organisms only.
term_idNoAnnotation attribute ids, from inaturalist_list_reference topic controlled_terms — e.g. 1 for Life Stage.
user_idNoRestrict to one observer, by numeric user id from inaturalist_resolve_name type user. Mutually exclusive with user_login.
per_pageNoSpecies per page, maximum 50. A ranked species costs roughly 860 bytes across structuredContent and the rendered text together, so 50 is a full page near 43 KB. Upstream would serve 500 in one page — raise page rather than asking for it.
place_idNoNumeric iNaturalist place id from inaturalist_find_places. Mutually exclusive with the lat/lng/radius triple and the bounding box. A non-numeric value answers HTTP 500 upstream.
taxon_idNoRestrict to this taxon and its descendants. Resolve a name to an id with inaturalist_resolve_name.
project_idNoRestrict to observations in one project, by numeric project id from inaturalist_resolve_name type project.
user_loginNoRestrict to one observer, by login — the login on an inaturalist_resolve_name user candidate, a leaderboard entry, or an observation’s observer. Mutually exclusive with user_id.
iconic_taxaNoBroad organism groups, by their scientific iconic-taxon name. A common-name value such as "Birds" matches nothing upstream, so only the listed values are accepted.
quality_gradeNoIdentification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence.
term_value_idNoAnnotation value ids, from the same attribute listing — e.g. 6 for Larva. Requires term_id; sent alone it is ignored upstream and the unfiltered corpus comes back.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe per_page that was applied.
errorNoPresent when the call failed. Absent on success.
shownNoHow many species this page carries.
noticeNoGuidance when nothing matched, when the page is past the last one holding species, or how to reach the species beyond this page.
speciesNoThe species, ranked by observation_count, most-observed first, each at its absolute position.
truncatedNoTrue when the page filled per_page and more species follow.
total_resultsNoHow many distinct species match. An estimate over a live index — it drifts between calls seconds apart.
applied_filtersNoThe server-applied defaults that determine what this answer means.
truncationCeilingNoObservation count of the last species shown. The ranking is descending, so no species left off this page exceeds it.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds useful behavior beyond that: it returns a ranked aggregation rather than individual sightings, defaults to research-grade wild-only records, and 'echoes those defaults back' in the response. It does not cover error behavior or pagination details, but the output schema and annotations lower that burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences front-load the core purpose and answer shape, then cover area form exclusivity, common filters, defaults, and the key sibling alternative. Every clause earns its place and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 21-parameter tool with a rich output schema and read-only/open-world annotations, the description covers all high-level decisions an agent must make: which area form, which optional filters, what defaults apply, and when to choose a different tool. Detailed parameter constraints live in the fully-covered schema, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds a valuable high-level grouping: the three mutually exclusive area forms, the clade filter, observer/project filters, and the leaderboard distinction. It composes parameters into coherent use-case patterns rather than merely repeating the schema's per-field notes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Rank the distinct species recorded in an area and period, most-observed first,' and it crystallizes the intent as the 'what lives here' answer. It clearly distinguishes itself from individual-sighting retrieval with 'without paging through individual sightings' and from the leaderboard sibling by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete selection guidance: exactly one area form is allowed, filters like taxon_id/user_id/user_login/project_id are listed, and defaults are stated. It explicitly redirects to inaturalist_get_leaderboard for a different question, giving the agent a clear branch between siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inaturalist_get_taxonInaturalist Get TaxonA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionsNoSections to return: summary, taxonomy, children, conservation, photos, encyclopedia. Omit for the whole profile, or an outline of it when it overflows. A selection returns whatever it names, at whatever size, so sum the byte sizes from the outline before asking for several.
taxon_idYesNumeric taxon id. A non-numeric value answers HTTP 422 with an empty message upstream, so the integer is enforced here. Resolve a name to an id with inaturalist_resolve_name.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoTaxon id.
kindNo"full" when the profile itself is returned, "outline" when it overflowed and only the section list came back.
nameNoScientific name.
rankNoTaxonomic rank, e.g. "species".
errorNoPresent when the call failed. Absent on success.
noticeNoHow to re-call for specific sections. Present on the outline.
photosNoGallery photos, each with its own licence.
visionNoTrue when the taxon is covered by the upstream image classifier.
extinctNoTrue when the taxon is recorded as extinct.
childrenNoImmediate children of this taxon.
sectionsNoAvailable sections and their byte sizes, largest first. Present on the outline.
taxonomyNoAncestors from the root of the tree down to the taxon’s parent.
is_activeNoFalse for a taxon superseded by a taxonomic change; its id still resolves.
rank_levelNoNumeric rank level — 70 kingdom, 30 family, 10 species, 5 subspecies.
common_nameNoPreferred common name, when one is recorded.
conservationNoConservation listings for the taxon.
encyclopediaNoThe encyclopedia text and link upstream carries for the taxon.
sections_appliedNoSections this response carries. Empty when the whole profile came back, so an absent section means the taxon has none rather than that it was never asked for.
iconic_taxon_nameNoBroad organism group, e.g. "Insecta". Usable as an iconic_taxa filter value.
listed_taxa_countNoHow many place checklists include this taxon. The checklist entries themselves are not relayed.
observations_countNoHow many observations carry this taxon or a descendant of it.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint, openWorldHint, and idempotentHint, and the description adds substantial behavior not captured there: the 95 KB upstream projection, the overflow outline with byte sizes, and the selective-section re-call semantics. This materially changes how an agent should invoke the tool and interpret large responses.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the main purpose, then moves through prerequisite, projection behavior, overflow handling, and valid section names in logical order. Every sentence earns its place, including the concrete 95 KB detail that justifies the projection step. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully equips an agent to use this tool correctly: it covers what the profile contains, how to resolve a name first, what happens on large records, how to recover from overflow, and which section names are valid. An output schema exists for return values, so the description doesn't need to restate them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description enriches both parameters beyond the JSON Schema. For taxon_id it warns about the upstream HTTP 422 on non-numeric values and explains why the integer is enforced. For sections it defines the omit-for-whole-profile behavior, overflow outline, and the need to sum byte sizes before requesting multiple sections.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Fetch a taxon profile', then enumerates the concrete content (taxonomic path, conservation listings, summary, photos, children, observation counts). This clearly differentiates it from siblings like inaturalist_get_observation and inaturalist_get_species_counts by focusing on the taxon entity and its composite sections.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states the prerequisite workflow: 'Resolve a name to a taxon id with inaturalist_resolve_name first.' It also provides conditional guidance for overflow handling, telling the agent to re-call with section names when the projected profile still overflows. This gives clear when-to-use and how-to-proceed direction beyond the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inaturalist_list_referenceInaturalist List ReferenceA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYesWhich vocabulary to decode. controlled_terms is fetched live and cached; the rest are spec-derived static tables.
taxon_idNoAdd observed annotation usage for this taxon, ranked by how often each attribute/value pair has been recorded. Valid only with topic controlled_terms. Resolve a name to an id with inaturalist_resolve_name.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
topicNoThe vocabulary that was decoded.
noticeNoGuidance when the requested taxon has no recorded annotations yet.
sourceNo"upstream" when the table was fetched from iNaturalist, "static" when spec-derived.
entriesNoThe vocabulary, one entry per code or attribute.
observed_usageNoObserved annotation usage for taxon_id, most-used first. Present only when taxon_id was given.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/openWorldHint annotations, the description discloses critical non-obvious behavior: an unrecognized filter value is not rejected upstream but silently returns nothing, and the conservation codes are normalized search-filter values rather than the taxon record's own free-text status. These are exactly the kind of behavioral traps an agent needs disclosed, and they are consistent with the annotations (no contradiction).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, all substantive: purpose, critical silent-failure warning, conservation-code normalization caveat, and the taxon_id interaction. The most important behavioral warning is front-loaded in sentence two. It is dense rather than bloated, with only a minor flaw: the unexplained 'csi' acronym assumes domain knowledge.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter reference tool with an output schema, readOnly and openWorld annotations already present, the description covers purpose, the key usage trap, cross-tool routing, and the one subtle semantic distinction (conservation codes). The only gap is the unexplained 'csi' acronym and no elaboration on the controlled_terms live-cache behavior, which the schema already documents. Overall quite complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds real semantic value by clarifying the conservation_status_codes topic — that it is the normalized csi search filter, distinct from a taxon's own conservation_statuses[].status — which the schema's enum label does not convey. It also reinforces the cross-parameter constraint that taxon_id only applies with topic controlled_terms and states the count-carrying output behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource — 'Decode the vocabularies the other iNaturalist tools take as input' — and enumerates the exact vocabularies (annotation attributes/values, quality grades, license codes, ranks, iconic taxa, IUCN codes). This clearly differentiates it from the sibling data-retrieval tools (get_observation, search_observations, etc.) as the family's reference/decoder tool, with no tautology or ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'read the codes here before filtering', reinforced by the concrete consequence of not doing so (silent empty results). It also names an alternative tool for a related step ('Resolve a name to an id with inaturalist_resolve_name') and draws a precise when-not distinction between the normalized search-filter codes and the authority-specific conservation_statuses[].status field. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inaturalist_resolve_nameInaturalist Resolve NameA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesThe name to resolve. On type "taxon" this is a name prefix or an exact taxon id; on the other types it is matched across the record text.
rankNoRestrict taxon candidates to one rank. Honoured only on type "taxon" — the cross-kind search has no rank filter.
typeNoWhich kind of record to resolve. "taxon" uses the taxon autocomplete; the rest use the scored cross-kind search, and "any" searches every kind at once. For a place’s bounding box and containment chain rather than just its id, use inaturalist_find_places instead.taxon
limitNoMaximum candidates to return, applied to every type.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
foundNoTrue when at least one candidate matched.
guidanceNoWhy nothing matched and what to try instead. Present only when found is false — this is the primary result of a miss.
candidatesNoRanked candidates, best match first.
totalCountNoTotal candidates upstream matched, before the limit was applied.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behaviors beyond the read-only and open-world annotations: miss semantics ('found comes back false with guidance naming why'), prefix matching ('Taxon lookup matches a name PREFIX, not words inside a name'), and that rank is only honored on taxon type. These are critical behavioral traits that the agent needs to know, and they are not present in the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, each earning its place: purpose, tool-relationship, miss behavior, and prefix rule. It is front-loaded with the core action and immediately gives the most important behavioral caveat. There is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description does not need to detail return values. It covers the non-obvious usage caveats (prefix matching, miss semantics, rank scoping) and points to the sibling tool for a different need. The description is sufficiently complete for the tool's complexity, complementing the rich schema and annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all parameters with 100% coverage, including the prefix behavior and rank restrictions. However, the description adds a clarifying example ('monarch butterfly' misses where 'monarch' hits) that reinforces the non-obvious substring-matching pitfall, which goes slightly beyond the schema's wording. This extra clarification earns a 4 rather than the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Resolve a common or scientific name to a taxon id, or a place, project, or observer name to its id.' It distinguishes the tool from siblings by stating it returns 'the identifiers every other tool takes' and by naming inaturalist_find_places as the alternative for bounding boxes and containment chains. This is unambiguous and not a tautology.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: use this tool to get IDs for other tools, and explicitly names when to use inaturalist_find_places instead ('For a place’s bounding box and containment chain rather than just its id'). It also gives an implicit usage rule with the prefix example. However, it does not comprehensively contrast against all sibling tools (e.g., inaturalist_get_taxon or search_observations), so it falls short of a full when/when-not guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inaturalist_search_observationsInaturalist Search ObservationsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFree text matched across observation properties.
d1NoEarliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2.
d2NoLatest observation date, YYYY-MM-DD. Inclusive.
csiNoIUCN-normalised conservation status codes to include, e.g. ["EN","CR"]. Decode them with inaturalist_list_reference topic conservation_status_codes.
latNoLatitude of the search centre, in decimal degrees. Requires lng and radius.
lngNoLongitude of the search centre, in decimal degrees. Requires lat and radius.
pageNoPage number within the first 10,000 results, under any ordering. Defaults to 1. Mutually exclusive with cursor.
hrankNoHighest (coarsest) taxonomic rank of the identification to accept. Must be at or above lrank; ranks compare by rank level.
lrankNoLowest (finest) taxonomic rank of the identification to accept. Equal to hrank for an exact-rank match.
nelatNoNorth-east corner latitude of the bounding box, at or north of swlat. All four corners or none.
nelngNoNorth-east corner longitude of the bounding box. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian.
orderNoSort direction.desc
swlatNoSouth-west corner latitude of the bounding box. All four corners or none.
swlngNoSouth-west corner longitude of the bounding box. All four corners or none.
cursorNonext_cursor from a previous id-descending page, to continue past the 10,000-result window — a positive integer observation id, sent upstream as id_below. Mutually exclusive with page, and forces order_by "id", order "desc".
nativeNoRestrict to taxa native to the observation location.
radiusNoSearch radius around lat/lng, in KILOMETRES, greater than 0. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes.
captiveNoWhether to include captive and cultivated records — zoo animals, garden plantings. Defaults to wild organisms only.
endemicNoRestrict to taxa endemic to the observation location.
includeNoEmbedded arrays to expand per record. Check photo_count and sound_count first — expanding costs context.
licenseNoRestrict to records whose own license_code is one of these, e.g. ["cc-by","cc0"] for reuse with attribution only. Decode the codes with inaturalist_list_reference topic licenses; all-rights-reserved records have no code to pass.
term_idNoAnnotation attribute ids, from inaturalist_list_reference topic controlled_terms — e.g. 1 for Life Stage.
user_idNoRestrict to one observer, by numeric user id from inaturalist_resolve_name type user. Mutually exclusive with user_login.
licensedNoRestrict to records whose own license_code is not null — any licence, NonCommercial and NoDerivatives variants included. For specific licences, use license.
order_byNoSort field. Set "id" with order "desc" to walk past 10,000 results: that is the one ordering next_cursor continues, so it is the only one that issues a next_cursor. A cursor forces it.observed_on
per_pageNoRecords per page, maximum 25. A projected record costs roughly 1.9 KB across structuredContent and the rendered text together, so 25 is a full page near 49 KB and the default of 10 near 20 KB. Walk further with page or cursor rather than a larger page.
place_idNoNumeric iNaturalist place id from inaturalist_find_places. Mutually exclusive with the lat/lng/radius triple and the bounding box. A non-numeric value answers HTTP 500 upstream.
taxon_idNoRestrict to this taxon and its descendants. Resolve a name to an id with inaturalist_resolve_name.
search_onNoNarrow what q matches against. Requires q.
introducedNoRestrict to taxa introduced to the observation location.
project_idNoRestrict to observations in one project, by numeric project id from inaturalist_resolve_name type project.
threatenedNoRestrict to taxa considered threatened where observed.
user_loginNoRestrict to one observer, by login — the login on an inaturalist_resolve_name user candidate, a leaderboard entry, or an observation’s observer. Mutually exclusive with user_id.
iconic_taxaNoBroad organism groups, by their scientific iconic-taxon name. A common-name value such as "Birds" matches nothing upstream, so only the listed values are accepted.
photo_licenseNoRestrict to records carrying at least one photo under one of these licence codes. Matched independently of the record’s own license_code, so check each photo’s license_code before reusing it.
quality_gradeNoIdentification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence.
term_value_idNoAnnotation value ids, from the same attribute listing — e.g. 6 for Larva. Requires term_id; sent alone it is ignored upstream and the unfiltered corpus comes back.
photo_licensedNoRestrict to records with at least one licensed photo, under any licence. For specific licences, use photo_license.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe per_page that was applied.
errorNoPresent when the call failed. Absent on success.
shownNoHow many records this page carries.
noticeNoGuidance when nothing matched, when the page is past the last one holding results, or how to continue past a full page.
has_moreNoTrue when this page filled per_page and more records follow. On the page path an exactly full final page is false; under a cursor, where the offset is unknown, every full page is true.
truncatedNoTrue when the page filled per_page and more records follow.
next_cursorNoPass back as cursor to continue past this page. Present only when has_more is true and the page was ordered by id descending; under any other ordering, raise page instead.
observationsNoThe matching sightings, projected.
total_resultsNoHow many records upstream reports as matching. An estimate over a live index — it drifts between calls seconds apart.
applied_filtersNoThe server-applied defaults and overrides that determine what this answer means.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true and openWorldHint=true, so the description must carry behavioral detail, and it does thoroughly. It discloses that the default research-grade/wild-only filtering is echoed on every call, that expanding identifications/comments is deliberately blocked (28 KB thread size), that pagination is limited to 10,000 under most orderings, that cursor forces id descending, and that 'term_value_id' sent alone is ignored upstream and returns the unfiltered corpus. It also documents a server-imposed 500 km radius ceiling when the upstream publishes no bound, and warns about HTTP 500 for non-numeric place_id. These are exactly the kind of operational gotchas an agent needs and go far beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Despite its length, the description is remarkably dense with non-redundant, high-value information. It front-loads the core purpose and area constraints, then efficiently covers pagination, expansion limits, and cost estimates. Every sentence earns its place – there is no filler or repetition. For a tool with 38 parameters, this is an appropriately concise and well-structured definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (38 parameters, many mutual exclusions, pagination edge cases, cost considerations) and that an output schema exists, the description is complete. It covers the area forms, defaults, expansion prohibitions, pagination strategy, cost guidance, and key parameter relationships. It also references companion tools for resolving IDs and licenses, leaving no obvious gap an agent would need to discover at runtime. The presence of an output schema means the description need not detail return fields, which it appropriately does not.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter already has a description, but the tool description adds substantial value beyond that baseline. For example, per_page explains the cost in KB and advises using page/cursor rather than larger pages; radius clarifies the 500 km server-imposed ceiling; cursor explains it is sent as id_below; include advises checking photo_count/sound_count first; and term_value_id warns it is ignored unless term_id is present. These enrich parameter semantics far beyond the schema, guiding correct usage and cost awareness.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear, specific purpose: 'Search georeferenced wildlife sightings by area, date, taxon, quality grade, annotation, conservation status, observer, project, and licence.' It specifies the return shape (projected record with coordinates, licence, first photo, identification counts) and distinguishes itself from the sibling inaturalist_get_observation by explicitly stating that identifications and comments are deliberately not expandable and should be fetched there. This differentiation is explicit and actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use and when-not-to-use guidance. It states the three mutually exclusive area forms, explains defaults (research-grade, wild-only), tells the agent to fetch details via inaturalist_get_observation for identifications/comments, and provides a precise pagination strategy beyond 10,000 results (order by id descending, use next_cursor). It also references companion tools like inaturalist_resolve_name and inaturalist_find_places for parameter resolution, making usage unambiguous.

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.

  1. 5 tool updates
    • Changedinaturalist_get_histogram5 fields changed
      • addedInput schema / properties / iconic_taxa
        Added value: +{
        +  "description": "Broad organism groups, by their scientific iconic-taxon name. A common-name value such as \"Birds\" matches nothing upstream, so only the listed values are accepted.",
        +  "items": {
        +    "enum": [
        +      "Actinopterygii",
        +      "Amphibia",
        +      "Animalia",
        +      "Arachnida",
        +      "Aves",
        +      "Chromista",
        +      "Fungi",
        +      "Insecta",
        +      "Mammalia",
        +      "Mollusca",
        +      "Plantae",
        +      "Protozoa",
        +      "Reptilia",
        +      "unknown"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / term_id
        Added value: +{
        +  "description": "Annotation attribute ids, from inaturalist_list_reference topic controlled_terms — e.g. 1 for Life Stage.",
        +  "items": {
        +    "maximum": 9007199254740991,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / term_value_id
        Added value: +{
        +  "description": "Annotation value ids, from the same attribute listing — e.g. 6 for Larva. Requires term_id; sent alone it is ignored upstream and the unfiltered corpus comes back.",
        +  "items": {
        +    "maximum": 9007199254740991,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `unpaired_annotation_value`: term_value_id was supplied without term_id. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_geography",
        -  "inverted_date_range",
        -  "unknown_taxon_id"
        -]New value: +[
        +  "invalid_geography",
        +  "inverted_date_range",
        +  "unpaired_annotation_value",
        +  "unknown_taxon_id"
        +]
    • Changedinaturalist_get_leaderboard1 field changed
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when nobody matched, or how to reach further down the ranking."New value: +"Guidance when nobody matched, when the page is past the last one holding entries, or how to reach further down the ranking."
    • Changedinaturalist_get_species_counts9 fields changed
      • addedInput schema / properties / project_id
        Added value: +{
        +  "description": "Restrict to observations in one project, by numeric project id from inaturalist_resolve_name type project.",
        +  "maximum": 9007199254740991,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / user_id
        Added value: +{
        +  "description": "Restrict to one observer, by numeric user id from inaturalist_resolve_name type user. Mutually exclusive with user_login.",
        +  "maximum": 9007199254740991,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / user_login
        Added value: +{
        +  "description": "Restrict to one observer, by login — the login on an inaturalist_resolve_name user candidate, a leaderboard entry, or an observation’s observer. Mutually exclusive with user_id.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `unpaired_annotation_value`: term_value_id was supplied without term_id. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `unpaired_annotation_value`: term_value_id was supplied without term_id. `conflicting_observer`: user_id and user_login were both supplied. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. `unknown_user`: iNaturalist answered 422 because the user_id or user_login names no observer. `unknown_project_id`: iNaturalist answered 422 because the project_id does not exist. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_geography",
        -  "inverted_date_range",
        -  "unpaired_annotation_value",
        -  "unknown_taxon_id"
        -]New value: +[
        +  "invalid_geography",
        +  "inverted_date_range",
        +  "unpaired_annotation_value",
        +  "conflicting_observer",
        +  "unknown_taxon_id",
        +  "unknown_user",
        +  "unknown_project_id"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when nothing matched, or how to reach the species beyond this page."New value: +"Guidance when nothing matched, when the page is past the last one holding species, or how to reach the species beyond this page."
      • changedOutput schema / properties / species / description
        Previous value: -"The species, ranked by observation_count, most-observed first."New value: +"The species, ranked by observation_count, most-observed first, each at its absolute position."
      • addedOutput schema / properties / species / items / properties / position
        Added value: +{
        +  "description": "Absolute place in this ranking, counted from page 1 — 7 is the seventh most-observed species. Not the taxonomic rank, which is rank.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / species / items / required
        Previous value: -[
        -  "taxon_id",
        -  "name",
        -  "common_name",
        -  "rank",
        -  "iconic_taxon_name",
        -  "observation_count"
        -]New value: +[
        +  "position",
        +  "taxon_id",
        +  "name",
        +  "common_name",
        +  "rank",
        +  "iconic_taxon_name",
        +  "observation_count"
        +]
    • Changedinaturalist_list_reference4 fields changed
      • addedOutput schema / properties / observed_usage / items / properties / term_id
        Added value: +{
        +  "description": "Attribute id — pass it as term_id to filter search, species counts, or the histogram. Null when upstream omitted it.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / observed_usage / items / properties / term_value_id
        Added value: +{
        +  "description": "Value id — pass it as term_value_id alongside term_id. Null when upstream omitted it.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / observed_usage / items / properties / value / description
        Previous value: -"Annotation value label."New value: +"Annotation value label. Labels repeat across attributes, so filter by the ids rather than the label."
      • changedOutput schema / properties / observed_usage / items / required
        Previous value: -[
        -  "attribute",
        -  "value",
        -  "count"
        -]New value: +[
        +  "attribute",
        +  "term_id",
        +  "value",
        +  "term_value_id",
        +  "count"
        +]
    • Changedinaturalist_search_observations15 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"next_cursor from a previous page, to continue past the 10,000-result window — a positive integer observation id, sent upstream as id_below. Mutually exclusive with page, and forces an id ordering."New value: +"next_cursor from a previous id-descending page, to continue past the 10,000-result window — a positive integer observation id, sent upstream as id_below. Mutually exclusive with page, and forces order_by \"id\", order \"desc\"."
      • addedInput schema / properties / license
        Added value: +{
        +  "description": "Restrict to records whose own license_code is one of these, e.g. [\"cc-by\",\"cc0\"] for reuse with attribution only. Decode the codes with inaturalist_list_reference topic licenses; all-rights-reserved records have no code to pass.",
        +  "items": {
        +    "enum": [
        +      "cc-by",
        +      "cc-by-nc",
        +      "cc-by-nd",
        +      "cc-by-sa",
        +      "cc-by-nc-nd",
        +      "cc-by-nc-sa",
        +      "cc0"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / licensed / description
        Previous value: -"Restrict to records whose own license_code is not null."New value: +"Restrict to records whose own license_code is not null — any licence, NonCommercial and NoDerivatives variants included. For specific licences, use license."
      • changedInput schema / properties / order_by / description
        Previous value: -"Sort field. Forced to id when cursor is supplied, since a cursor only continues an id ordering."New value: +"Sort field. Set \"id\" with order \"desc\" to walk past 10,000 results: that is the one ordering next_cursor continues, so it is the only one that issues a next_cursor. A cursor forces it."
      • changedInput schema / properties / page / description
        Previous value: -"Page number within the first 10,000 results. Defaults to 1. Mutually exclusive with cursor."New value: +"Page number within the first 10,000 results, under any ordering. Defaults to 1. Mutually exclusive with cursor."
      • addedInput schema / properties / photo_license
        Added value: +{
        +  "description": "Restrict to records carrying at least one photo under one of these licence codes. Matched independently of the record’s own license_code, so check each photo’s license_code before reusing it.",
        +  "items": {
        +    "enum": [
        +      "cc-by",
        +      "cc-by-nc",
        +      "cc-by-nd",
        +      "cc-by-sa",
        +      "cc-by-nc-nd",
        +      "cc-by-nc-sa",
        +      "cc0"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / photo_licensed / description
        Previous value: -"Restrict to records with at least one licensed photo."New value: +"Restrict to records with at least one licensed photo, under any licence. For specific licences, use photo_license."
      • addedInput schema / properties / project_id
        Added value: +{
        +  "description": "Restrict to observations in one project, by numeric project id from inaturalist_resolve_name type project.",
        +  "maximum": 9007199254740991,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / user_id
        Added value: +{
        +  "description": "Restrict to one observer, by numeric user id from inaturalist_resolve_name type user. Mutually exclusive with user_login.",
        +  "maximum": 9007199254740991,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / user_login
        Added value: +{
        +  "description": "Restrict to one observer, by login — the login on an inaturalist_resolve_name user candidate, a leaderboard entry, or an observation’s observer. Mutually exclusive with user_id.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `inverted_rank_range`: hrank is a finer rank than lrank. `result_window_exceeded`: page multiplied by per_page would reach past the upstream 10,000-result window. `conflicting_pagination`: Both page and cursor were supplied. `unpaired_annotation_value`: term_value_id was supplied without term_id. `search_on_without_query`: search_on was supplied without q. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `inverted_rank_range`: hrank is a finer rank than lrank. `result_window_exceeded`: page multiplied by per_page would reach past the upstream 10,000-result window. `conflicting_pagination`: Both page and cursor were supplied. `unpaired_annotation_value`: term_value_id was supplied without term_id. `search_on_without_query`: search_on was supplied without q. `conflicting_observer`: user_id and user_login were both supplied. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. `unknown_user`: iNaturalist answered 422 because the user_id or user_login names no observer. `unknown_project_id`: iNaturalist answered 422 because the project_id does not exist. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_geography",
        -  "inverted_date_range",
        -  "inverted_rank_range",
        -  "result_window_exceeded",
        -  "conflicting_pagination",
        -  "unpaired_annotation_value",
        -  "search_on_without_query",
        -  "unknown_taxon_id"
        -]New value: +[
        +  "invalid_geography",
        +  "inverted_date_range",
        +  "inverted_rank_range",
        +  "result_window_exceeded",
        +  "conflicting_pagination",
        +  "unpaired_annotation_value",
        +  "search_on_without_query",
        +  "conflicting_observer",
        +  "unknown_taxon_id",
        +  "unknown_user",
        +  "unknown_project_id"
        +]
      • changedOutput schema / properties / has_more / description
        Previous value: -"True when this page filled per_page, so more records follow."New value: +"True when this page filled per_page and more records follow. On the page path an exactly full final page is false; under a cursor, where the offset is unknown, every full page is true."
      • changedOutput schema / properties / next_cursor / description
        Previous value: -"Pass back as cursor to continue past this page. Absent when has_more is false."New value: +"Pass back as cursor to continue past this page. Present only when has_more is true and the page was ordered by id descending; under any other ordering, raise page instead."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when nothing matched, or how to continue past a full page."New value: +"Guidance when nothing matched, when the page is past the last one holding results, or how to continue past a full page."
  2. 3 tool updates
    • Changedinaturalist_get_observation16 fields changed
      • changedInput schema / properties / include / description
        Previous value: -"Embedded arrays to expand per record. identifications is the default and is what carries the thread; the others cost context, so check photo_count and sound_count first."New value: +"Embedded arrays to expand per record. identifications is the default and is what carries the thread; the others cost context, so check photo_count and sound_count first. identifications and comments — like the observation_fields every record carries — share a 40-entry budget across the batch: each record keeps at most 40 ÷ records returned entries per array (never fewer than 4), and reports identifications_total, comments_total, and observation_fields_total beside what it kept — request one id alone for the 40-entry view."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when part of the batch did not resolve."New value: +"Guidance when part of the batch did not resolve, or when a thread or observation-field list was cut to fit the response."
      • changedOutput schema / properties / observations / description
        Previous value: -"The observations that resolved, with the expansions that were requested."New value: +"The observations that resolved, in the requested order with unresolved ids left out, carrying the expansions that were requested."
      • changedOutput schema / properties / observations / items / properties / agreements / description
        Previous value: -"How many identifications agree with the current taxon."New value: +"How many identifications currently agree with the community taxon."
      • changedOutput schema / properties / observations / items / properties / comments / description
        Previous value: -"Discussion comments. Present when \"comments\" was included."New value: +"Discussion comments, cut to their first entries in upstream order (not strictly chronological) when they exceed the per-record share of a 40-entry budget. Present when \"comments\" was included."
      • addedOutput schema / properties / observations / items / properties / comments_shown
        Added value: +{
        +  "description": "How many of them comments carries. Below comments_total when the thread was cut. Present when \"comments\" was included.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / observations / items / properties / comments_total
        Added value: +{
        +  "description": "How many comments upstream holds on the record. Present when \"comments\" was included.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / observations / items / properties / description
        Added value: +{
        +  "description": "The observer’s own note on the sighting — host plant, behaviour, habitat, count. Third-party free text. Present on the by-id tool; null when the observer wrote none.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / observations / items / properties / disagreements / description
        Previous value: -"How many identifications disagree with the current taxon."New value: +"How many identifications currently disagree with the community taxon."
      • changedOutput schema / properties / observations / items / properties / identifications / description
        Previous value: -"The identification thread. Present when \"identifications\" was included."New value: +"The identification thread, cut to its first entries in upstream order (roughly but not strictly chronological) when it exceeds the per-record share of a 40-entry budget. Present when \"identifications\" was included."
      • changedOutput schema / properties / observations / items / properties / identifications_count / description
        Previous value: -"How many identifications the thread holds."New value: +"Upstream’s tally of identifications currently agreeing or disagreeing with the community taxon — agreements + disagreements. Not the thread size: it leaves out the observer’s own identification and any that neither agrees nor disagrees, such as a coarser or withdrawn one. The thread size is identifications_total, on inaturalist_get_observation."
      • addedOutput schema / properties / observations / items / properties / identifications_shown
        Added value: +{
        +  "description": "How many of them identifications carries. Below identifications_total when the thread was cut. Present when \"identifications\" was included.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / observations / items / properties / identifications_total
        Added value: +{
        +  "description": "How many identifications upstream holds on the record — the thread size. Present when \"identifications\" was included.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / observations / items / properties / observation_fields
        Added value: +{
        +  "description": "Observation-field values filled in on the record, usually by a project; fields left blank are dropped. Cut to the first filled fields in upstream order when they exceed the per-record share of a 40-entry budget. Present on the by-id tool.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One filled observation field.",
        +    "properties": {
        +      "name": {
        +        "description": "Field name, as its creator wrote it, e.g. \"Habitat_Description\".",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "value": {
        +        "description": "The value filled in, verbatim.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "value"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / observations / items / properties / observation_fields_shown
        Added value: +{
        +  "description": "How many of them observation_fields carries. Below observation_fields_total when the list was cut. Present on the by-id tool.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / observations / items / properties / observation_fields_total
        Added value: +{
        +  "description": "How many filled observation fields the record carries. Present on the by-id tool.",
        +  "type": "number"
        +}
    • Changedinaturalist_get_similar_species3 fields changed
      • changedInput schema / properties / taxon_id / description
        Previous value: -"Numeric taxon id to find look-alikes for. Resolve a name to an id with inaturalist_resolve_name."New value: +"Numeric taxon id to find look-alikes for, at genus or finer — a genus, species, or subspecies; a family or anything coarser is refused. Resolve a name to an id with inaturalist_resolve_name."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. `taxon_rank_too_coarse`: iNaturalist answered 422 because the taxon is coarser than genus, such as a family, order, or class. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_geography",
        -  "inverted_date_range",
        -  "unknown_taxon_id"
        -]New value: +[
        +  "invalid_geography",
        +  "inverted_date_range",
        +  "unknown_taxon_id",
        +  "taxon_rank_too_coarse"
        +]
    • Changedinaturalist_search_observations13 fields changed
      • changedOutput schema / properties / observations / items / properties / agreements / description
        Previous value: -"How many identifications agree with the current taxon."New value: +"How many identifications currently agree with the community taxon."
      • changedOutput schema / properties / observations / items / properties / comments / description
        Previous value: -"Discussion comments. Present when \"comments\" was included."New value: +"Discussion comments, cut to their first entries in upstream order (not strictly chronological) when they exceed the per-record share of a 40-entry budget. Present when \"comments\" was included."
      • addedOutput schema / properties / observations / items / properties / comments_shown
        Added value: +{
        +  "description": "How many of them comments carries. Below comments_total when the thread was cut. Present when \"comments\" was included.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / observations / items / properties / comments_total
        Added value: +{
        +  "description": "How many comments upstream holds on the record. Present when \"comments\" was included.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / observations / items / properties / description
        Added value: +{
        +  "description": "The observer’s own note on the sighting — host plant, behaviour, habitat, count. Third-party free text. Present on the by-id tool; null when the observer wrote none.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / observations / items / properties / disagreements / description
        Previous value: -"How many identifications disagree with the current taxon."New value: +"How many identifications currently disagree with the community taxon."
      • changedOutput schema / properties / observations / items / properties / identifications / description
        Previous value: -"The identification thread. Present when \"identifications\" was included."New value: +"The identification thread, cut to its first entries in upstream order (roughly but not strictly chronological) when it exceeds the per-record share of a 40-entry budget. Present when \"identifications\" was included."
      • changedOutput schema / properties / observations / items / properties / identifications_count / description
        Previous value: -"How many identifications the thread holds."New value: +"Upstream’s tally of identifications currently agreeing or disagreeing with the community taxon — agreements + disagreements. Not the thread size: it leaves out the observer’s own identification and any that neither agrees nor disagrees, such as a coarser or withdrawn one. The thread size is identifications_total, on inaturalist_get_observation."
      • addedOutput schema / properties / observations / items / properties / identifications_shown
        Added value: +{
        +  "description": "How many of them identifications carries. Below identifications_total when the thread was cut. Present when \"identifications\" was included.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / observations / items / properties / identifications_total
        Added value: +{
        +  "description": "How many identifications upstream holds on the record — the thread size. Present when \"identifications\" was included.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / observations / items / properties / observation_fields
        Added value: +{
        +  "description": "Observation-field values filled in on the record, usually by a project; fields left blank are dropped. Cut to the first filled fields in upstream order when they exceed the per-record share of a 40-entry budget. Present on the by-id tool.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One filled observation field.",
        +    "properties": {
        +      "name": {
        +        "description": "Field name, as its creator wrote it, e.g. \"Habitat_Description\".",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "value": {
        +        "description": "The value filled in, verbatim.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "value"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / observations / items / properties / observation_fields_shown
        Added value: +{
        +  "description": "How many of them observation_fields carries. Below observation_fields_total when the list was cut. Present on the by-id tool.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / observations / items / properties / observation_fields_total
        Added value: +{
        +  "description": "How many filled observation fields the record carries. Present on the by-id tool.",
        +  "type": "number"
        +}
  3. 7 tool updates
    • Changedinaturalist_find_places7 fields changed
      • changedInput schema / properties / nelat / description
        Previous value: -"North-east corner latitude of the map area. All four corners or none."New value: +"North-east corner latitude of the map area, at or north of swlat. All four corners or none."
      • changedInput schema / properties / nelng / description
        Previous value: -"North-east corner longitude of the map area. All four corners or none."New value: +"North-east corner longitude of the map area. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian."
      • changedInput schema / properties / per_page / description
        Previous value: -"Maximum places to return. Honoured on the bounding-box arm only — the name-prefix endpoint publishes no page size and returns a fixed page."New value: +"Maximum places per list. Honoured on the bounding-box arm only, where it bounds the standard and community lists separately, so up to twice this many places come back. The name-prefix endpoint publishes no page size and returns a fixed page."
      • changedOutput schema / properties / cap / description
        Previous value: -"The page size that bounded this response — per_page on the bounding-box arm, the fixed page upstream served on the name-prefix arm."New value: +"The most places this response could carry — per_page × 2 on the bounding-box arm, where per_page bounds each list separately; the fixed page upstream served on the name-prefix arm."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_geography`: Neither q nor a complete bounding box was given, or both were. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_geography`: Neither q nor a complete bounding box was given, both were, or the box has nelat south of swlat. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total places upstream matched, before any page limit."New value: +"Places upstream reports. On the name-prefix arm, every match before the fixed page; on the bounding-box arm, only the places returned (standard plus community), so it is bounded by the page size rather than a full count."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when more places matched than were returned."New value: +"True when more places may exist than were returned — on the bounding-box arm, when the standard or community list reached per_page."
    • Changedinaturalist_get_histogram7 fields changed
      • changedInput schema / properties / d1 / description
        Previous value: -"Earliest observation date, YYYY-MM-DD. Inclusive. With interval set to day or hour, a wide range can exceed the 800-bucket cap — narrow d1/d2 to reach buckets past it."New value: +"Earliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2. With interval set to day or hour, a wide range can exceed the 800-bucket cap — narrow d1/d2 to reach buckets past it."
      • changedInput schema / properties / nelat / description
        Previous value: -"North-east corner latitude of the bounding box. All four corners or none."New value: +"North-east corner latitude of the bounding box, at or north of swlat. All four corners or none."
      • changedInput schema / properties / nelng / description
        Previous value: -"North-east corner longitude of the bounding box. All four corners or none."New value: +"North-east corner longitude of the bounding box. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian."
      • changedInput schema / properties / radius / description
        Previous value: -"Search radius around lat/lng, in KILOMETRES. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes."New value: +"Search radius around lat/lng, in KILOMETRES, greater than 0. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes."
      • removedInput schema / properties / radius / minimum
        Removed value: -0
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially or in two forms at once. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_geography",
        -  "unknown_taxon_id"
        -]New value: +[
        +  "invalid_geography",
        +  "inverted_date_range",
        +  "unknown_taxon_id"
        +]
    • Changedinaturalist_get_leaderboard7 fields changed
      • changedInput schema / properties / d1 / description
        Previous value: -"Earliest observation date, YYYY-MM-DD. Inclusive."New value: +"Earliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2."
      • changedInput schema / properties / nelat / description
        Previous value: -"North-east corner latitude of the bounding box. All four corners or none."New value: +"North-east corner latitude of the bounding box, at or north of swlat. All four corners or none."
      • changedInput schema / properties / nelng / description
        Previous value: -"North-east corner longitude of the bounding box. All four corners or none."New value: +"North-east corner longitude of the bounding box. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian."
      • changedInput schema / properties / radius / description
        Previous value: -"Search radius around lat/lng, in KILOMETRES. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes."New value: +"Search radius around lat/lng, in KILOMETRES, greater than 0. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes."
      • removedInput schema / properties / radius / minimum
        Removed value: -0
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially or in two forms at once. `leaderboard_window_exceeded`: page multiplied by per_page would reach past the 500 entries these endpoints rank. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `leaderboard_window_exceeded`: page multiplied by per_page would reach past the 500 entries these endpoints rank. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_geography",
        -  "leaderboard_window_exceeded",
        -  "unknown_taxon_id"
        -]New value: +[
        +  "invalid_geography",
        +  "inverted_date_range",
        +  "leaderboard_window_exceeded",
        +  "unknown_taxon_id"
        +]
    • Changedinaturalist_get_similar_species7 fields changed
      • changedInput schema / properties / d1 / description
        Previous value: -"Earliest observation date, YYYY-MM-DD. Inclusive."New value: +"Earliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2."
      • changedInput schema / properties / nelat / description
        Previous value: -"North-east corner latitude of the bounding box. All four corners or none."New value: +"North-east corner latitude of the bounding box, at or north of swlat. All four corners or none."
      • changedInput schema / properties / nelng / description
        Previous value: -"North-east corner longitude of the bounding box. All four corners or none."New value: +"North-east corner longitude of the bounding box. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian."
      • changedInput schema / properties / radius / description
        Previous value: -"Search radius around lat/lng, in KILOMETRES. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes."New value: +"Search radius around lat/lng, in KILOMETRES, greater than 0. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes."
      • removedInput schema / properties / radius / minimum
        Removed value: -0
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially or in two forms at once. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_geography",
        -  "unknown_taxon_id"
        -]New value: +[
        +  "invalid_geography",
        +  "inverted_date_range",
        +  "unknown_taxon_id"
        +]
    • Changedinaturalist_get_species_counts7 fields changed
      • changedInput schema / properties / d1 / description
        Previous value: -"Earliest observation date, YYYY-MM-DD. Inclusive."New value: +"Earliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2."
      • changedInput schema / properties / nelat / description
        Previous value: -"North-east corner latitude of the bounding box. All four corners or none."New value: +"North-east corner latitude of the bounding box, at or north of swlat. All four corners or none."
      • changedInput schema / properties / nelng / description
        Previous value: -"North-east corner longitude of the bounding box. All four corners or none."New value: +"North-east corner longitude of the bounding box. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian."
      • changedInput schema / properties / radius / description
        Previous value: -"Search radius around lat/lng, in KILOMETRES. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes."New value: +"Search radius around lat/lng, in KILOMETRES, greater than 0. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes."
      • removedInput schema / properties / radius / minimum
        Removed value: -0
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially or in two forms at once. `unpaired_annotation_value`: term_value_id was supplied without term_id. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `unpaired_annotation_value`: term_value_id was supplied without term_id. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_geography",
        -  "unpaired_annotation_value",
        -  "unknown_taxon_id"
        -]New value: +[
        +  "invalid_geography",
        +  "inverted_date_range",
        +  "unpaired_annotation_value",
        +  "unknown_taxon_id"
        +]
    • Changedinaturalist_resolve_name3 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum candidates to return."New value: +"Maximum candidates to return, applied to every type."
      • addedOutput schema / properties / candidates / items / properties / login
        Added value: +{
        +  "description": "Observer login, on users only — the value inaturalist_get_leaderboard entries and an observation’s observer carry.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / candidates / items / properties / name / description
        Previous value: -"Scientific name, place name, or login."New value: +"Scientific name on taxa, place name, project title, or an observer’s display name — which falls back to the login when the observer set none."
    • Changedinaturalist_search_observations9 fields changed
      • changedInput schema / properties / d1 / description
        Previous value: -"Earliest observation date, YYYY-MM-DD. Inclusive."New value: +"Earliest observation date, YYYY-MM-DD. Inclusive. Must be on or before d2."
      • changedInput schema / properties / hrank / description
        Previous value: -"Highest taxonomic rank of the identification to accept."New value: +"Highest (coarsest) taxonomic rank of the identification to accept. Must be at or above lrank; ranks compare by rank level."
      • changedInput schema / properties / lrank / description
        Previous value: -"Lowest taxonomic rank of the identification to accept."New value: +"Lowest (finest) taxonomic rank of the identification to accept. Equal to hrank for an exact-rank match."
      • changedInput schema / properties / nelat / description
        Previous value: -"North-east corner latitude of the bounding box. All four corners or none."New value: +"North-east corner latitude of the bounding box, at or north of swlat. All four corners or none."
      • changedInput schema / properties / nelng / description
        Previous value: -"North-east corner longitude of the bounding box. All four corners or none."New value: +"North-east corner longitude of the bounding box. All four corners or none. West of swlng is accepted: it describes a box crossing the antimeridian."
      • changedInput schema / properties / radius / description
        Previous value: -"Search radius around lat/lng, in KILOMETRES. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes."New value: +"Search radius around lat/lng, in KILOMETRES, greater than 0. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes."
      • removedInput schema / properties / radius / minimum
        Removed value: -0
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially or in two forms at once. `result_window_exceeded`: page multiplied by per_page would reach past the upstream 10,000-result window. `conflicting_pagination`: Both page and cursor were supplied. `unpaired_annotation_value`: term_value_id was supplied without term_id. `search_on_without_query`: search_on was supplied without q. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_geography`: An area was given partially, in two forms at once, with a radius of 0 or less, or with nelat south of swlat. `inverted_date_range`: d1 is after d2. `inverted_rank_range`: hrank is a finer rank than lrank. `result_window_exceeded`: page multiplied by per_page would reach past the upstream 10,000-result window. `conflicting_pagination`: Both page and cursor were supplied. `unpaired_annotation_value`: term_value_id was supplied without term_id. `search_on_without_query`: search_on was supplied without q. `unknown_taxon_id`: iNaturalist answered 422 because the taxon_id does not exist. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_geography",
        -  "result_window_exceeded",
        -  "conflicting_pagination",
        -  "unpaired_annotation_value",
        -  "search_on_without_query",
        -  "unknown_taxon_id"
        -]New value: +[
        +  "invalid_geography",
        +  "inverted_date_range",
        +  "inverted_rank_range",
        +  "result_window_exceeded",
        +  "conflicting_pagination",
        +  "unpaired_annotation_value",
        +  "search_on_without_query",
        +  "unknown_taxon_id"
        +]
  4. 10 tool updates
    • First observedinaturalist_find_places
    • First observedinaturalist_get_histogram
    • First observedinaturalist_get_leaderboard
    • First observedinaturalist_get_observation
    • First observedinaturalist_get_similar_species
    • First observedinaturalist_get_species_counts
    • First observedinaturalist_get_taxon
    • First observedinaturalist_list_reference
    • First observedinaturalist_resolve_name
    • First observedinaturalist_search_observations

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables querying citizen-science species observations from iNaturalist via the Pipeworx MCP gateway. Provides read-only access to species data without authentication.
    57 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables querying a global plant database with over 1 million species, providing access to plant records and species search via natural language.
    382 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to query and retrieve biodiversity data from the Global Biodiversity Information Facility (GBIF), including species, occurrences, datasets, and literature.
    289 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.