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
99.8% over 36 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/inaturalist-mcp-server
GitHub Stars
2
Server Listing
@cyanheads/inaturalist-mcp-server

TDQS

A4.4/5.0

Scored across 10 tools

Disambiguation4/5

Each tool maps to a distinct analytical output (histogram, leaderboard, species counts, similar species, raw observation search), and descriptions explicitly cross-reference each other to steer misuse away. The one real overlap is place resolution: both inaturalist_find_places and inaturalist_resolve_name claim to turn a place name into an id, leaving the agent to guess which to call.

Naming Consistency5/5

Every tool uses the same inaturalist_ prefix plus a consistent verb_noun pattern (find_places, get_taxon, list_reference, resolve_name, search_observations). No mixed casing or verb-style drift.

Tool Count5/5

Ten tools is well-scoped for a read-only biodiversity API wrapper, with each tool earning its place as a distinct query type. Nothing feels redundant or padded.

Completeness4/5

The read surface is thorough: name resolution, taxonomy, observations, places, histograms, rankings, confusion sets, and reference lookups cover the main questions an agent would ask. The obvious gap is the write side (creating observations, adding identifications/comments), which may be intentional for a read-only server.

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.

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. Ceiling: 30; oversized values are clamped.

Output 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.5/5.0
Behavior5/5

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

Goes well beyond the readOnly/openWorld annotations: it discloses that geometry is stripped from results and quantifies the avoided payload (247 KB of boundary polygons), and it flags the per_page quirk where the bounding-box arm can return up to twice the requested count while the name-prefix arm returns a fixed page. These are non-obvious behaviors an agent would otherwise discover only by failure.

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 sentences, front-loaded with the two modes, then the exclusivity constraint, then the output-shape contract. The payload-size detail is compressed into a single clause rather than a paragraph, so nothing is padded.

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, return values need no explanation, and the description instead supplies the things structure cannot: mode selection rules, output truncation policy, pagination asymmetry, and what is deliberately omitted from results. Nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so individual parameters are already fully documented, including prefix matching, antimeridian handling, and the all-four-or-none rule. The description restates the mutual-exclusivity rule at tool level but adds no parameter syntax or format detail beyond the schema; baseline 3 applies.

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?

States two specific verbs and a concrete resource: resolve a place name to a place id, or list places covering a map area. The distinction from inaturalist_resolve_name (name resolution) is implicitly clear because this tool is scoped to places and to a two-arm search.

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?

Explicitly defines the two modes and the hard exclusivity rule ('exactly one of the two, never both'), which is exactly the decision an agent must make before calling. It stops short of naming sibling tools or saying when to prefer this over inaturalist_resolve_name, so it is a clear 4 rather than 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_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.

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.
captiveNoTrue returns captive and cultivated records only — zoo animals, garden plantings; false returns wild records only. Defaults to false.
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.
created_d1NoEarliest upload date, YYYY-MM-DD. Inclusive. Must be on or before created_d2.
created_d2NoLatest upload date, YYYY-MM-DD. Inclusive.
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, normalized to unique values in first-appearance order. 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

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.4/5.0
Behavior4/5

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

Annotations already establish read-only and open-world behavior, but the description adds meaningful operational context: default research-grade and wild-only filters, that defaults are echoed back, interval folding behavior, and upstream default start-date handling for absolute intervals. It does not mention the 800-bucket cap in the description (that is in schema), but overall it adds useful behavioral context beyond annotations.

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 front-loaded with the core purpose and then covers the important operational choices in dense but useful sentences. It is appropriately sized for a 20-parameter tool, though the long middle sentence packs many constraints together and could be slightly more scannable.

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 20-parameter read-only tool with an output schema and 100% schema coverage, the description covers the central behavior, interval semantics, area exclusivity, defaults, and filtering modes. Remaining details such as date bounds and created-date fields are adequately delegated to the schema.

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 would be 3, but the description adds conceptual meaning beyond field-level docs: it explains the default month_of_year seasonal curve, the exclusive area forms, annotation-pair narrowing with examples, and omitting taxon_id to chart all taxa. These additions improve parameter understanding without merely repeating 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 states a specific verb and resource: it builds a phenology histogram for a taxon in an area. It also clarifies the central output concept ('which months, weeks, or years it is recorded in'), which distinguishes it from sibling search/count tools without requiring schema inspection.

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 gives clear usage context: default month_of_year answers seasonal bloom/appearance questions, absolute intervals bucket real dates, area must be supplied in exactly one form, and omitting taxon_id charts all taxa. It does not explicitly compare against alternatives such as inaturalist_get_species_counts or inaturalist_search_observations, so it stops short of full when/when-not 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.

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. Two ceiling-sized pages cover the 500-entry window. Ceiling: 250; oversized values are clamped.
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, normalized to unique values in first-appearance order. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence.

Output 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.5/5.0
Behavior4/5

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

Annotations already cover safety (readOnlyHint) and open-world behavior, so the description's real contribution is the ranking-window cap — only the top 500 entries are ranked, which silently truncates results — plus the advice to narrow area/period/taxon to reach lower ranks. That is substantive behavioral context an agent could not infer from the schema; it stops short of five only because auth and rate-limit behavior go unmentioned.

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, front-loaded with the purpose, then the mode selector, then the area rule, then the cap and alternative. Every sentence carries weight, though the sentence explaining how observers vs identifiers are ranked repeats what the `kind` enum description already says.

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, the description covers the parts the schema cannot express structurally: mutually exclusive area forms, the hard 500-entry ranking limit, and the sibling route for species counts. Return shape is handled by the existing output schema, so the remaining gaps (quality_grade defaults, taxon_id resolution path) are already documented in the schema itself.

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?

With 100% schema coverage the baseline is 3, and the description earns above that by stating the cross-parameter constraint (page × per_page ≤ 500) that the schema documents only piecewise via per_page's 'two ceiling-sized pages' note. It also restates the exactly-one-area rule more crisply than the schema's per-field 'mutually exclusive' wording, though the `kind` explanation largely duplicates the enum's own description.

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?

States a specific verb and resource — ranking the most active observers or identifiers — and immediately qualifies it by area, period, and taxon. It also explicitly disambiguates from the sibling tool that ranks species rather than people (inaturalist_get_species_counts).

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?

Names the choice that selects the two modes via `kind`, states that an area must be given in exactly one of three forms (place_id, lat/lng/radius, or bounding box), and warns that the 500-entry window means page×per_page must stay at or below 500, with a suggested remedy. It also routes the agent to inaturalist_get_species_counts when the intent is species rather than people.

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 distinct 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 attempted batch costs one upstream request. Records come back in requested order; remaining distinct ids are deferred for another call with the same include. Missing attempted ids appear in unresolved; the call fails only when nothing resolved and no deferred work remains. Long threads and observation-field lists share a response budget across resolved records — up to 40 entries per array for one record, 4 for a full batch — and every record reports the size of each array beside what it kept.

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 100 submitted ids. The first 10 distinct ids are attempted; any remaining distinct ids are deferred to another call. Find current ids for an area with inaturalist_search_observations.

