inaturalist-mcp-server
Server Details
Search iNaturalist sightings, identification threads, phenology, and look-alike species.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/inaturalist-mcp-server
- GitHub Stars
- 0
- Server Listing
- @cyanheads/inaturalist-mcp-server
TDQS
Scored across 10 tools
Each tool targets a distinct resource/action: places, taxa, individual observations, observation searches, species counts, histograms, leaderboards, similar species, and reference vocabularies. Cross-references in descriptions (e.g., use leaderboard vs species counts) further prevent confusion.
All tools share the inaturalist_ prefix and a snake_case verb_noun pattern such as get_taxon, search_observations, and resolve_name. Verb variations reflect semantic distinctions but remain predictable and consistent across the set.
Ten tools is a well-scoped size for a read-only naturalist data server. Each tool earns its place by covering a distinct query type without redundancy or bloat.
Core area/taxon observation workflows are well covered: resolve names, find places, search observations, fetch details, species counts, histograms, leaderboards, and reference data. Minor gaps remain: resolve_name can resolve projects and observers, but no other tool consumes those IDs, and there is no direct observation-by-observer or observation-by-project search.
Available Tools
10 toolsinaturalist_find_placesInaturalist Find PlacesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Place-name prefix to search. Matches the start of a name, not words inside it. Mutually exclusive with the bounding box. | |
| nelat | No | North-east corner latitude of the map area. All four corners or none. | |
| nelng | No | North-east corner longitude of the map area. All four corners or none. | |
| swlat | No | South-west corner latitude of the map area. All four corners or none. | |
| swlng | No | South-west corner longitude of the map area. All four corners or none. | |
| per_page | No | Maximum places to return. Honoured on the bounding-box arm only — the name-prefix endpoint publishes no page size and returns a fixed page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The page size that bounded this response — per_page on the bounding-box arm, the fixed page upstream served on the name-prefix arm. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | How many places this response carries. |
| notice | No | Guidance when nothing matched, or when the page capped the result set. |
| places | No | Name-prefix matches. Present on the q arm. |
| standard | No | Curated administrative places covering the area. Present on the bounding-box arm. |
| community | No | Member-created places covering the area. Present on the bounding-box arm. |
| truncated | No | True when more places matched than were returned. |
| totalCount | No | Total places upstream matched, before any page limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description adds valuable behavioral context: each result contains the bounding box, place type, and containment chain, and place geometry is deliberately stripped to save bandwidth, citing a concrete 247 KB payload reduction. This gives the agent a clear picture of response behavior and performance tradeoffs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each carrying distinct and useful information: purpose, usage modes with exclusivity, result contents, and payload-stripping behavior. There is no repetition of schema details and no fluff, and the most important decision information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-mode lookup tool with no required parameters SF DA, the description covers the decision point, the mutual-exclusion rule, what each result contains, and an important performance behavior. The schema and output schema fill in the remaining structural details, so nothing needed to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all six parameters with 100% coverage, including mutual exclusivity, corner constraints, and the per_page behavior on only the bounding-box arm. The description reinforces the q-vs-box framing but adds little new parameter meaning beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the two things the tool does: resolving a place name to a place id and listing places covering a bounding box. It is explicit about the resource ('place') and the two modes, but it does not explicitly distinguish itself from a sibling like inaturalist_resolve_name, so the differentiation is implicit rather than named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit invocation guidance for both modes: pass q for a prefix match, pass all four bounding-box corners to list covering places. It also states the critical constraint that exactly one of the two modes must be used, never both, which is exactly the usage decision an agent needs.
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 HistogramARead-onlyInspect
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. Defaults to research-grade, wild-only records and echoes those defaults back.
| Name | Required | Description | Default |
|---|---|---|---|
| d1 | No | 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. | |
| d2 | No | Latest observation date, YYYY-MM-DD. Inclusive. | |
| lat | No | Latitude of the search centre, in decimal degrees. Requires lng and radius. | |
| lng | No | Longitude of the search centre, in decimal degrees. Requires lat and radius. | |
| nelat | No | North-east corner latitude of the bounding box. All four corners or none. | |
| nelng | No | North-east corner longitude of the bounding box. All four corners or none. | |
| swlat | No | South-west corner latitude of the bounding box. All four corners or none. | |
| swlng | No | South-west corner longitude of the bounding box. All four corners or none. | |
| radius | No | Search radius around lat/lng, in KILOMETRES. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes. | |
| captive | No | Whether to include captive and cultivated records — zoo animals, garden plantings. Defaults to wild organisms only. | |
| interval | No | Bucketing. 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_id | No | Numeric 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_id | No | Restrict to this taxon and its descendants. Omit to chart every taxon in the area. Resolve a name to an id with inaturalist_resolve_name. | |
| date_field | No | Which date to bucket by: when the organism was observed, or when the record was uploaded. | observed |
| quality_grade | No | Identification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The bucket cap that was applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | How many buckets this response carries. |
| total | No | Sum of every bucket count upstream returned, including buckets past the cap that are not in the buckets array. |
| notice | No | Guidance when every bucket came back zero, or when the cap was reached. |
| buckets | No | Every 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. |
| interval | No | The bucketing that was applied. |
| truncated | No | True when upstream returned more than 800 buckets. |
| applied_filters | No | The server-applied defaults that determine what this answer means. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and open-world behavior, and the description adds meaningful context: the default interval is month_of_year, absolute intervals get a default start date upstream, and results echo defaults back. This goes beyond the schema by explaining upstream behavior and default semantics, which helps the agent anticipate responses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, each earning its place: the tool's purpose, interval behavior, area specification, and default filtering. No filler or redundancy. The most important distinction — histogram vs raw observations — is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 15 parameters, a rich input schema, an output schema, and safety annotations, the description covers the non-obvious aspects: what the buckets mean, the exact area forms, the default interval, and default record filters. Nothing essential for selecting and invoking the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with every parameter already described in detail. The description adds no parameter-level meaning beyond what the schema provides; it only restates the area exclusivity and taxon omission. This is a solid baseline-3 case where the schema carries the parameter documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description starts with a specific verb-resource pair: 'Build a phenology histogram for a taxon in an area,' and immediately clarifies the output buckets: months, weeks, or years. This clearly differentiates it from sibling tools like get_species_counts or search_observations, which return counts or observation lists rather than a temporal histogram.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when this tool is appropriate: to answer 'when does this bloom or appear here' with the default month_of_year interval. It also explains area selection constraints and the option to omit taxon_id, but it does not explicitly state when-not-to-use it or name an alternative tool for similar queries.
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 LeaderboardARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| d1 | No | Earliest observation date, YYYY-MM-DD. Inclusive. | |
| d2 | No | Latest observation date, YYYY-MM-DD. Inclusive. | |
| lat | No | Latitude of the search centre, in decimal degrees. Requires lng and radius. | |
| lng | No | Longitude of the search centre, in decimal degrees. Requires lat and radius. | |
| kind | Yes | Which leaderboard: "observers" ranks by observations recorded, "identifiers" by identifications made. | |
| page | No | Page number. Defaults to 1. | |
| nelat | No | North-east corner latitude of the bounding box. All four corners or none. | |
| nelng | No | North-east corner longitude of the bounding box. All four corners or none. | |
| swlat | No | South-west corner latitude of the bounding box. All four corners or none. | |
| swlng | No | South-west corner longitude of the bounding box. All four corners or none. | |
| radius | No | Search radius around lat/lng, in KILOMETRES. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes. | |
| per_page | No | 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. | |
| place_id | No | Numeric 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_id | No | Restrict to this taxon and its descendants. Resolve a name to an id with inaturalist_resolve_name. | |
| quality_grade | No | Identification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The per_page that was applied. |
| kind | No | Which leaderboard was ranked. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | How many entries this page carries. |
| notice | No | Guidance when nobody matched, or how to reach further down the ranking. |
| entries | No | The ranked members, most active first. |
| truncated | No | True when the page filled per_page and more entries follow. |
| count_metric | No | What the count on each entry measures. |
| total_results | No | How many people upstream reports as matching. Far larger than the 500 this leaderboard can actually address. |
| applied_filters | No | The server-applied default that determines what this answer means. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=true, so the bar is lower; the description adds genuine value by disclosing the hard 500-entry ranking ceiling and the page × per_page ≤ 500 constraint, plus the hint to narrow area/period/taxon to bring lower-ranked entries into reach. No contradiction with annotations is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries functional weight — purpose, kind semantics, area exclusivity, pagination ceiling, and sibling routing are all present and front-loaded. The em-dash flourish "who knows this place or this group" is mildly ornamental, but the overall structure is efficient for a tool with 15 parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's high complexity — 15 parameters, cross-field exclusivity rules, and a pagination ceiling — the description covers the cross-parameter constraints an agent most needs to call it correctly: area-form exclusivity, page/per_page limits, and kind semantics. Minor caveats like the HTTP 500 on non-numeric place_id live only in the schema, and the output schema covers return values, so the description is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it synthesizes the mutually exclusive area forms (place_id vs lat/lng/radius vs bounding box), explains the pagination relationship between page and per_page, and clarifies what kind selects. This is genuine added value on top of the parameter-level schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource — "Rank the most active observers or identifiers for an area, period, and taxon" — and clarifies what each kind measures. It also distinguishes itself from the closest sibling tool, inaturalist_get_species_counts, so an agent can tell them apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes the agent away from this tool toward inaturalist_get_species_counts when the goal is species frequency rather than person activity. It also gives clear context on when to use it (area, period, taxon) and how kind selects the ranking basis, though it does not address every potentially confusable sibling such as get_histogram.
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 ObservationARead-onlyIdempotentInspect
Fetch up to 10 observations by id with their community identification thread — who identified what, whether each identification agrees, and the consensus taxon the community landed on. The whole batch costs one upstream request, so resolving ten ids here is far cheaper than ten separate lookups. A missing id is reported per id in unresolved rather than failing the batch; the call fails only when nothing resolved.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | 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. | |
| observation_id | Yes | Observation ids to fetch, 1 to 10. Find current ids for an area with inaturalist_search_observations. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when part of the batch did not resolve. |
| unresolved | No | Requested ids upstream returned nothing for. They may have been deleted, or never existed. |
| observations | No | The observations that resolved, with the expansions that were requested. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and idempotent safety. The description adds valuable behavioral detail beyond that: the batch costs one upstream request, missing IDs are reported per-id in 'unresolved' rather than failing the batch, and the call fails only when nothing resolves. This gives the agent clear expectations for error handling and cost, exceeding the baseline provided by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each carrying essential information: the core purpose, the cost efficiency of batching, and the error-handling behavior. It is front-loaded with the primary function and contains no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the key aspects an agent needs: what the tool returns (identification thread and consensus), batch behavior, and failure conditions. The output schema exists, so return format is documented elsewhere. The schema parameter descriptions handle parameter details. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – both parameters (observation_id and include) have descriptive text, including guidance on the include array. The main description does not add parameter-specific semantics beyond what the schema provides, but it doesn't need to given the high coverage. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch'), resource ('observations by id'), and adds concrete detail about the community identification thread (who identified, agreement status, consensus taxon). This distinguishes it clearly from sibling tools like search_observations or get_species_counts, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case (fetching observations by known IDs) and explicitly notes batch efficiency ('far cheaper than ten separate lookups'). The schema parameter description for observation_id further routes the agent to inaturalist_search_observations for finding IDs, but the main description itself does not explicitly exclude other tools or state 'use when you have IDs'. This is a minor gap.
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 SpeciesARead-onlyInspect
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. Resolve the organism name to a taxon id with inaturalist_resolve_name first.
| Name | Required | Description | Default |
|---|---|---|---|
| d1 | No | Earliest observation date, YYYY-MM-DD. Inclusive. | |
| d2 | No | Latest observation date, YYYY-MM-DD. Inclusive. | |
| lat | No | Latitude of the search centre, in decimal degrees. Requires lng and radius. | |
| lng | No | Longitude of the search centre, in decimal degrees. Requires lat and radius. | |
| limit | No | Maximum look-alikes to return. Applied in-process — the upstream endpoint publishes no page size and returns its whole confusion set. | |
| nelat | No | North-east corner latitude of the bounding box. All four corners or none. | |
| nelng | No | North-east corner longitude of the bounding box. All four corners or none. | |
| swlat | No | South-west corner latitude of the bounding box. All four corners or none. | |
| swlng | No | South-west corner longitude of the bounding box. All four corners or none. | |
| radius | No | Search radius around lat/lng, in KILOMETRES. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes. | |
| captive | No | Whether to include captive and cultivated records — zoo animals, garden plantings. Defaults to wild organisms only. | |
| place_id | No | Numeric 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_id | Yes | Numeric taxon id to find look-alikes for. Resolve a name to an id with inaturalist_resolve_name. | |
| quality_grade | No | Identification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit that was applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | How many look-alikes this response carries. |
| notice | No | Guidance when no look-alikes are recorded, or when the limit cut the set. |
| taxon_id | No | The taxon the look-alikes were found for. |
| truncated | No | True when the limit cut the confusion set. |
| totalCount | No | How many look-alikes upstream returned, before the limit was applied. |
| similar_species | No | Look-alikes ranked by misidentification_count, most-confused first. |
| truncationCeiling | No | Misidentification count of the last look-alike shown. The ranking is descending, so no omitted look-alike exceeds it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds behavioral context beyond annotations by explaining the ranking basis (identifier corrections) and the area-scoped vs global behavior. No contradictions 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences front-load the core purpose first, then area scoping, then the prerequisite. There is no filler; each sentence contributes actionable guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter tool with a fully described schema and an output schema, the description covers the high-level purpose, area-scoping rules, and prerequisite call. The schema supplies remaining parameter detail, and the output schema removes the need to document return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema carries detailed per-parameter meaning; the description adds value by consolidating the three mutually exclusive area forms into one rule and stating the global-set fallback. It mostly re-frames schema content, hence not a 5, but the conceptual grouping is genuinely helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists taxa most often misidentified as a given taxon, ranked by identifier corrections — a specific verb and resource that distinguish it from siblings like inaturalist_get_species_counts or inaturalist_get_histogram. It does not explicitly name an alternative tool for contrast, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete when-to-use guidance: scope by exactly one area form (place_id, lat/lng/radius, or bounding box) or leave off for the global set, and the explicit prerequisite to resolve names via inaturalist_resolve_name first. It does not discuss when not to use this tool versus another, but the context is clear.
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 CountsARead-onlyInspect
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. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| d1 | No | Earliest observation date, YYYY-MM-DD. Inclusive. | |
| d2 | No | Latest observation date, YYYY-MM-DD. Inclusive. | |
| lat | No | Latitude of the search centre, in decimal degrees. Requires lng and radius. | |
| lng | No | Longitude of the search centre, in decimal degrees. Requires lat and radius. | |
| page | No | Page number. Defaults to 1. | |
| nelat | No | North-east corner latitude of the bounding box. All four corners or none. | |
| nelng | No | North-east corner longitude of the bounding box. All four corners or none. | |
| swlat | No | South-west corner latitude of the bounding box. All four corners or none. | |
| swlng | No | South-west corner longitude of the bounding box. All four corners or none. | |
| radius | No | Search radius around lat/lng, in KILOMETRES. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes. | |
| captive | No | Whether to include captive and cultivated records — zoo animals, garden plantings. Defaults to wild organisms only. | |
| term_id | No | Annotation attribute ids, from inaturalist_list_reference topic controlled_terms — e.g. 1 for Life Stage. | |
| per_page | No | 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. | |
| place_id | No | Numeric 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_id | No | Restrict to this taxon and its descendants. Resolve a name to an id with inaturalist_resolve_name. | |
| iconic_taxa | No | 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. | |
| quality_grade | No | Identification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence. | |
| term_value_id | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The per_page that was applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | How many species this page carries. |
| notice | No | Guidance when nothing matched, or how to reach the species beyond this page. |
| species | No | The species, ranked by observation_count, most-observed first. |
| truncated | No | True when the page filled per_page and more species follow. |
| total_results | No | How many distinct species match. An estimate over a live index — it drifts between calls seconds apart. |
| applied_filters | No | The server-applied defaults that determine what this answer means. |
| truncationCeiling | No | Observation count of the last species shown. The ranking is descending, so no species left off this page exceeds it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only convey read-only and open-world behavior, so the description adds value by disclosing aggregation semantics, research-grade/wild defaults, and the mutually exclusive area-selector rule. It doesn't mention error cases or rate limits, but for a read-only tool the core behavioral context is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first states the core behavior, the second covers area-parameter constraints, and the third covers filters/defaults plus the leaderboard alternative. It is compact, front-loaded, and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter tool, the description plus fully documented schema and output schema cover invocation well: area forms, defaults, clade narrowing, and a sibling pointer are all present. It does not explicitly state what happens if no area selector is supplied, and it only names one of several nearby siblings, so it is strong but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline applies and the schema already explains each parameter in detail. The description adds useful high-level framing such as the three mutually exclusive area forms and a concrete taxon example, but it doesn't materially expand individual parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific, informative verb+resource pair: it ranks distinct species in an area by observation count. It also clearly distinguishes itself from paginating individual sightings and from the leaderboard sibling, so an agent can tell what the tool does at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states that the area must be given in exactly one of three forms, how to narrow by clade, and what the default filtering is. It also names the sibling tool to use when ranking people rather than species, giving a concrete when-not-to-use case.
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 TaxonARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sections | No | Sections 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_id | Yes | Numeric 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
| Name | Required | Description |
|---|---|---|
| id | No | Taxon id. |
| kind | No | "full" when the profile itself is returned, "outline" when it overflowed and only the section list came back. |
| name | No | Scientific name. |
| rank | No | Taxonomic rank, e.g. "species". |
| error | No | Present when the call failed. Absent on success. |
| notice | No | How to re-call for specific sections. Present on the outline. |
| photos | No | Gallery photos, each with its own licence. |
| vision | No | True when the taxon is covered by the upstream image classifier. |
| extinct | No | True when the taxon is recorded as extinct. |
| children | No | Immediate children of this taxon. |
| sections | No | Available sections and their byte sizes, largest first. Present on the outline. |
| taxonomy | No | Ancestors from the root of the tree down to the taxon’s parent. |
| is_active | No | False for a taxon superseded by a taxonomic change; its id still resolves. |
| rank_level | No | Numeric rank level — 70 kingdom, 30 family, 10 species, 5 subspecies. |
| common_name | No | Preferred common name, when one is recorded. |
| conservation | No | Conservation listings for the taxon. |
| encyclopedia | No | The encyclopedia text and link upstream carries for the taxon. |
| sections_applied | No | Sections 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_name | No | Broad organism group, e.g. "Insecta". Usable as an iconic_taxa filter value. |
| listed_taxa_count | No | How many place checklists include this taxon. The checklist entries themselves are not relayed. |
| observations_count | No | How many observations carry this taxon or a descendant of it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint, openWorldHint, and idempotentHint, and the description adds substantial behavior not captured there: the 95 KB upstream projection, the overflow outline with byte sizes, and the selective-section re-call semantics. This materially changes how an agent should invoke the tool and interpret large responses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main purpose, then moves through prerequisite, projection behavior, overflow handling, and valid section names in logical order. Every sentence earns its place, including the concrete 95 KB detail that justifies the projection step. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully equips an agent to use this tool correctly: it covers what the profile contains, how to resolve a name first, what happens on large records, how to recover from overflow, and which section names are valid. An output schema exists for return values, so the description doesn't need to restate them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description enriches both parameters beyond the JSON Schema. For taxon_id it warns about the upstream HTTP 422 on non-numeric values and explains why the integer is enforced. For sections it defines the omit-for-whole-profile behavior, overflow outline, and the need to sum byte sizes before requesting multiple sections.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch a taxon profile', then enumerates the concrete content (taxonomic path, conservation listings, summary, photos, children, observation counts). This clearly differentiates it from siblings like inaturalist_get_observation and inaturalist_get_species_counts by focusing on the taxon entity and its composite sections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the prerequisite workflow: 'Resolve a name to a taxon id with inaturalist_resolve_name first.' It also provides conditional guidance for overflow handling, telling the agent to re-call with section names when the projected profile still overflows. This gives clear when-to-use and how-to-proceed direction beyond the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inaturalist_list_referenceInaturalist List ReferenceARead-onlyInspect
Decode the vocabularies the other iNaturalist tools take as input: annotation attributes and values, quality grades, license codes, taxonomic ranks, iconic taxa, and IUCN conservation-status codes. An unrecognized filter value is not rejected upstream — it silently returns nothing — so read the codes here before filtering. Note that the conservation codes are the normalised csi search filter; a taxon record’s own conservation_statuses[].status is authority-specific free text and reads differently. With topic controlled_terms and a taxon_id, the response also carries which annotations identifiers have actually recorded for that taxon, with counts.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Which vocabulary to decode. controlled_terms is fetched live and cached; the rest are spec-derived static tables. | |
| taxon_id | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| topic | No | The vocabulary that was decoded. |
| notice | No | Guidance when the requested taxon has no recorded annotations yet. |
| source | No | "upstream" when the table was fetched from iNaturalist, "static" when spec-derived. |
| entries | No | The vocabulary, one entry per code or attribute. |
| observed_usage | No | Observed annotation usage for taxon_id, most-used first. Present only when taxon_id was given. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only convey readOnlyHint and openWorldHint, so the description carries the behavioral burden — and it delivers. It discloses the critical silent-return-nothing failure mode upstream, the distinction between normalized csi search-filter conservation codes and the authority-specific free text in conservation_statuses[].status, and the conditional payload of annotation counts when topic=controlled_terms plus taxon_id is supplied. No contradiction with annotations (read-only reference, open world).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences with the purpose front-loaded and every sentence carrying a distinct load-bearing fact: scope, failure-mode warning, conservation-code caveat, and conditional payload. It is on the longer side, but there is no filler — each sentence justifies its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 params (1 required), a 6-value enum, an output schema, and read-only/open-world annotations, the description covers the essential runtime behaviors an agent needs to invoke and interpret results safely. Combined with the schema's parameter details and the resolve_name pointer, nothing critical for correct usage is missing, though explicit rate-limit or pagination behavior could push it to a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents each topic value, the live-fetch/cached distinction, the taxon_id constraints ('Valid only with topic controlled_terms'), and the resolve_name pointer. The description adds semantic context linking the enum values to real-world filter concepts, but the schema carries the heavy lifting, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource — 'Decode the vocabularies the other iNaturalist tools take as input' — and then enumerates the six vocabulary categories (annotation attributes/values, quality grades, license codes, taxonomic ranks, iconic taxa, conservation codes), which maps directly onto the topic enum. It unambiguously differentiates this reference tool from its 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use context: 'read the codes here before filtering,' since unrecognized filter values silently return nothing rather than failing. It also positions the tool as the companion to inaturalist_resolve_name for resolving taxon names to IDs. It does not explicitly state when NOT to use this vs. a named sibling, but the decoder role is self-evident relative to the search tools.
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 NameARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | The 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. | |
| rank | No | Restrict taxon candidates to one rank. Honoured only on type "taxon" — the cross-kind search has no rank filter. | |
| type | No | Which 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 |
| limit | No | Maximum candidates to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| found | No | True when at least one candidate matched. |
| guidance | No | Why nothing matched and what to try instead. Present only when found is false — this is the primary result of a miss. |
| candidates | No | Ranked candidates, best match first. |
| totalCount | No | Total candidates upstream matched, before the limit was applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint and openWorldHint), the description discloses important runtime behavior: misses return found=false with guidance rather than throwing, candidates are ranked, and taxon lookup is prefix-based rather than substring-based. This gives the agent a clear model of the tool's behavior without needing to call it blindly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler. The front-loaded first sentence states the core purpose, the second explains the result shape and error semantics, and the third delivers a critical querying caveat. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema, full parameter coverage, annotations, and existing output schema, the description covers everything an agent needs to select and invoke the tool correctly: what it returns, how misses behave, the prefix limitation, and an alternative tool for richer place data. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all parameters at 100% coverage, so the baseline is 3. The description adds meaningful semantic context beyond the schema: taxon q is a name prefix or exact taxon id, while other types match across record text; rank is only honored for type 'taxon'; and the find_places alternative clarifies the type parameter's boundary. These additions justify a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('resolve') and resource ('common or scientific name...place, project, or observer name') and the output ('taxon id...its id'). It also distinguishes the tool as the provider of identifiers that every other tool takes, which sets it apart from sibling tools like inaturalist_get_taxon or inaturalist_find_places.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use this tool: when you need identifiers to feed into other tools. It also gives an explicit when-not case, noting that for a place's bounding box and containment chain, use inaturalist_find_places instead. The prefix-behavior guidance further sets expectations for successful use.
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 ObservationsARead-onlyInspect
Search georeferenced wildlife sightings by area, date, taxon, quality grade, annotation, and conservation status. 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. Results past 10,000 need the cursor from the previous page rather than a higher page number.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Free text matched across observation properties. | |
| d1 | No | Earliest observation date, YYYY-MM-DD. Inclusive. | |
| d2 | No | Latest observation date, YYYY-MM-DD. Inclusive. | |
| csi | No | IUCN-normalised conservation status codes to include, e.g. ["EN","CR"]. Decode them with inaturalist_list_reference topic conservation_status_codes. | |
| lat | No | Latitude of the search centre, in decimal degrees. Requires lng and radius. | |
| lng | No | Longitude of the search centre, in decimal degrees. Requires lat and radius. | |
| page | No | Page number within the first 10,000 results. Defaults to 1. Mutually exclusive with cursor. | |
| hrank | No | Highest taxonomic rank of the identification to accept. | |
| lrank | No | Lowest taxonomic rank of the identification to accept. | |
| nelat | No | North-east corner latitude of the bounding box. All four corners or none. | |
| nelng | No | North-east corner longitude of the bounding box. All four corners or none. | |
| order | No | Sort direction. | desc |
| swlat | No | South-west corner latitude of the bounding box. All four corners or none. | |
| swlng | No | South-west corner longitude of the bounding box. All four corners or none. | |
| cursor | No | 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. | |
| native | No | Restrict to taxa native to the observation location. | |
| radius | No | Search radius around lat/lng, in KILOMETRES. Requires lat and lng. The upstream publishes no bound; 500 is a verified ceiling this server imposes. | |
| captive | No | Whether to include captive and cultivated records — zoo animals, garden plantings. Defaults to wild organisms only. | |
| endemic | No | Restrict to taxa endemic to the observation location. | |
| include | No | Embedded arrays to expand per record. Check photo_count and sound_count first — expanding costs context. | |
| term_id | No | Annotation attribute ids, from inaturalist_list_reference topic controlled_terms — e.g. 1 for Life Stage. | |
| licensed | No | Restrict to records whose own license_code is not null. | |
| order_by | No | Sort field. Forced to id when cursor is supplied, since a cursor only continues an id ordering. | observed_on |
| per_page | No | 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. | |
| place_id | No | Numeric 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_id | No | Restrict to this taxon and its descendants. Resolve a name to an id with inaturalist_resolve_name. | |
| search_on | No | Narrow what q matches against. Requires q. | |
| introduced | No | Restrict to taxa introduced to the observation location. | |
| threatened | No | Restrict to taxa considered threatened where observed. | |
| iconic_taxa | No | 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. | |
| quality_grade | No | Identification confidence tiers to include. Defaults to research-grade only; adding "needs_id" roughly doubles the corpus and lowers identification confidence. | |
| term_value_id | No | 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. | |
| photo_licensed | No | Restrict to records with at least one licensed photo. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The per_page that was applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | How many records this page carries. |
| notice | No | Guidance when nothing matched, or how to continue past a full page. |
| has_more | No | True when this page filled per_page, so more records follow. |
| truncated | No | True when the page filled per_page and more records follow. |
| next_cursor | No | Pass back as cursor to continue past this page. Absent when has_more is false. |
| observations | No | The matching sightings, projected. |
| total_results | No | How many records upstream reports as matching. An estimate over a live index — it drifts between calls seconds apart. |
| applied_filters | No | The server-applied defaults and overrides that determine what this answer means. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, so the safety profile is already covered. The description adds meaningful behavioral context beyond annotations: default research-grade/wild-only records are 'echoed back on every call', identifications/comments are deliberately not expandable, and the 10,000-result cursor behavior. It also discloses the upstream HTTP 500 for non-numeric place_id in the schema. Minor gap: it doesn't explicitly state that results are sorted by observed_on desc by default, but that is in the schema. A 4 is appropriate because the description adds substantial behavioral context without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact paragraph that front-loads the core purpose and return shape, then packs the most decision-relevant constraints (area exclusivity, defaults, non-expandable threads, cursor pagination) into four sentences. Every sentence earns its place; there is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (33 parameters, no required params, output schema present), the description covers the critical operational constraints: area selection exclusivity, default filters, pagination beyond 10,000, and the cost/context tradeoff of per_page and include. The output schema exists, so return values need not be described. Sibling routing is provided. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining the area exclusivity rule, the cursor-vs-page mutual exclusion, the per_page context-cost warning (1.9 KB per record), and the default research-grade/wild-only behavior. It also clarifies that term_value_id requires term_id and that iconic_taxa common names match nothing. This is above the baseline but not a 5 because the description doesn't enumerate every parameter's semantics; it relies on the schema for most field-level details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search georeferenced wildlife sightings' and enumerates the filter dimensions (area, date, taxon, quality grade, annotation, conservation status). It also states the return shape ('projected record per sighting with coordinates, licence, first photo, and identification counts'), which distinguishes it from sibling tools like inaturalist_get_observation or inaturalist_get_species_counts. The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: it names the sibling inaturalist_get_observation for fetching identifications/comments, explains why (28 KB thread size), and states the area constraint ('exactly one form'). It also gives a concrete pagination rule ('Results past 10,000 need the cursor... rather than a higher page number'). This is strong routing and exclusion guidance.
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.
10 tool updates
- First observed
inaturalist_find_places - First observed
inaturalist_get_histogram - First observed
inaturalist_get_leaderboard - First observed
inaturalist_get_observation - First observed
inaturalist_get_similar_species - First observed
inaturalist_get_species_counts - First observed
inaturalist_get_taxon - First observed
inaturalist_list_reference - First observed
inaturalist_resolve_name - First observed
inaturalist_search_observations
Related MCP Connectors
Search GBIF species taxonomy, occurrence records, datasets, and publishers.
Search GBIF species taxonomy, occurrence records, datasets, and publishers.
iNaturalist MCP — citizen-science species observations (free, no auth for read-only)
Search curated Lorcana resources, evidence, taxonomies, and public change history.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceSearch GBIF species taxonomy, occurrence records, datasets, and publishers via MCP.105 npm1Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables querying citizen-science species observations from iNaturalist via the Pipeworx MCP gateway. Provides read-only access to species data without authentication.1 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables querying a global plant database with over 1 million species, providing access to plant records and species search via natural language.2 npmMIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to query and retrieve biodiversity data from the Global Biodiversity Information Facility (GBIF), including species, occurrences, datasets, and literature.-
Glama MCP Gateway
Add one secure layer between your agents and this server.