Output 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.
deferredNoDistinct ids beyond the attempted batch, in requested order. Empty when no work remains.
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

A4.5/5.0
Behavior5/5

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

With annotations already covering read-only, open-world, and idempotent behavior, the description adds substantial operational detail: one upstream request per attempted batch, order preservation, deferred ids, unresolved missing ids, and failure only when no resolution and no deferral remain. It also discloses response-budget behavior across arrays.

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 front-loaded and purposeful. Each sentence adds operational information about batching, deferral, failure, or response budgets without wasting space.

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 output schema, rich annotations, and full schema coverage, the description is complete for correct invocation. It covers the non-obvious batch, deferral, unresolved-id, and response-budget behavior that an agent must understand.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents both parameters in detail. The description reinforces the 10-id attempt limit and include continuity but does not add much beyond the schema's own parameter explanations.

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: fetching observations by id, including their community identification thread. It delineates scope precisely with batch limits and the consensus/identification content, making it clearly distinct from search-based sibling tools.

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 explains the batch continuation model and failure condition, and the schema points to inaturalist_search_observations for obtaining ids. However, the main description does not explicitly say when to prefer this tool over alternatives beyond the implicit 'by id' framing.

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.

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 to the whole upstream confusion set. Ceiling: 50; oversized values are clamped.
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.
captiveNoTrue returns captive and cultivated records only — zoo animals, garden plantings; false returns wild records only. Defaults to false.
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, normalized to unique values in first-appearance order. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence.

Output 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
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, and the description adds substantive context beyond them: ranking basis, upstream refusal of coarser ranks, HTTP 500 on a non-numeric place_id, and clamping of oversized limits. It does not discuss result size or pagination, but the output schema covers return shape, so this is close to the ceiling.

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?

Front-loaded with the purpose and ranking semantics, then scope rules, then the rank constraint and the resolve-name pointer. Dense and largely waste-free, though the single long sentence packing the three area forms is harder to scan than a short list would be.

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 14-parameter read-only tool with full schema coverage and an output schema, the description supplies the decision-relevant facts an agent needs: what the result means, how to scope it, the rank restriction, and the name-resolution prerequisite. 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 coverage is 100%, so baseline is 3, but the description adds real meaning: the three area forms are mutually exclusive and only one may be used, radius is in kilometres, and taxon_id must resolve to genus or finer. That goes beyond restating 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?

States a specific verb and resource: lists taxa the given taxon is most often misidentified as, ranked by correction counts. It is clearly distinguishable from siblings like inaturalist_get_taxon or inaturalist_search_observations, and the 'field-identification check' framing pins down the intent.

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?

Explicitly says when to use it (pre-identification look-alike check), how to scope it (exactly one area form, or omit for global), the taxonomic-rank precondition (genus or finer, families refused), and names the prerequisite tool inaturalist_resolve_name. Alternatives and exclusions are named, not inferred.

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.

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.
captiveNoTrue returns captive and cultivated records only — zoo animals, garden plantings; false returns wild records only. Defaults to false.
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. Raise page to continue the ranking. Ceiling: 50; oversized values are clamped.
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, normalized to unique values in first-appearance order. 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

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.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the bar is lower; the description still adds real behavior — implicit defaults of research-grade and wild-only, and that those defaults are echoed back in the response. It does not mention pagination limits or rate behavior, but the applied-filter echo is a useful disclosure beyond 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 compact sentences with the core action first, then the area-encoding constraint, then narrowing options, then the sibling handoff. Every clause carries distinct information and none is filler.

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 21-parameter tool with an output schema and full schema coverage, the description covers the operation's essence, the mutual-exclusivity rules, and the defaults that change results. The heavier filter parameters (annotations, iconic_taxa) are left entirely to the schema, which is acceptable given its completeness.

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

Parameters3/5

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

Schema description coverage is 100% and every parameter is documented there, so the baseline is 3. The description reinforces the spatial-exclusivity rule and gives the clade example ("the birds of a park"), but adds little that the schema does not already state about term_id, iconic_taxa, quality_grade, or per_page.

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?

Opens with a specific verb+resource ("Rank the distinct species recorded in an area and period, most-observed first") and frames it as the aggregated alternative to paging through sightings. An agent can distinguish it from search_observations and get_leaderboard without opening any schema.

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?

Explicitly routes the agent: "For the most active people rather than the most recorded species, use inaturalist_get_leaderboard," and states that an area comes in exactly one of three forms (place_id, lat/lng/radius, or bounding box), naming the narrowing dimensions (taxon_id, user_id, project_id). When-to-use and which-sibling-to-pick are both covered.

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.

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

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_countNoNumber of place checklists containing this taxon.
observations_countNoHow many observations carry this taxon or a descendant of it.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld, and the description adds substantive non-obvious behavior: the upstream record is ~95 KB, the response is projected before anything else happens, and overflow returns an outline of sections with byte sizes rather than an error. This is exactly the kind of operational context annotations cannot carry.

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?

Front-loaded with the return payload, then prerequisites, then the overflow mechanism, then the valid section names. Every sentence carries distinct information; nothing is filler despite the density.

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?

Output schema exists, so return values needn't be re-explained, yet the description still covers the one case an output schema can't express well — the overflow outline shape and the re-call protocol. An agent has everything needed to call this correctly on the first try.

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 parameter docs are already strong; the description adds the surrounding semantics of the sections lifecycle (omit for full profile, outline on overflow, re-call with named sections) and lists the valid section names inline. It stops short of adding anything the schema doesn't say about taxon_id beyond reinforcing the resolve-name step.

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?

States a specific verb ('Fetch') plus resource ('taxon profile') and enumerates exactly what comes back: taxonomic path, conservation listings, encyclopedia summary, photo gallery, children, observation counts. It also distinguishes itself from the sibling inaturalist_resolve_name, which handles name-to-id resolution rather than profile retrieval.

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?

Explicitly gives the prerequisite workflow ('Resolve a name to a taxon id with inaturalist_resolve_name first') and spells out the escalation path: call without sections, receive an outline on overflow, then re-call naming sections. It also warns about summing byte sizes before requesting several sections, which is actionable when-to-use guidance.

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

Look up annotation attributes/values, quality grades, licences, ranks, iconic taxa, and conservation codes before filtering; unknown values can silently return nothing. Conservation codes are the normalised csi filter, distinct from authority-specific taxon status text. With topic controlled_terms and taxon_id, also return observed annotation usage and counts.

NameRequiredDescriptionDefault
topicYesVocabulary to decode; controlled_terms is live/cached, the rest static.
taxon_idNoAdd annotation usage counts, most-used first; only with controlled_terms. Get the id from inaturalist_resolve_name.

Output 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" for fetched data, "static" for spec-derived tables.
entriesNoThe vocabulary, one entry per code or attribute.
observed_usageNoAnnotation usage, most-used first; present with taxon_id.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark this read-only/open-world, and the description adds real behavioral value beyond them: the silent-empty-result failure mode, the warning that conservation codes are the normalised csi filter rather than authority-specific taxon status text, and the conditional enrichment behaviour of taxon_id with controlled_terms. No contradiction with 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?

Three tight sentences, front-loaded with the lookup purpose and immediately followed by the failure-mode warning; no filler and no repetition of schema verbatim except where it serves flow.

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 two-parameter reference tool with an output schema, the description covers purpose, timing, failure mode, and the one non-obvious semantic trap. Nothing an agent needs to call it correctly 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 coverage is 100%, so the baseline is 3; the description earns an extra point by clarifying that conservation_status_codes returns normalised csi values distinct from authority-specific status text, which the enum alone does not convey. The taxon_id/controlled_terms interaction is restated from the schema rather than newly explained.

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

Purpose4/5

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

States a specific verb ('look up') and an explicit resource set (annotation attributes/values, quality grades, licences, ranks, iconic taxa, conservation codes), making clear this is a vocabulary-reference tool rather than a data-search tool. Sibling tools are not named, so it falls just short of a 5, but the purpose is unambiguous against the search/get 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?

'before filtering' plus 'unknown values can silently return nothing' tells the agent exactly when this tool belongs in a workflow and what goes wrong if skipped. It does not name a specific alternative tool to pair with, which is the only missing piece.

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.

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. Ceiling: 30; oversized values are clamped.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
foundNoTrue when at least one candidate matched.
noticeNoRequested and applied limits when an oversized limit was clamped.
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.9/5.0
Behavior5/5

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

Annotations only declare readOnly and openWorld, yet the description discloses the failure contract ('found comes back false with guidance naming why') and the matching semantics (prefix, not infix). These are non-obvious behaviors an agent cannot infer from the schema or 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 short sentences, front-loaded with the core action, then the return contract, then the failure mode, then the one gotcha. No sentence is redundant with the schema or annotations.

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 needn't enumerate return fields, but it still characterizes the response (ranked candidates carrying usable identifiers) and the miss case. Nothing needed to call this four-parameter resolver correctly 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 coverage is 100%, so the baseline is 3; the description earns above that by adding the prefix-matching interpretation of 'q' that the schema does not spell out. It adds little for rank/type/limit, which the schema already documents thoroughly, keeping it short of a 5.

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?

States a specific verb ('resolve') and the exact set of resources handled (common/scientific name, place, project, observer) with the output being an id. It also names the sibling it is not, inaturalist_find_places, so an agent can route without opening either schema.

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?

Explicitly directs agents to inaturalist_find_places when bounding box or containment chain is needed rather than a plain id, and the prefix-matching note tells the agent how to phrase queries ('monarch' vs 'monarch butterfly'). Usage conditions are stated rather than implied.

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.

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.
soundsNoTrue selects observations with sounds; false selects those without. Omit for either. Use include: ["sounds"] to expand sound metadata; no media is downloaded.
captiveNoTrue returns captive and cultivated records only — zoo animals, garden plantings; false returns wild records only. Defaults to false.
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 fetched per page. Complete records may be deferred to keep the response within its byte budget; retrieve deferred ids through inaturalist_get_observation with the same include values. Ceiling: 25; oversized values are clamped.
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, normalized to unique values in first-appearance order. 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

NameRequiredDescription
capNoThe per_page that was applied.
errorNoPresent when the call failed. Absent on success.
shownNoHow many records this page carries.
noticeNoComposed guidance for applied limits, ignored filters, empty pages, deferred ids and pagination.
deferredNoOrdered ids of the fetched-page suffix omitted from observations to meet the response budget. Empty when the whole page fits; independent of has_more.
has_moreNoTrue when the fetched page filled the applied per_page and more records follow, independent of deferred ids. 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 records were deferred or more pages 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

A4.7/5.0
Behavior5/5

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

Annotations only declare readOnly/openWorld, so the description carries the rest and does so well: it discloses the implicit defaults (research-grade, wild-only) and that they are echoed back, the return projection, the hard 10,000-result page window with the id-descending/cursor workaround, and a payload-size warning explaining why identifications are excluded. This is context an agent could not derive from annotations or schema 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?

Four sentences, front-loaded with purpose, then return shape, then constraints, then the pagination escape hatch. Dense but every clause carries actionable information; nothing restates the name or the schema verbatim.

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 39-parameter, all-optional search tool with an output schema, the description covers the risks that matter: implicit defaults, mutually exclusive area forms, result-window limits, and payload cost. Nothing an agent needs before calling 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 coverage is 100%, so baseline is 3, but the description adds real semantics: 'an area is given in exactly one form' with the three mutually exclusive options, the interaction between page/cursor and order_by, and the unit note (kilometres) for the radius triple. It stops short of covering the licence/annotation-code parameters, which the schema already handles 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?

Opens with a specific verb+resource ('Search georeferenced wildlife sightings') and enumerates the filterable dimensions, then states what a record contains. It explicitly carves out the boundary with inaturalist_get_observation ('identifications and comments are deliberately not expandable here'), so an agent can separate this from the detail-fetch sibling without opening schemas.

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?

Gives concrete routing advice: use this for search, fetch identification threads via inaturalist_get_observation, and the exact pagination strategy past 10,000 results. It does not contrast against the aggregation siblings (get_species_counts, get_histogram, get_leaderboard), leaving the agent to infer when a counts/histogram tool is preferable to a record listing.

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. 10 tool updates
    • Changedinaturalist_find_places4 fields changed
      • changedInput schema / properties / per_page / description
        Previous 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."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. Ceiling: 30; oversized values are clamped."
      • addedInput schema / properties / per_page / exclusiveMinimum
        Added value: +0
      • changedInput schema / properties / per_page / maximum
        Previous value: -30New value: +9007199254740991
      • removedInput schema / properties / per_page / minimum
        Removed value: -1
    • Changedinaturalist_get_histogram7 fields changed
      • changedInput schema / properties / captive / description
        Previous value: -"Whether to include captive and cultivated records — zoo animals, garden plantings. Defaults to wild organisms only."New value: +"True returns captive and cultivated records only — zoo animals, garden plantings; false returns wild records only. Defaults to false."
      • addedInput schema / properties / created_d1
        Added value: +{
        +  "description": "Earliest upload date, YYYY-MM-DD. Inclusive. Must be on or before created_d2.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / created_d2
        Added value: +{
        +  "description": "Latest upload date, YYYY-MM-DD. Inclusive.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • changedInput schema / properties / quality_grade / description
        Previous value: -"Identification confidence tiers to include. Defaults to research-grade only; adding \"needs_id\" roughly doubles the corpus and lowers identification confidence."New value: +"Identification confidence tiers to include, normalized to unique values in first-appearance order. Defaults to research-grade only; adding \"needs_id\" roughly doubles the corpus and lowers identification confidence."
      • changedOutput schema / properties / applied_filters / properties / captive / description
        Previous value: -"Whether captive and cultivated records were included."New value: +"Captive-only when true, wild-only when false."
      • 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: `unknown_place_id`: iNaturalist answered 422 because place_id does not exist. `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, or created_d1 is after created_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",
        -  "unpaired_annotation_value",
        -  "unknown_taxon_id"
        -]New value: +[
        +  "unknown_place_id",
        +  "invalid_geography",
        +  "inverted_date_range",
        +  "unpaired_annotation_value",
        +  "unknown_taxon_id"
        +]
    • Changedinaturalist_get_leaderboard7 fields changed
      • changedInput schema / properties / per_page / description
        Previous value: -"Entries 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."New value: +"Entries per page. Two ceiling-sized pages cover the 500-entry window. Ceiling: 250; oversized values are clamped."
      • addedInput schema / properties / per_page / exclusiveMinimum
        Added value: +0
      • changedInput schema / properties / per_page / maximum
        Previous value: -250New value: +9007199254740991
      • removedInput schema / properties / per_page / minimum
        Removed value: -1
      • changedInput schema / properties / quality_grade / description
        Previous value: -"Identification confidence tiers to include. Defaults to research-grade only; adding \"needs_id\" roughly doubles the corpus and lowers identification confidence."New value: +"Identification confidence tiers to include, normalized to unique values in first-appearance order. Defaults to research-grade only; adding \"needs_id\" roughly doubles the corpus and lowers identification confidence."
      • 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. `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: `unknown_place_id`: iNaturalist answered 422 because place_id does not exist. `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",
        -  "inverted_date_range",
        -  "leaderboard_window_exceeded",
        -  "unknown_taxon_id"
        -]New value: +[
        +  "unknown_place_id",
        +  "invalid_geography",
        +  "inverted_date_range",
        +  "leaderboard_window_exceeded",
        +  "unknown_taxon_id"
        +]
    • Changedinaturalist_get_observation29 fields changed
      • changedInput schema / properties / observation_id / description
        Previous value: -"Observation ids to fetch, 1 to 10. Find current ids for an area with inaturalist_search_observations."New value: +"Observation ids to fetch, 1 to 100 submitted ids. The first 10 distinct ids are attempted; any remaining distinct ids are deferred to another call. Find current ids for an area with inaturalist_search_observations."
      • changedInput schema / properties / observation_id / maxItems
        Previous value: -10New value: +100
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "observations",
        -      "unresolved"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "observations",
        +      "unresolved",
        +      "deferred"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / deferred
        Added value: +{
        +  "description": "Distinct ids beyond the attempted batch, in requested order. Empty when no work remains.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One id to request in a subsequent call.",
        +    "properties": {
        +      "observation_id": {
        +        "description": "An id not attempted in this call.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "observation_id"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: None of the requested ids resolved to an observation. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: None of the attempted ids resolved to an observation and no deferred ids remain. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / observations / items / properties / annotations / items / properties / attribute / description
        Previous value: -"Decoded attribute label, e.g. \"Life Stage\". Null when the id is not in the vocabulary."New value: +"Attribute label, e.g. \"Life Stage\"; null for an unknown id."
      • changedOutput schema / properties / observations / items / properties / annotations / items / properties / value / description
        Previous value: -"Decoded value label, e.g. \"Larva\". Null when the id is not in the vocabulary."New value: +"Value label, e.g. \"Larva\"; null for an unknown id."
      • changedOutput schema / properties / observations / items / properties / comments / description
        Previous 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."New value: +"Requested comments, first entries in upstream order (not strictly chronological), sharing a 40-entry budget across records."
      • changedOutput schema / properties / observations / items / properties / comments_shown / description
        Previous value: -"How many of them comments carries. Below comments_total when the thread was cut. Present when \"comments\" was included."New value: +"Comment entries returned; below comments_total when capped."
      • changedOutput schema / properties / observations / items / properties / comments_total / description
        Previous value: -"How many comments upstream holds on the record. Present when \"comments\" was included."New value: +"Comment count before the cap; present with \"comments\"."
      • changedOutput schema / properties / observations / items / properties / community_taxon / description
        Previous value: -"Consensus taxon, resolved. Present on the by-id tool; null when the thread has reached none."New value: +"Resolved consensus taxon on detail records; null without consensus."
      • changedOutput schema / properties / observations / items / properties / coordinate / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "accuracy_m": {
        -        "description": "Public positional accuracy radius in metres. On an obscured record this is tens of kilometres and the point is a locality, not a sighting position.",
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "lat": {
        -        "description": "Latitude in decimal degrees.",
        -        "type": "number"
        -      },
        -      "lng": {
        -        "description": "Longitude in decimal degrees.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "lat",
        -      "lng",
        -      "accuracy_m"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "accuracy_m": {
        +        "description": "Public accuracy radius, metres. An obscured point is a locality, not a sighting position.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "lat": {
        +        "description": "Latitude in decimal degrees.",
        +        "type": "number"
        +      },
        +      "lng": {
        +        "description": "Longitude in decimal degrees.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "lat",
        +      "lng",
        +      "accuracy_m"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / observations / items / properties / description / description
        Previous value: -"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."New value: +"Verbatim observer note on detail records; null when none was written, distinct from an empty string."
      • changedOutput schema / properties / observations / items / properties / identification_disagreements_count / description
        Previous value: -"Count of disagreeing identifications as upstream tallies it. Present on the by-id tool."New value: +"Upstream disagreement count on detail records."
      • changedOutput schema / properties / observations / items / properties / identifications / description
        Previous 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."New value: +"Requested identification thread, first entries in upstream order (not strictly chronological), sharing a 40-entry budget across records."
      • changedOutput schema / properties / observations / items / properties / identifications_count / description
        Previous 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."New value: +"Tally against the community taxon: agreements + disagreements. Excludes the observer and neutral/withdrawn ids; thread size is identifications_total on inaturalist_get_observation."
      • changedOutput schema / properties / observations / items / properties / identifications_shown / description
        Previous value: -"How many of them identifications carries. Below identifications_total when the thread was cut. Present when \"identifications\" was included."New value: +"Identification entries returned; below identifications_total when capped."
      • changedOutput schema / properties / observations / items / properties / identifications_total / description
        Previous value: -"How many identifications upstream holds on the record — the thread size. Present when \"identifications\" was included."New value: +"Thread size before the cap; present with \"identifications\"."
      • changedOutput schema / properties / observations / items / properties / obscured / description
        Previous value: -"True when the true coordinate is withheld, typically for a threatened taxon. The point is never resolved or approximated."New value: +"True when the true coordinate is withheld; the public point is a locality."
      • changedOutput schema / properties / observations / items / properties / observation_fields / description
        Previous value: -"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."New value: +"Filled fields on detail records, verbatim; blanks omitted. First entries in upstream order, sharing a 40-entry budget across records."
      • changedOutput schema / properties / observations / items / properties / observation_fields / items / properties / name / description
        Previous value: -"Field name, as its creator wrote it, e.g. \"Habitat_Description\"."New value: +"Verbatim field name, e.g. \"Habitat_Description\"."
      • changedOutput schema / properties / observations / items / properties / observation_fields_shown / description
        Previous value: -"How many of them observation_fields carries. Below observation_fields_total when the list was cut. Present on the by-id tool."New value: +"Filled fields returned; below observation_fields_total when capped."
      • changedOutput schema / properties / observations / items / properties / observation_fields_total / description
        Previous value: -"How many filled observation fields the record carries. Present on the by-id tool."New value: +"Filled field count before the cap on detail records."
      • changedOutput schema / properties / observations / items / properties / observer / description
        Previous value: -"Login of the observer. The rest of the upstream profile is not relayed."New value: +"Observer login."
      • changedOutput schema / properties / observations / items / properties / photo / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "description": "A photo with the attribution and licence that must travel with it.",
        -    "properties": {
        -      "attribution": {
        -        "description": "Attribution string, verbatim and never reformatted. Reproduce it with any use of the image.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "license_code": {
        -        "description": "Photo licence code. Null means all rights reserved, independent of the record.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "medium_url": {
        -        "description": "Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape.",
        -        "type": "string"
        -      },
        -      "open": {
        -        "description": "True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time.",
        -        "type": "boolean"
        -      },
        -      "square_url": {
        -        "description": "75px square variant, exactly as upstream published it. Null when absent.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "square_url",
        -      "attribution",
        -      "license_code",
        -      "open"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "A photo with the attribution and licence that must travel with it.",
        +    "properties": {
        +      "attribution": {
        +        "description": "Verbatim attribution; reproduce with any use of the image.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "license_code": {
        +        "description": "Photo licence code. Null means all rights reserved, independent of the record.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "medium_url": {
        +        "description": "Medium image URL; derived from the size path if needed. Absent when no variant is available.",
        +        "type": "string"
        +      },
        +      "open": {
        +        "description": "True when served from the open-licence host at fetch time; licences can change.",
        +        "type": "boolean"
        +      },
        +      "square_url": {
        +        "description": "75px square variant, exactly as upstream published it. Null when absent.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "square_url",
        +      "attribution",
        +      "license_code",
        +      "open"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / observations / items / properties / photo_count / description
        Previous value: -"How many photos the record carries, so include \"photos\" can be spent knowingly."New value: +"Photo count; include \"photos\" for every photo."
      • changedOutput schema / properties / observations / items / properties / photos / items / properties / attribution / description
        Previous value: -"Attribution string, verbatim and never reformatted. Reproduce it with any use of the image."New value: +"Verbatim attribution; reproduce with any use of the image."
      • changedOutput schema / properties / observations / items / properties / photos / items / properties / medium_url / description
        Previous value: -"Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape."New value: +"Medium image URL; derived from the size path if needed. Absent when no variant is available."
      • changedOutput schema / properties / observations / items / properties / photos / items / properties / open / description
        Previous value: -"True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time."New value: +"True when served from the open-licence host at fetch time; licences can change."
    • Changedinaturalist_get_similar_species11 fields changed
      • changedInput schema / properties / captive / description
        Previous value: -"Whether to include captive and cultivated records — zoo animals, garden plantings. Defaults to wild organisms only."New value: +"True returns captive and cultivated records only — zoo animals, garden plantings; false returns wild records only. Defaults to false."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum look-alikes to return. Applied in-process — the upstream endpoint publishes no page size and returns its whole confusion set."New value: +"Maximum look-alikes to return. Applied in-process to the whole upstream confusion set. Ceiling: 50; oversized values are clamped."
      • addedInput schema / properties / limit / exclusiveMinimum
        Added value: +0
      • changedInput schema / properties / limit / maximum
        Previous value: -50New value: +9007199254740991
      • removedInput schema / properties / limit / minimum
        Removed value: -1
      • changedInput schema / properties / quality_grade / description
        Previous value: -"Identification confidence tiers to include. Defaults to research-grade only; adding \"needs_id\" roughly doubles the corpus and lowers identification confidence."New value: +"Identification confidence tiers to include, normalized to unique values in first-appearance order. Defaults to research-grade only; adding \"needs_id\" roughly doubles the corpus and lowers identification confidence."
      • 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. `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."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_place_id`: iNaturalist answered 422 because place_id does not exist. `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",
        -  "taxon_rank_too_coarse"
        -]New value: +[
        +  "unknown_place_id",
        +  "invalid_geography",
        +  "inverted_date_range",
        +  "unknown_taxon_id",
        +  "taxon_rank_too_coarse"
        +]
      • changedOutput schema / properties / similar_species / items / properties / photo / properties / attribution / description
        Previous value: -"Attribution string, verbatim and never reformatted. Reproduce it with any use of the image."New value: +"Verbatim attribution; reproduce with any use of the image."
      • changedOutput schema / properties / similar_species / items / properties / photo / properties / medium_url / description
        Previous value: -"Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape."New value: +"Medium image URL; derived from the size path if needed. Absent when no variant is available."
      • changedOutput schema / properties / similar_species / items / properties / photo / properties / open / description
        Previous value: -"True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time."New value: +"True when served from the open-licence host at fetch time; licences can change."
    • Changedinaturalist_get_species_counts12 fields changed
      • changedInput schema / properties / captive / description
        Previous value: -"Whether to include captive and cultivated records — zoo animals, garden plantings. Defaults to wild organisms only."New value: +"True returns captive and cultivated records only — zoo animals, garden plantings; false returns wild records only. Defaults to false."
      • changedInput schema / properties / per_page / description
        Previous value: -"Species 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."New value: +"Species per page. Raise page to continue the ranking. Ceiling: 50; oversized values are clamped."
      • addedInput schema / properties / per_page / exclusiveMinimum
        Added value: +0
      • changedInput schema / properties / per_page / maximum
        Previous value: -50New value: +9007199254740991
      • removedInput schema / properties / per_page / minimum
        Removed value: -1
      • changedInput schema / properties / quality_grade / description
        Previous value: -"Identification confidence tiers to include. Defaults to research-grade only; adding \"needs_id\" roughly doubles the corpus and lowers identification confidence."New value: +"Identification confidence tiers to include, normalized to unique values in first-appearance order. Defaults to research-grade only; adding \"needs_id\" roughly doubles the corpus and lowers identification confidence."
      • changedOutput schema / properties / applied_filters / properties / captive / description
        Previous value: -"Whether captive and cultivated records were included."New value: +"Captive-only when true, wild-only when false."
      • 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. `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."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_place_id`: iNaturalist answered 422 because place_id does not exist. `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",
        -  "conflicting_observer",
        -  "unknown_taxon_id",
        -  "unknown_user",
        -  "unknown_project_id"
        -]New value: +[
        +  "unknown_place_id",
        +  "invalid_geography",
        +  "inverted_date_range",
        +  "unpaired_annotation_value",
        +  "conflicting_observer",
        +  "unknown_taxon_id",
        +  "unknown_user",
        +  "unknown_project_id"
        +]
      • changedOutput schema / properties / species / items / properties / photo / properties / attribution / description
        Previous value: -"Attribution string, verbatim and never reformatted. Reproduce it with any use of the image."New value: +"Verbatim attribution; reproduce with any use of the image."
      • changedOutput schema / properties / species / items / properties / photo / properties / medium_url / description
        Previous value: -"Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape."New value: +"Medium image URL; derived from the size path if needed. Absent when no variant is available."
      • changedOutput schema / properties / species / items / properties / photo / properties / open / description
        Previous value: -"True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time."New value: +"True when served from the open-licence host at fetch time; licences can change."
    • Changedinaturalist_get_taxon9 fields changed
      • changedOutput schema / properties / conservation / properties / global_status / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "description": "One conservation listing, by authority and place.",
        -    "properties": {
        -      "authority": {
        -        "description": "The body that published this listing.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "iucn": {
        -        "description": "IUCN-normalised level upstream assigns this listing, on its own numeric scale.",
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "place": {
        -        "description": "Place the listing applies to. Null for a listing with global scope.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "status": {
        -        "description": "The authority’s own status text — \"Special Concern\", \"G4\", \"Sujeta a protección especial\" are all real values. Not the normalised csi filter vocabulary.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "url": {
        -        "description": "Source page for the listing, when published.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "status",
        -      "authority",
        -      "iucn",
        -      "place",
        -      "url"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "One conservation listing, by authority and place.",
        +    "properties": {
        +      "authority": {
        +        "description": "The body that published this listing.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "iucn": {
        +        "description": "IUCN-normalised level upstream assigns this listing, on its own numeric scale.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "place": {
        +        "description": "Place the listing applies to. Null for a listing with global scope.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "status": {
        +        "description": "Authority-specific status, e.g. \"Special Concern\" or \"G4\"; distinct from the normalised csi filter.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "url": {
        +        "description": "Source page for the listing, when published.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "status",
        +      "authority",
        +      "iucn",
        +      "place",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / conservation / properties / global_status / description
        Previous value: -"The listing upstream marks as the taxon’s global status. Null when it records none."New value: +"Upstream global listing; null when none is recorded."
      • changedOutput schema / properties / conservation / properties / statuses / items / properties / status / description
        Previous value: -"The authority’s own status text — \"Special Concern\", \"G4\", \"Sujeta a protección especial\" are all real values. Not the normalised csi filter vocabulary."New value: +"Authority-specific status, e.g. \"Special Concern\" or \"G4\"; distinct from the normalised csi filter."
      • changedOutput schema / properties / encyclopedia / properties / wikipedia_summary / description
        Previous value: -"Encyclopedia summary, verbatim and containing inline HTML tags. Third-party free text."New value: +"Verbatim encyclopedia text, including literal HTML tags."
      • changedOutput schema / properties / listed_taxa_count / description
        Previous value: -"How many place checklists include this taxon. The checklist entries themselves are not relayed."New value: +"Number of place checklists containing this taxon."
      • changedOutput schema / properties / photos / items / properties / attribution / description
        Previous value: -"Attribution string, verbatim and never reformatted. Reproduce it with any use of the image."New value: +"Verbatim attribution; reproduce with any use of the image."
      • changedOutput schema / properties / photos / items / properties / large_url / description
        Previous value: -"Large variant, as the taxon endpoint publishes it. Absent when upstream carried none; never derived here."New value: +"Upstream large image URL; absent when unpublished, never derived."
      • changedOutput schema / properties / photos / items / properties / medium_url / description
        Previous value: -"Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape."New value: +"Medium image URL; derived from the size path if needed. Absent when no variant is available."
      • changedOutput schema / properties / photos / items / properties / open / description
        Previous value: -"True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time."New value: +"True when served from the open-licence host at fetch time; licences can change."
    • Changedinaturalist_list_reference8 fields changed
      • changedInput schema / properties / taxon_id / description
        Previous value: -"Add 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."New value: +"Add annotation usage counts, most-used first; only with controlled_terms. Get the id from inaturalist_resolve_name."
      • changedInput schema / properties / topic / description
        Previous value: -"Which vocabulary to decode. controlled_terms is fetched live and cached; the rest are spec-derived static tables."New value: +"Vocabulary to decode; controlled_terms is live/cached, the rest static."
      • changedOutput schema / properties / entries / items / properties / code / description
        Previous value: -"The literal filter value to pass, on the static topics — e.g. \"needs_id\", \"cc0\", \"Aves\"."New value: +"Static filter value, e.g. \"needs_id\", \"cc0\", \"Aves\"."
      • changedOutput schema / properties / observed_usage / description
        Previous value: -"Observed annotation usage for taxon_id, most-used first. Present only when taxon_id was given."New value: +"Annotation usage, most-used first; present with taxon_id."
      • changedOutput schema / properties / observed_usage / items / properties / term_id / description
        Previous value: -"Attribute id — pass it as term_id to filter search, species counts, or the histogram. Null when upstream omitted it."New value: +"Attribute id for term_id on search, species counts, or histogram; null when omitted upstream."
      • changedOutput schema / properties / observed_usage / items / properties / term_value_id / description
        Previous value: -"Value id — pass it as term_value_id alongside term_id. Null when upstream omitted it."New value: +"Value id for term_value_id alongside term_id; null when omitted upstream."
      • changedOutput schema / properties / observed_usage / items / properties / value / description
        Previous value: -"Annotation value label. Labels repeat across attributes, so filter by the ids rather than the label."New value: +"Value label; use ids for filtering because labels can repeat."
      • changedOutput schema / properties / source / description
        Previous value: -"\"upstream\" when the table was fetched from iNaturalist, \"static\" when spec-derived."New value: +"\"upstream\" for fetched data, \"static\" for spec-derived tables."
    • Changedinaturalist_resolve_name8 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum candidates to return, applied to every type."New value: +"Maximum candidates to return, applied to every type. Ceiling: 30; oversized values are clamped."
      • addedInput schema / properties / limit / exclusiveMinimum
        Added value: +0
      • changedInput schema / properties / limit / maximum
        Previous value: -30New value: +9007199254740991
      • removedInput schema / properties / limit / minimum
        Removed value: -1
      • changedOutput schema / properties / candidates / items / properties / photo / properties / attribution / description
        Previous value: -"Attribution string, verbatim and never reformatted. Reproduce it with any use of the image."New value: +"Verbatim attribution; reproduce with any use of the image."
      • changedOutput schema / properties / candidates / items / properties / photo / properties / medium_url / description
        Previous value: -"Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape."New value: +"Medium image URL; derived from the size path if needed. Absent when no variant is available."
      • changedOutput schema / properties / candidates / items / properties / photo / properties / open / description
        Previous value: -"True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time."New value: +"True when served from the open-licence host at fetch time; licences can change."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Requested and applied limits when an oversized limit was clamped.",
        +  "type": "string"
        +}
    • Changedinaturalist_search_observations40 fields changed
      • changedInput schema / properties / captive / description
        Previous value: -"Whether to include captive and cultivated records — zoo animals, garden plantings. Defaults to wild organisms only."New value: +"True returns captive and cultivated records only — zoo animals, garden plantings; false returns wild records only. Defaults to false."
      • changedInput schema / properties / per_page / description
        Previous value: -"Records 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."New value: +"Records fetched per page. Complete records may be deferred to keep the response within its byte budget; retrieve deferred ids through inaturalist_get_observation with the same include values. Ceiling: 25; oversized values are clamped."
      • addedInput schema / properties / per_page / exclusiveMinimum
        Added value: +0
      • changedInput schema / properties / per_page / maximum
        Previous value: -25New value: +9007199254740991
      • removedInput schema / properties / per_page / minimum
        Removed value: -1
      • changedInput schema / properties / quality_grade / description
        Previous value: -"Identification confidence tiers to include. Defaults to research-grade only; adding \"needs_id\" roughly doubles the corpus and lowers identification confidence."New value: +"Identification confidence tiers to include, normalized to unique values in first-appearance order. Defaults to research-grade only; adding \"needs_id\" roughly doubles the corpus and lowers identification confidence."
      • addedInput schema / properties / sounds
        Added value: +{
        +  "description": "True selects observations with sounds; false selects those without. Omit for either. Use include: [\"sounds\"] to expand sound metadata; no media is downloaded.",
        +  "type": "boolean"
        +}
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "total_results",
        -      "observations",
        -      "has_more",
        -      "applied_filters",
        -      "truncated",
        -      "shown",
        -      "cap"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "total_results",
        +      "observations",
        +      "deferred",
        +      "has_more",
        +      "applied_filters",
        +      "truncated",
        +      "shown",
        +      "cap"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / applied_filters / properties / captive / description
        Previous value: -"Whether captive and cultivated records were included."New value: +"Captive-only when true, wild-only when false."
      • changedOutput schema / properties / applied_filters / properties / quality_grade / description
        Previous value: -"Identification tiers actually searched."New value: +"Identification tiers actually searched, normalized to unique values in first-appearance order."
      • addedOutput schema / properties / deferred
        Added value: +{
        +  "description": "Ordered ids of the fetched-page suffix omitted from observations to meet the response budget. Empty when the whole page fits; independent of has_more.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One fetched observation deferred for a by-id call.",
        +    "properties": {
        +      "observation_id": {
        +        "description": "Observation id to retrieve through inaturalist_get_observation with the same include values.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "observation_id"
        +    ],
        +    "type": "object"
        +  },
        +  "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. `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."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_place_id`: iNaturalist answered 422 because place_id does not exist. `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",
        -  "conflicting_observer",
        -  "unknown_taxon_id",
        -  "unknown_user",
        -  "unknown_project_id"
        -]New value: +[
        +  "unknown_place_id",
        +  "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 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."New value: +"True when the fetched page filled the applied per_page and more records follow, independent of deferred ids. 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 / notice / description
        Previous value: -"Guidance when nothing matched, when the page is past the last one holding results, or how to continue past a full page."New value: +"Composed guidance for applied limits, ignored filters, empty pages, deferred ids and pagination."
      • changedOutput schema / properties / observations / items / description
        Previous value: -"One projected observation record."New value: +"One complete projected search record, with requested media expansions."
      • changedOutput schema / properties / observations / items / properties / annotations / items / properties / attribute / description
        Previous value: -"Decoded attribute label, e.g. \"Life Stage\". Null when the id is not in the vocabulary."New value: +"Attribute label, e.g. \"Life Stage\"; null for an unknown id."
      • changedOutput schema / properties / observations / items / properties / annotations / items / properties / value / description
        Previous value: -"Decoded value label, e.g. \"Larva\". Null when the id is not in the vocabulary."New value: +"Value label, e.g. \"Larva\"; null for an unknown id."
      • removedOutput schema / properties / observations / items / properties / comments
        Removed value: -{
        -  "description": "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.",
        -  "items": {
        -    "additionalProperties": false,
        -    "description": "One discussion comment on the record.",
        -    "properties": {
        -      "body": {
        -        "description": "Free-text comment body.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "by": {
        -        "description": "Login of the commenter.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "created_at": {
        -        "description": "When the comment was posted, ISO 8601.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "id": {
        -        "description": "Comment id.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "by",
        -      "body",
        -      "created_at"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / observations / items / properties / comments_shown
        Removed value: -{
        -  "description": "How many of them comments carries. Below comments_total when the thread was cut. Present when \"comments\" was included.",
        -  "type": "number"
        -}
      • removedOutput schema / properties / observations / items / properties / comments_total
        Removed value: -{
        -  "description": "How many comments upstream holds on the record. Present when \"comments\" was included.",
        -  "type": "number"
        -}
      • removedOutput schema / properties / observations / items / properties / community_taxon
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "additionalProperties": false,
        -      "properties": {
        -        "common_name": {
        -          "description": "Preferred common name, when one is recorded.",
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        },
        -        "iconic_taxon_name": {
        -          "description": "Broad organism group, e.g. \"Insecta\". Usable as an iconic_taxa filter value.",
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        },
        -        "id": {
        -          "description": "Taxon id — the identifier every taxon-scoped filter takes.",
        -          "type": "number"
        -        },
        -        "name": {
        -          "description": "Scientific name.",
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        },
        -        "rank": {
        -          "description": "Taxonomic rank, e.g. \"species\".",
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "rank",
        -        "common_name",
        -        "iconic_taxon_name"
        -      ],
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "description": "Consensus taxon, resolved. Present on the by-id tool; null when the thread has reached none."
        -}
      • changedOutput schema / properties / observations / items / properties / coordinate / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "accuracy_m": {
        -        "description": "Public positional accuracy radius in metres. On an obscured record this is tens of kilometres and the point is a locality, not a sighting position.",
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "lat": {
        -        "description": "Latitude in decimal degrees.",
        -        "type": "number"
        -      },
        -      "lng": {
        -        "description": "Longitude in decimal degrees.",
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "lat",
        -      "lng",
        -      "accuracy_m"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "accuracy_m": {
        +        "description": "Public accuracy radius, metres. An obscured point is a locality, not a sighting position.",
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "lat": {
        +        "description": "Latitude in decimal degrees.",
        +        "type": "number"
        +      },
        +      "lng": {
        +        "description": "Longitude in decimal degrees.",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "lat",
        +      "lng",
        +      "accuracy_m"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / observations / items / properties / description
        Removed 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"
        -  ]
        -}
      • removedOutput schema / properties / observations / items / properties / identification_disagreements_count
        Removed value: -{
        -  "description": "Count of disagreeing identifications as upstream tallies it. Present on the by-id tool.",
        -  "type": "number"
        -}
      • removedOutput schema / properties / observations / items / properties / identifications
        Removed value: -{
        -  "description": "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.",
        -  "items": {
        -    "additionalProperties": false,
        -    "description": "One identification in the community thread.",
        -    "properties": {
        -      "body": {
        -        "description": "Free-text note written by the identifier.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "by": {
        -        "description": "Login of the identifier.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "category": {
        -        "description": "How this identification moved the thread: improving, supporting, leading, or maverick.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "created_at": {
        -        "description": "When the identification was added, ISO 8601.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "current": {
        -        "description": "True when this is the identifier’s current identification on the record.",
        -        "type": "boolean"
        -      },
        -      "disagreement": {
        -        "description": "True when the identifier explicitly disagreed with the preceding taxon.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      },
        -      "from_vision": {
        -        "description": "True when the identification came from the upstream image classifier.",
        -        "type": "boolean"
        -      },
        -      "id": {
        -        "description": "Identification id.",
        -        "type": "number"
        -      },
        -      "taxon": {
        -        "anyOf": [
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "common_name": {
        -                "description": "Preferred common name, when one is recorded.",
        -                "type": [
        -                  "string",
        -                  "null"
        -                ]
        -              },
        -              "iconic_taxon_name": {
        -                "description": "Broad organism group, e.g. \"Insecta\". Usable as an iconic_taxa filter value.",
        -                "type": [
        -                  "string",
        -                  "null"
        -                ]
        -              },
        -              "id": {
        -                "description": "Taxon id — the identifier every taxon-scoped filter takes.",
        -                "type": "number"
        -              },
        -              "name": {
        -                "description": "Scientific name.",
        -                "type": [
        -                  "string",
        -                  "null"
        -                ]
        -              },
        -              "rank": {
        -                "description": "Taxonomic rank, e.g. \"species\".",
        -                "type": [
        -                  "string",
        -                  "null"
        -                ]
        -              }
        -            },
        -            "required": [
        -              "id",
        -              "name",
        -              "rank",
        -              "common_name",
        -              "iconic_taxon_name"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Taxon this identification proposes."
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "taxon",
        -      "by",
        -      "current",
        -      "category",
        -      "disagreement",
        -      "from_vision",
        -      "body",
        -      "created_at"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • changedOutput schema / properties / observations / items / properties / identifications_count / description
        Previous 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."New value: +"Tally against the community taxon: agreements + disagreements. Excludes the observer and neutral/withdrawn ids; thread size is identifications_total on inaturalist_get_observation."
      • removedOutput schema / properties / observations / items / properties / identifications_shown
        Removed value: -{
        -  "description": "How many of them identifications carries. Below identifications_total when the thread was cut. Present when \"identifications\" was included.",
        -  "type": "number"
        -}
      • removedOutput schema / properties / observations / items / properties / identifications_total
        Removed value: -{
        -  "description": "How many identifications upstream holds on the record — the thread size. Present when \"identifications\" was included.",
        -  "type": "number"
        -}
      • changedOutput schema / properties / observations / items / properties / obscured / description
        Previous value: -"True when the true coordinate is withheld, typically for a threatened taxon. The point is never resolved or approximated."New value: +"True when the true coordinate is withheld; the public point is a locality."
      • removedOutput schema / properties / observations / items / properties / observation_fields
        Removed 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"
        -}
      • removedOutput schema / properties / observations / items / properties / observation_fields_shown
        Removed 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"
        -}
      • removedOutput schema / properties / observations / items / properties / observation_fields_total
        Removed value: -{
        -  "description": "How many filled observation fields the record carries. Present on the by-id tool.",
        -  "type": "number"
        -}
      • changedOutput schema / properties / observations / items / properties / observer / description
        Previous value: -"Login of the observer. The rest of the upstream profile is not relayed."New value: +"Observer login."
      • changedOutput schema / properties / observations / items / properties / photo / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "description": "A photo with the attribution and licence that must travel with it.",
        -    "properties": {
        -      "attribution": {
        -        "description": "Attribution string, verbatim and never reformatted. Reproduce it with any use of the image.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "license_code": {
        -        "description": "Photo licence code. Null means all rights reserved, independent of the record.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "medium_url": {
        -        "description": "Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape.",
        -        "type": "string"
        -      },
        -      "open": {
        -        "description": "True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time.",
        -        "type": "boolean"
        -      },
        -      "square_url": {
        -        "description": "75px square variant, exactly as upstream published it. Null when absent.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "square_url",
        -      "attribution",
        -      "license_code",
        -      "open"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "A photo with the attribution and licence that must travel with it.",
        +    "properties": {
        +      "attribution": {
        +        "description": "Verbatim attribution; reproduce with any use of the image.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "license_code": {
        +        "description": "Photo licence code. Null means all rights reserved, independent of the record.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "medium_url": {
        +        "description": "Medium image URL; derived from the size path if needed. Absent when no variant is available.",
        +        "type": "string"
        +      },
        +      "open": {
        +        "description": "True when served from the open-licence host at fetch time; licences can change.",
        +        "type": "boolean"
        +      },
        +      "square_url": {
        +        "description": "75px square variant, exactly as upstream published it. Null when absent.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "square_url",
        +      "attribution",
        +      "license_code",
        +      "open"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / observations / items / properties / photo_count / description
        Previous value: -"How many photos the record carries, so include \"photos\" can be spent knowingly."New value: +"Photo count; include \"photos\" for every photo."
      • changedOutput schema / properties / observations / items / properties / photos / items / properties / attribution / description
        Previous value: -"Attribution string, verbatim and never reformatted. Reproduce it with any use of the image."New value: +"Verbatim attribution; reproduce with any use of the image."
      • changedOutput schema / properties / observations / items / properties / photos / items / properties / medium_url / description
        Previous value: -"Medium variant. Supplied by upstream where it publishes every size, otherwise derived by substituting the size qualifier in the path. Absent when the path did not match the documented shape."New value: +"Medium image URL; derived from the size path if needed. Absent when no variant is available."
      • changedOutput schema / properties / observations / items / properties / photos / items / properties / open / description
        Previous value: -"True when the photo is served from the host the upstream reserves for open licences. A photo can move hosts when its licence changes, so this reflects fetch time."New value: +"True when served from the open-licence host at fetch time; licences can change."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the page filled per_page and more records follow."New value: +"True when records were deferred or more pages follow."
  2. 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."
  3. 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"
        +}
  4. 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"
        +]
  5. 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.
    384 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.
    6 npm
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables AI assistants to query and retrieve biodiversity data from the Global Biodiversity Information Facility (GBIF), including species, occurrences, datasets, and literature.
    58
    74 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.