Skip to main content
Glama

Server Details

Query FDA data on drugs, food, devices, and recalls via openFDA. STDIO or Streamable HTTP.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.9% over 37 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/openfda-mcp-server
GitHub Stars
4
Server Listing
@cyanheads/openfda-mcp-server

TDQS

A4.1/5.0

Scored across 14 tools

Disambiguation4/5

Most tools target clearly distinct FDA datasets or workflow stages, and the descriptions do a good job of separating endpoints like adverse events, recalls, and approvals. The main ambiguity is between openfda_count_values and openfda_dataframe_query (both support aggregation) and between openfda_drug_profile and the individual search tools, though the descriptions explicitly address those overlaps.

Naming Consistency4/5

All tool names share the openfda_ prefix and use consistent snake_case, with a clear openfda_search_<domain> family for the main query tools. Minor deviations like openfda_drug_profile (noun phrase) and openfda_dataframe_describe (noun before verb) keep the set from being perfectly uniform, but the overall pattern is predictable.

Tool Count5/5

14 tools is well within the ideal range and each tool earns its place: seven domain searches, two label/NDC lookups, a profile aggregator, field discovery, dataset staging, SQL querying, and value counting. The count feels comprehensive without being bloated or redundant.

Completeness5/5

The server covers the major openFDA datasets—adverse events, animal events, device clearances, drug approvals, shortages, recalls, tobacco, labels, and NDC—plus supporting analytics tools that avoid dead ends. The staged-dataframe workflow, field discovery, and drug profile tool fill the gaps that would otherwise require chaining multiple calls.

Available Tools

14 tools
openfda_count_valuesOpenfda Count ValuesA
Read-only
Inspect

Aggregate and tally unique values for any field across any openFDA endpoint. Returns ranked term-count pairs sorted by count descending. Pair with openfda_search_adverse_events, openfda_search_drug_approvals, openfda_search_device_clearances, openfda_search_recalls, openfda_get_drug_label, or openfda_lookup_ndc when sample records help interpret the aggregates.

ParametersJSON Schema
NameRequiredDescriptionDefault
countYesField to count. openfda_describe_fields gives the verified expression per field as countAs (null = not countable in any form). Otherwise: append .exact for whole-phrase counting of free-text fields (e.g. "patient.reaction.reactionmeddrapt.exact"); count identifier fields openFDA already indexes as keywords (product_ndc, application_number, pma_number) bare — .exact on those is rejected as not countable.
limitNoNumber of top terms to return (default 100, max 1000 — openFDA's own count maximum). truncated reports whether more distinct terms exist beyond it, except at the maximum itself, where openFDA offers no way to tell.
searchNoFilter query to scope the count (e.g. patient.drug.medicinalproduct:"metformin"). Omit to count across every record in the endpoint. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request.
endpointYesFull openFDA endpoint path (e.g. "drug/event", "device/classification")

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit applied to the term list.
metaNoResponse metadata
errorNoPresent when the call failed. Absent on success.
shownNoNumber of terms returned in this response.
noticeNoWhy the tally is empty — the search matched no records, or the matched records carry no value for the field — and how to widen it; when truncated, how to reach the omitted terms; at the 1000-term maximum, that openFDA cannot show whether more distinct values exist. Absent when a complete list is returned.
resultsNoTerm-count pairs sorted by count descending
termCountNoNumber of distinct terms returned
truncatedNoTrue when at least one more distinct term exists beyond the limit. Absent when the list is complete, and at the 1000-term maximum, where openFDA cannot show whether more exist (notice says so).
truncationCeilingNoCount of the lowest-ranked term returned — omitted terms fall at or below it.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations provide readOnlyHint=true, so the description does not need to repeat that the tool is read-only. It adds that results are sorted by count descending, which is a behavioral trait beyond the annotation. However, it does not disclose other important behaviors like pagination or truncation, which are mentioned in the schema parameter descriptions but not in the main description. Since annotations cover the safety profile and the description adds a minimal behavioral detail, a 3 is appropriate.

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 two sentences with zero waste. The first sentence delivers the core purpose and output format, and the second provides useful guidance on pairing with search tools. It is appropriately sized and front-loaded with the most important information.

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?

The tool has 4 parameters (2 required) with thorough schema descriptions, a readOnly annotation, and an output schema. The description covers the essential purpose and usage context. It does not explicitly describe the return structure, but the presence of an output schema makes that unnecessary. The description, combined with annotations and schema, is sufficiently complete for an agent to call the tool correctly.

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 the schema already documents all parameters in detail, including patterns, defaults, and examples. The description itself does not add any parameter-specific meaning beyond what the schema provides. Baseline for high coverage is 3, and there is no extra value from the description, so a 3 is accurate.

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?

The description clearly states a specific verb (aggregate and tally), a specific resource (unique values for any field across any endpoint), and the output format (ranked term-count pairs sorted descending). It distinguishes itself from search tools by focusing on counts, though it does not explicitly name a sibling to contrast with. Purpose is clear but sibling differentiation is implicit rather than explicit.

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

Usage Guidelines4/5

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

The description mentions pairing with search tools when sample records help interpret aggregates, giving context on when to use it alongside others. However, it does not explicitly state when to use this tool instead of alternatives, such as 'use this for counts, not for full records.' Usage context is clear but exclusions are missing.

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

openfda_dataframe_describeOpenfda Dataframe DescribeA
Read-onlyIdempotent
Inspect

List the tables and column schemas on a DataCanvas staged by an openFDA search tool. Call before openfda_dataframe_query to discover the exact table name, column names, and DuckDB types needed for valid SQL. row_count is the full staged result set, not the inline preview count. Columns typed JSON hold nested openFDA objects/arrays — query them with DuckDB json functions.

ParametersJSON Schema
NameRequiredDescriptionDefault
canvas_idYesCanvas ID from the canvas_id field of an openFDA search tool response (openfda_search_* or openfda_lookup_ndc), present when the search ran with stage=true.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
tablesNoAll tables and views available on this canvas.
canvas_idNoCanvas ID that was described — pass to openfda_dataframe_query.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description does not contradict them. It adds useful behavioral context beyond the annotations: row_count reflects the full staged result set rather than the inline preview count, and JSON-typed columns require DuckDB json functions. This gives the agent practical expectations about the returned metadata.

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, each earning its place: purpose, usage ordering, and two data-behavior caveats. The most decision-relevant information ('Call before openfda_dataframe_query') appears early, and there is no filler or repetition of schema details.

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

Completeness5/5

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

With one parameter, high schema coverage, an output schema present, and read-only annotations, the description covers everything needed to call the tool correctly. It also addresses the likely pitfalls (full row_count semantics and JSON querying), making it complete for its complexity.

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 the schema fully documents canvas_id, including its source and pattern. The description's mention of staged DataCanvas context aligns with the schema but does not add new parameter-level meaning beyond it. The baseline of 3 is appropriate since the schema carries the parameter detail.

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 ('List') and resource ('tables and column schemas on a DataCanvas staged by an openFDA search tool'). It clearly distinguishes this metadata-discovery tool from the querying sibling openfda_dataframe_query, so an agent can tell them apart 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 Guidelines5/5

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

It explicitly says 'Call before openfda_dataframe_query' and explains that this tool supplies the exact table name, column names, and DuckDB types needed for valid SQL. The input schema also adds a precondition: canvas_id comes from an openFDA search response with stage=true. This is clear when-to-use guidance with a named alternative.

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

openfda_dataframe_queryOpenfda Dataframe QueryA
Read-onlyIdempotent
Inspect

Run a read-only SQL SELECT against a DataCanvas table staged by an openFDA search tool (call one with stage=true; its response carries canvas_id + canvas_table). Enables GROUP BY, COUNT/SUM/AVG, time-series, and joins across the staged result set without re-paging the API. Call openfda_dataframe_describe first to get the exact table and column names. Results are capped at the canvas row limit — when truncated is true, page the rest with ORDER BY plus LIMIT/OFFSET. Scalar fields are stored as text (CAST for numeric math); nested objects/arrays are JSON columns — read them with DuckDB json functions, e.g. json_extract_string(openfda, '$.brand_name[0]'). Only SELECT is allowed — DDL, DML, COPY, and file-reading functions are blocked.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSQL SELECT against the staged table. Use the table name from openfda_dataframe_describe. Example: "SELECT classification, COUNT(*) AS n FROM spilled_ab12cd34 GROUP BY classification ORDER BY n DESC".
canvas_idYesCanvas ID from the canvas_id field of an openFDA search tool response (openfda_search_* or openfda_lookup_ndc), present when the search ran with stage=true.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsNoRows returned by the query (capped at the canvas row limit).
errorNoPresent when the call failed. Absent on success.
canvas_idNoCanvas ID that was queried — reuse for follow-up queries.
row_countNoNumber of rows in this response. Equals the canvas row limit when truncated is true.
truncatedNoTrue when the result hit the canvas row limit and rows beyond it were dropped. Page the rest with ORDER BY plus LIMIT/OFFSET.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and idempotentHint, and the description reinforces this by explicitly stating 'read-only SQL SELECT' and 'Only SELECT is allowed — DDL, DML, COPY, and file-reading functions are blocked.' It also discloses row-limit truncation and pagination with ORDER BY/LIMIT/OFFSET, and explains data type storage (scalars as text, JSON columns with DuckDB functions). These details go well beyond annotations, providing complete behavioral expectations.

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 well-organized: it front-loads the purpose, then gives prerequisite steps, truncation handling, and data type caveats. Every sentence adds unique value, and there's no fluff or repetition. It's appropriately sized for the tool's complexity.

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

Completeness5/5

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

Given the tool's complexity and that an output schema exists, the description covers all necessary usage aspects: how to obtain canvas_id, the need to consult openfda_dataframe_describe, allowed SQL constructs, row-limit behavior, and data format handling. An agent can confidently invoke this tool correctly without additional clarification.

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% with both parameters described, including an example for query and provenance for canvas_id. The description adds extra context about the query parameter (only SELECT allowed, how to handle JSON) and clarifies canvas_id's source (search tool response with stage=true). While the schema already covers basics, the description enriches the semantics with practical guidance.

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

Purpose5/5

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

The description clearly states the tool runs read-only SQL SELECT queries on a staged DataCanvas table from an openFDA search. It names the resource (staged table), the verb (query/select), and differentiates from siblings by focusing on post-staging analysis rather than searching or describing fields. The mention of GROUP BY, aggregations, and joins reinforces its distinct role.

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

Usage Guidelines4/5

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

The description gives clear usage context: it must be called after a search tool with stage=true, and openfda_dataframe_describe should be invoked first to get exact table/column names. It also explains when this tool is beneficial (aggregation, time-series, joins without re-paging). It doesn't explicitly list when to avoid it, but the prerequisite and functional scope make the intended usage clear.

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

openfda_describe_fieldsOpenfda Describe FieldsA
Read-only
Inspect

Return the searchable field paths for an openFDA endpoint, grouped by category with type and description. Use before constructing a search query to find the correct dotted field path — field names differ per endpoint and are not discoverable from the tool schema alone.

ParametersJSON Schema
NameRequiredDescriptionDefault
endpointYesopenFDA endpoint to describe (e.g. "drug/event", "drug/shortages", "device/510k"). Must be one of the cataloged endpoints.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
groupsNoField groups for this endpoint
endpointNoThe endpoint these fields apply to
queryTipsNoopenFDA query syntax reminders relevant to this endpoint

TDQS

A4.3/5.0
Behavior3/5

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

Annotations provide readOnlyHint=true, so the description doesn't need to restate that. The description adds context about the return format (grouped by category with type and description), but there's no further behavioral detail like performance or error cases. With the readOnly annotation covering safety, a 3 is appropriate.

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?

Two sentences, front-loaded with the primary action and return, followed by a clear usage directive. No fluff or repetition of schema details.

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

Completeness5/5

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

The tool is simple with one parameter and a detailed enum in the schema. The description adds the critical usage context and return structure. An output schema exists, so return values are covered. Nothing essential is missing for correct invocation.

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% — the parameter `endpoint` is fully described with an enum and an example. The description adds value by mentioning that field paths are endpoint-specific, reinforcing but not extending the schema. Baseline 3 is correct here since the schema does the heavy lifting.

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 ('Return'), resource ('searchable field paths for an openFDA endpoint'), and grouping ('by category with type and description'). It clearly distinguishes itself from sibling search tools by focusing on field discovery rather than data 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 instructs to use before constructing a search query and explains why: field names differ per endpoint and are not discoverable from the schema. This clearly routes the agent to this tool when needing field paths, versus other tools that execute queries.

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

openfda_drug_profileOpenfda Drug ProfileA
Read-only
Inspect

Resolve one drug name to its FDA identity, then fan out in parallel across the bounded per-drug openFDA endpoints and merge into one profile: identity, label highlights, adverse-event summary, recall history, Drugs@FDA approval, and shortage status. Replaces chaining openfda_get_drug_label, openfda_search_adverse_events, openfda_search_recalls, openfda_search_drug_approvals, and openfda_search_drug_shortages — and reconciles the identifier drift between endpoints that makes that chaining error-prone. Each section is best-effort: a miss returns null rather than failing the call. For deep dives into any one area, use the dedicated tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
drugYesDrug name to profile — brand or generic (e.g. "metformin", "Humira", "Glucophage"). Resolved once to canonical FDA identifiers, which then key every sub-query.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoRequest metadata.
errorNoPresent when the call failed. Absent on success.
labelNoLabel highlights from drug/label, or null when no label matched.
noticeNoGuidance when the drug could not be resolved or upstream errors degraded the profile. Absent on a fully populated profile.
recallsNoRecent drug/enforcement recall actions (may be empty).
approvalNoDrugs@FDA approval summary, or null when no application matched.
degradedNoSub-queries that failed upstream, empty when every section resolved. A section listed here is unknown, not absent — a null section with no entry here genuinely has no FDA record.
identityNoIdentity resolved once and reused across every sub-query to avoid identifier drift.
shortageNoCurrent or most-recent drug shortage status, or null when none on record.
sectionsFoundNoHow many profile sections (label, adverse_events, recalls, approval, shortage) returned data.
adverse_eventsNoAdverse-event summary aggregated over drug/event, or null when unavailable.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already provide readOnlyHint=true, and the description adds genuinely valuable behavior beyond that: fan-out across bounded endpoints, parallel execution, merge semantics, and especially the best-effort contract ('a miss returns null rather than failing the call'). The identifier-drift reconciliation note also explains why this tool behaves differently from naive chaining. 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.

Conciseness5/5

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

Four sentences, each earning its place: the purpose and output sections, the replacement/disambiguation statement, the best-effort behavior, and the deep-dive pointer. Front-loaded with the primary action and unambiguous scoping. 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.

Completeness5/5

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

Given the output schema exists (so return structure needs no description), one fully-documented parameter, and annotations carrying the read-only safety profile, the description covers everything an agent needs: what it does, what sections it merges, when not to use it, and how partial failures behave. Complete for a complex aggregator tool.

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% and the schema already documents the parameter with examples. The description adds meaning beyond the schema by stating that the drug name is 'Resolved once to canonical FDA identifiers, which then key every sub-query' — clarifying the resolution semantics that make the fan-out work. This exceeds the baseline 3 for high schema coverage.

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?

Description states a specific verb ('Resolve one drug name to its FDA identity, then fan out... and merge into one profile') with an explicit resource and the exact content sections produced. It names the five sibling tools it replaces, so the agent can distinguish it from openfda_get_drug_label, openfda_search_adverse_events, and the other per-endpoint tools without opening their schemas.

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 states when to use it ('Replaces chaining openfda_get_drug_label, openfda_search_adverse_events, openfda_search_recalls, openfda_search_drug_approvals, and openfda_search_drug_shortages') and when not to ('For deep dives into any one area, use the dedicated tool'). This is unambiguous routing guidance with no inference required.

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

openfda_get_drug_labelOpenfda Get Drug LabelA
Read-only
Inspect

Look up FDA drug labeling (package inserts / SPL documents). Check indications, warnings, dosage, contraindications, active ingredients, or any structured label section. A label runs to tens of thousands of tokens, so a page that exceeds the inline budget returns the list of available sections instead; re-call with sections to pull the ones you need.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoNumber of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error.
sortNoSort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: effective_time:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name.
limitNoMaximum number of results to return (1-1000). Default 5. Labels are large, and the cost of a sections selection is the section summed across every record on the page — so it scales with this limit. Lower it before widening a selection.
searchYesQuery targeting label fields. Examples: openfda.brand_name:"aspirin", openfda.generic_name:"metformin", openfda.manufacturer_name:"pfizer". For a specific revision, pass set_id with the SPL UUID returned in earlier results. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request.
sectionsNoLabel sections to return, e.g. ["boxed_warning","indications_and_usage"]. Names come from the outline an oversized page returns, or from openfda_describe_fields. Omit for the whole label — which returns the section outline instead when the page exceeds the inline size budget; an empty list is treated as omitted. A selection is returned whole even when it exceeds that budget, with its serialized size reported on the notice; the outline names a section measured to fit at the requested limit. Sections ending in _table hold SPL table markup: raw in structured results, rendered as Markdown tables in the text output. Metadata (openfda, set_id, id, effective_time, version) is returned either way and counts toward the size.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit applied to this page.
kindNoWhether this response carries label records ("full") or only the section outline of a page too large to inline ("outline").
metaNoPagination and freshness metadata.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of labels returned in this response.
noticeNoGuidance for this page: how to broaden filters or correct field names when results are empty or paging overshot, the sized re-call example when a page overflowed to its section outline, section names no record carried, and the serialized size when a sections selection exceeds the inline budget. Absent when nothing needs saying.
outlineNoSection names available across the matched page and their serialized size, largest first. Present when kind is "outline" — pass names back in sections to retrieve them.
resultsNoDrug label records, present when kind is "full". Each carries an openfda block (brand_name, generic_name, manufacturer_name, route) plus optional SPL sections like indications_and_usage, warnings, dosage_and_administration, contraindications, adverse_reactions; section presence varies per label. Sections ending in _table carry raw SPL table markup (tags and character entities) exactly as openFDA returns it. Narrowed to the requested sections plus metadata when sections was supplied.
truncatedNoTrue when more labels matched than this page returned — page with skip for the rest.
totalResultsNoTotal matching label records in the dataset
effectiveQueryNoSearch filter applied to the drug label query, as submitted to openFDA

TDQS

A3.9/5.0
Behavior4/5

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

The annotation already declares readOnlyHint=true. The description adds valuable non-obvious behavior: oversized labels return a section outline instead of full content, and re-calling with sections retrieves the needed parts. This goes beyond the annotation and meaningfully prepares the agent for the response shape.

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?

Two sentences, front-loaded with the primary purpose and followed by the key behavioral caveat. Every sentence earns its place, and no space is wasted on repeating schema or annotation information.

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 read-only tool with a rich schema and an output schema, the description covers the main non-obvious behavior (inline budget, section selection) and is sufficient for basic invocation. It lacks explicit sibling differentiation and error-handling context, but those are not essential given the schema and annotation coverage.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds a bit of semantic value by explaining how the inline budget relates to the sections parameter and why re-calling with sections is needed, which complements the schema's already detailed parameter descriptions.

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?

The description states a specific verb ('Look up') and resource (FDA drug labeling / package inserts / SPL documents) and lists several example sections, making the tool's purpose clear. However, it does not explicitly differentiate from sibling tools like openfda_drug_profile, so it stops short of full sibling distinction.

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

Usage Guidelines3/5

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

The description implies usage for retrieving drug labeling sections but gives no explicit when-to-use versus alternative tools, no when-not-to-use guidance, and no references to siblings. The 're-call with sections' advice is behavioral rather than comparative.

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

openfda_lookup_ndcOpenfda Lookup NdcA
Read-only
Inspect

Look up drugs in the NDC (National Drug Code) Directory. Identify drug products by NDC code, find active ingredients, packaging details, or manufacturer info. Pair with openfda_get_drug_label using the returned brand_name or set_id to read the package insert. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoNumber of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error.
sortNoSort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: listing_expiration_date:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name.
limitNoMaximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures. A record grows with its packaging list, so a product with many package configurations is several times the size of one with a single package.
stageNoStage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb.
searchYesopenFDA search query. Examples: product_ndc:"0363-0218", brand_name:"aspirin", generic_name:"metformin", openfda.manufacturer_name:"walgreen", active_ingredients.name:"ASPIRIN". Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request.
canvas_idNoCanvas ID returned by a prior stage=true call to this tool or an openFDA search tool (openfda_search_*). Passing one stages this lookup onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoResponse metadata
errorNoPresent when the call failed. Absent on success.
noticeNoCanvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty — how to broaden filters or correct field names.
resultsNoNDC directory records — product_ndc, brand_name, generic_name, labeler_name, dosage_form, route, marketing_category, active_ingredients[], packaging[], listing_expiration_date.
spilledNoTrue when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested.
canvas_idNoDataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas.
truncatedNoTrue when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set.
page_bytesNoSerialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.
staged_rowsNoRows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.
canvas_tableNoCanvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses.
page_omittedNoRecords dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.
totalResultsNoTotal matching NDC records in the dataset
effectiveQueryNoSearch filter applied to the NDC lookup, as submitted to openFDA

TDQS

A3.8/5.0
Behavior4/5

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

The readOnlyHint annotation already marks the tool as read-only, and the description adds value by explaining what the caller gets back for follow-up (brand_name and set_id) and how staging behaves via the dataframe tools. It does not reveal rate limits or pagination pitfalls, but those are covered in the schema's parameter descriptions.

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

Conciseness5/5

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

The description is three sentences with no filler. The purpose is front-loaded in the first sentence, capabilities come second, and the workflow integration is third. Every sentence carries actionable information without repeating the title or restating schema content.

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?

With a rich input schema, an output schema, and readOnlyHint annotation, the description covers the essential orientation and integration points: what the tool looks up, what fields to carry forward, and how to use staging. The only noticeable gap is not differentiating from openfda_drug_profile or mentioning when to prefer openfda_count_values, though the schema already references that tool.

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 the schema already documents all six parameters, including default values, constraints, and error cases. The description mentions returned fields rather than parameter semantics, so it does not materially improve on the schema. A baseline 3 is appropriate.

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?

The description uses a specific verb and resource: 'Look up drugs in the NDC (National Drug Code) Directory.' It also enumerates concrete capabilities—identifying products by NDC code, finding active ingredients, packaging, and manufacturer info. It does not explicitly contrast itself with similar sibling tools like openfda_drug_profile, so it falls short of full distinction.

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

Usage Guidelines3/5

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

The description gives useful downstream workflow guidance: pair with openfda_get_drug_label using brand_name or set_id, and use staging tools when stage=true. However, it does not state when to choose this tool over alternatives such as openfda_search_* or openfda_drug_profile, nor does it give exclusions. Usage context is implied rather than explicitly bounded.

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

openfda_search_adverse_eventsOpenfda Search Adverse EventsA
Read-only
Inspect

Search adverse event reports across drugs, food, and devices. Use to investigate safety signals, find reports for a specific product, or explore reactions by demographics. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoNumber of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error.
sortNoSort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. Sortable date fields are category-specific: drug → receivedate:desc (or receiptdate), food → date_created:desc (or date_started), device → date_received:desc (or date_of_event). A field from another category (e.g. receivedate on food or device) causes a query error — use the field for this category.
limitNoMaximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures. Drug reports are by far the largest — a single drug/event report averages tens of kilobytes where a food/event report is a few hundred bytes.
stageNoStage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb.
searchNoopenFDA search query. Examples: patient.drug.medicinalproduct:"aspirin", patient.reaction.reactionmeddrapt:"nausea" AND serious:"1". Omit to browse recent. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request.
categoryYesProduct category — each has different field schemas in the response
canvas_idNoCanvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoResponse metadata
errorNoPresent when the call failed. Absent on success.
noticeNoCanvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty or paging overshot — how to broaden filters or adjust the query.
resultsNoAdverse event records — fields vary by category (drug: patient/reactions/drugs, device: device details/event type, food: products/outcomes)
spilledNoTrue when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested.
canvas_idNoDataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas.
truncatedNoTrue when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set.
page_bytesNoSerialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.
staged_rowsNoRows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.
canvas_tableNoCanvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses.
page_omittedNoRecords dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.
totalResultsNoTotal matching adverse event records in the dataset
effectiveQueryNoSearch filter applied to the query, as submitted to openFDA

TDQS

A4.2/5.0
Behavior4/5

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

The readOnlyHint annotation covers the read-only safety profile, and the description does not contradict it. It adds non-obvious behavioral context by describing the stage=true workflow and the required follow-up tools, showing that a single call can also stage a bounded slice for SQL analysis. It does not enumerate pagination/limit behavior, but that detail lives in the parameter schema.

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 tightly packed sentences: the first states purpose, the second gives use cases, the third routes the staging workflow to companion tools. There is no filler or repetition, and the most important information is front-loaded.

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?

The tool is complex (7 parameters, category-specific schemas, staging behavior), but the input schema and output schema fill those gaps with detailed parameter semantics. The description is complete enough for orientation and workflow, though it relies on the schema for limits, sort constraints, and alternative aggregation via openfda_count_values.

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 the baseline is 3 and the parameter schema carries the semantic burden. The main description's only parameter-related instruction ('With stage=true, call openfda_dataframe_describe...') mostly restates the stage parameter's own description rather than adding new meaning. No additional param semantics are provided in the 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?

The description opens with a specific verb and resource: 'Search adverse event reports across drugs, food, and devices.' This immediately distinguishes the tool from sibling searches (device clearances, drug approvals, recalls, tobacco reports) and gives a concrete scope. The sentence is neither a tautology nor vague.

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 names concrete use cases: investigating safety signals, finding reports for a specific product, and exploring reactions by demographics. It also directs the user to openfda_dataframe_describe and openfda_dataframe_query after stage=true. It does not explicitly give when-not-to-use alternatives, so it stops short of 5.

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

openfda_search_animal_eventsOpenfda Search Animal EventsA
Read-only
Inspect

Search adverse event reports for veterinary drugs and devices submitted to the FDA Center for Veterinary Medicine. Records include animal species, breed, age, weight, drug name and route, adverse reactions (using VeDDRA terminology), and outcome. Use to investigate safety signals for veterinary products, find reports by animal species or drug, or explore reaction patterns. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoNumber of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error.
sortNoSort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: original_receive_date:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name.
limitNoMaximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures.
stageNoStage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb.
searchNoopenFDA search query using field:value syntax. Examples: animal.species:"Dog", drug.brand_name:"Bravecto", reaction.veddra_term_name:"Vomiting", serious_ae:"true". Omit to browse recent reports. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request.
canvas_idNoCanvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoResponse metadata
errorNoPresent when the call failed. Absent on success.
noticeNoCanvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty or paging overshot — how to broaden filters or adjust the query.
resultsNoAnimal adverse event records. Key fields: unique_aer_id_number, original_receive_date, serious_ae, animal (species, gender, breed, age, weight), drug[] (brand_name, active_ingredients, route, dose, administered_by), reaction[] (veddra_term_name, number_of_animals_affected), outcome[] (medical_status), primary_reporter, type_of_information.
spilledNoTrue when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested.
canvas_idNoDataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas.
truncatedNoTrue when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set.
page_bytesNoSerialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.
staged_rowsNoRows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.
canvas_tableNoCanvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses.
page_omittedNoRecords dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.
totalResultsNoTotal matching animal adverse event records in the dataset
effectiveQueryNoSearch filter applied to the query, as submitted to openFDA

TDQS

A4.6/5.0
Behavior4/5

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

Annotations provide readOnlyHint=true, so the safety profile is already known. The description adds meaningful behavioral context beyond the schema: it explains the staging behavior (records drained onto a canvas table up to a size budget, staged_rows reports how many reached it), the pagination cap (25000 records), the serialized page budget (24000 bytes), and the distinction between staging and server-side aggregation. This is rich behavioral disclosure that goes beyond what annotations alone provide.

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

Conciseness4/5

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

The description is compact and front-loaded: the first sentence states the core purpose, the second lists record contents, the third gives use cases, and the final sentence provides the staging routing. Every sentence earns its place. It loses one point because the staging guidance is dense and could be slightly clearer, but overall it is well-structured and appropriately sized for a tool with 6 parameters.

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 exists (so return values need not be explained), the annotations cover read-only safety, and the schema covers 100% of parameters, the description is complete. It covers the tool's purpose, use cases, staging workflow, pagination limits, and sibling routing. An agent has everything needed to select and invoke this tool correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining the staging workflow (stage=true triggers openfda_dataframe_describe/query), the canvas_id reuse for cross-table joins, and the relationship between limit and the serialized page budget. It also gives concrete search query examples (animal.species:"Dog", drug.brand_name:"Bravecto") that illustrate parameter semantics beyond the schema's field:value syntax note.

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 ('Search') and resource ('adverse event reports for veterinary drugs and devices submitted to the FDA Center for Veterinary Medicine'), and enumerates the record contents (species, breed, drug name, reactions, outcome). It clearly distinguishes this from sibling tools like openfda_search_adverse_events (human adverse events) and openfda_search_device_clearances by scoping to veterinary products.

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

Usage Guidelines5/5

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

The description gives explicit use cases: 'investigate safety signals for veterinary products, find reports by animal species or drug, or explore reaction patterns.' It also provides a conditional routing rule: 'With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.' This tells the agent when to use this tool and how to chain it with siblings.

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

openfda_search_device_clearancesOpenfda Search Device ClearancesA
Read-only
Inspect

Search FDA device premarket notifications — 510(k) clearances and PMA approvals. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoNumber of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error.
sortNoSort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: decision_date:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name.
limitNoMaximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures. A 510(k) record carries a summary narrative and is several times the size of a PMA record.
stageNoStage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb.
searchNoopenFDA search query. Examples: applicant:"medtronic", advisory_committee_description:"cardiovascular", product_code:"DXN", openfda.device_name:"catheter". Omit to browse recent. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request.
pathwayYesPremarket pathway. 510(k) is the most common; PMA is for higher-risk devices.
canvas_idNoCanvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoResponse metadata
errorNoPresent when the call failed. Absent on success.
noticeNoCanvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty — how to broaden filters or correct field names.
resultsNo510(k) or PMA records — 510(k) carries k_number, device_name, applicant, product_code, decision_date, decision_description, advisory_committee_description; PMA carries pma_number, trade_name, generic_name, supplement_number plus shared applicant/product_code/decision_date/decision_description.
spilledNoTrue when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested.
canvas_idNoDataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas.
truncatedNoTrue when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set.
page_bytesNoSerialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.
staged_rowsNoRows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.
canvas_tableNoCanvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses.
page_omittedNoRecords dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.
totalResultsNoTotal matching device clearance records in the dataset
effectiveQueryNoSearch filter applied to the device clearance query, as submitted to openFDA

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true; the description adds the staging behavior (records being placed on a canvas for SQL analysis) and routes to subsequent tools. However, the richer behavioral disclosures — 25000-record pagination cap, 24000-byte serialized page budget with page_omitted reporting, CANVAS_PROVIDER_TYPE=duckdb requirement, canvas_id accumulation — all live in the input schema rather than the description body, so the description itself contributes only modest behavioral context.

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?

Two sentences with zero waste: the first front-loads the purpose, the second delivers the most valuable usage guidance (the staged-analysis chain). Everything else is delegated to the schema, which is dense and well-structured.

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?

The package is complete for a moderately complex tool: output schema exists so return values need no explanation, all 7 parameters are covered in the schema, and the description covers the non-obvious workflow trap (stage → describe → query). Minor gap: the aggregation alternative (openfda_count_values) is mentioned only in the stage parameter schema, not in the description body.

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 the schema fully documents all seven parameters including patterns, defaults, bounds, and error conditions. The description body adds no parameter-level semantics beyond pointing out the stage=true chaining workflow, so the 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 a specific verb ('Search') and resource ('FDA device premarket notifications') and names both covered pathways (510(k) clearances and PMA approvals). The pathway enum in the schema confirms the scope, and the tool is clearly distinguishable from the drug-focused siblings (openfda_search_adverse_events, openfda_search_drug_approvals).

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 an explicit follow-on workflow — with stage=true, call openfda_dataframe_describe then openfda_dataframe_query — naming the exact sibling tools to chain. It does not state explicit when-not-to-use exclusions against alternative search tools, but the resource is self-evident from the name and the staging guidance is concrete and actionable.

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

openfda_search_drug_approvalsOpenfda Search Drug ApprovalsA
Read-only
Inspect

Search the Drugs@FDA database for drug application approvals (NDAs and ANDAs). Returns application details, sponsor info, and full submission history. Pair with openfda_get_drug_label to read the approved label, or openfda_count_values to aggregate by sponsor_name, product_type, or route. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoNumber of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error.
sortNoSort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: submissions.submission_status_date:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name.
limitNoMaximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures. A record carries its application's whole submission history, so a long-running application is an order of magnitude larger than a recent one.
stageNoStage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb.
searchNoopenFDA search query. Examples: openfda.brand_name:"humira", sponsor_name:"PFIZER", submissions.submission_type:"ORIG" AND submissions.review_priority:"PRIORITY". Exact quoted values can be case-sensitive on some fields — sponsor_name is stored uppercase, so use sponsor_name:"PFIZER" (a lowercase quoted value returns no matches). Omit to browse recent. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request.
canvas_idNoCanvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoResponse metadata
errorNoPresent when the call failed. Absent on success.
noticeNoCanvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty — how to broaden filters or correct field names.
resultsNoDrug application records — application_number, sponsor_name, openfda block (brand_name, generic_name, route, product_type, substance_name), products[] (active_ingredients, dosage_form, marketing_status), submissions[] (submission_type, submission_status, submission_status_date, review_priority).
spilledNoTrue when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested.
canvas_idNoDataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas.
truncatedNoTrue when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set.
page_bytesNoSerialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.
staged_rowsNoRows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.
canvas_tableNoCanvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses.
page_omittedNoRecords dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.
totalResultsNoTotal matching drug approval records in the dataset
effectiveQueryNoSearch filter applied to the Drugs@FDA query, as submitted to openFDA

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already give readOnlyHint=true, so the safety profile is covered. The description adds behavioral context beyond that: it returns full submission history and, with stage=true, stages records for SQL analysis. This is useful information that the annotation alone does not convey.

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?

Three compact sentences, front-loaded with the core purpose, followed by sibling routing and the staged workflow. Every sentence earns its place; only minor redundancy with the stage parameter's schema description keeps it from a 5.

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

Completeness4/5

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

Given the rich input schema, output schema, and readOnlyHint annotation, the description is largely sufficient. It covers return contents and important sibling workflows; the remaining details about pagination caps, sort validation, and query syntax live in the schema, which is appropriate.

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 the schema itself fully documents parameters like skip, limit, sort, search, stage, and canvas_id. The description adds workflow-level guidance, especially around stage=true, but does not need to repeat parameter semantics.

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: 'Search the Drugs@FDA database for drug application approvals (NDAs and ANDAs).' It also says what it returns, and the pairing with openfda_get_drug_label and openfda_count_values makes it distinguishable from those siblings.

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?

Provides explicit usage routing: pair with openfda_get_drug_label to read the label, use openfda_count_values for aggregation, and follow the stage=true workflow with openfda_dataframe_describe and openfda_dataframe_query. This is clear guidance on when to use the tool and which alternatives apply to which job.

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

openfda_search_drug_shortagesOpenfda Search Drug ShortagesA
Read-only
Inspect

Search FDA drug shortage records. Returns per-product shortage status, availability, therapeutic category, dosage form, manufacturer, and dates. Use to check whether a drug is currently in shortage, find all oncology drugs with supply issues, or retrieve the openfda block (brand_name, product_ndc, rxcui) to chain into openfda_get_drug_label or openfda_lookup_ndc. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoNumber of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error.
sortNoSort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: update_date:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name.
limitNoMaximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures.
stageNoStage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb.
searchNoopenFDA search query using field:value syntax. Examples: status:"Current", therapeutic_category:"Oncology", generic_name:"carboplatin", company_name:"pfizer". Omit to browse all records. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request. Call openfda_describe_fields({ endpoint: "drug/shortages" }) for the complete field list.
canvas_idNoCanvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoResponse metadata
errorNoPresent when the call failed. Absent on success.
noticeNoCanvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty — how to broaden filters or correct field names.
resultsNoDrug shortage records. Key fields: generic_name, status ("Current"/"Resolved"), availability, therapeutic_category, dosage_form, presentation, package_ndc, company_name, contact_info, initial_posting_date, update_date, update_type. openfda block contains brand_name, product_ndc, rxcui, spl_set_id for cross-linking.
spilledNoTrue when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested.
canvas_idNoDataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas.
truncatedNoTrue when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set.
page_bytesNoSerialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.
staged_rowsNoRows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.
canvas_tableNoCanvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses.
page_omittedNoRecords dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.
totalResultsNoTotal matching drug shortage records in the dataset
effectiveQueryNoSearch filter applied to the drug/shortages query, as submitted to openFDA

TDQS

A4.1/5.0
Behavior4/5

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

The readOnlyHint annotation already establishes the safety profile, and the description is consistent with it ('Search', 'Returns'). It adds value by disclosing the returned content and the staging workflow for downstream SQL analysis. It does not cover rate limits or error behavior beyond what the schema already documents, but the annotation lowers the burden.

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

Conciseness5/5

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

The description is front-loaded with the core purpose and return contents, then gives usage examples and chaining guidance in three additional sentences. Every sentence earns its place; there is no redundant restating of the title or schema.

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 rich output schema, the readOnlyHint annotation, and a fully described parameter schema, the description covers the essential operational context: what the tool returns, when to use it, how to chain related tools, and how to proceed with stage=true. An agent has everything needed to invoke it correctly.

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 the schema fully documents all six parameters. The description adds minor orienting context by mentioning stage=true and the chaining use of the openfda block, but it does not meaningfully expand on parameter semantics beyond what the schema already provides. Baseline 3 applies.

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?

The description states a specific verb and resource ('Search FDA drug shortage records') and lists the returned fields, making the tool's domain unmistakable against siblings like openfda_search_adverse_events. It does not explicitly name a sibling it is not, but the shortage-specific scope and the return-field list provide enough differentiation.

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

Usage Guidelines4/5

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

The description gives concrete when-to-use contexts: checking current shortages, finding oncology drugs with supply issues, and retrieving the openfda block to chain into openfda_get_drug_label or openfda_lookup_ndc. It does not state exclusions or explicitly compare against the other search_* sibling tools, but the guidance is clear and actionable.

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

openfda_search_recallsOpenfda Search RecallsA
Read-only
Inspect

Search enforcement reports and recall actions across drugs, food, and devices. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoNumber of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error.
sortNoSort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort (e.g. report_date:desc,status.exact:asc). Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name.
limitNoMaximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures. Device records are the largest here — a device enforcement or recall record runs several kilobytes where a drug or food enforcement record is around one.
stageNoStage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb.
searchNoopenFDA search query. Examples: classification:"Class I" (also "Class II" or "Class III"), recalling_firm:"pfizer", reason_for_recall:"undeclared allergen". Omit to browse recent. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request.
categoryYesProduct category
endpointNoReport type. Default enforcement. The recall endpoint is only available for devices.enforcement
canvas_idNoCanvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoResponse metadata
errorNoPresent when the call failed. Absent on success.
noticeNoCanvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty — how to broaden filters or correct field names.
resultsNoEnforcement or recall records. Enforcement records (every category) carry recall_number, classification, status, voluntary_mandated, recalling_firm, product_description, reason_for_recall, distribution_pattern, report_date. Device recall records name identity product_res_number and status recall_status, add res_event_number and root_cause_description, share the firm, product, reason, and distribution fields, and carry no recall hazard classification.
spilledNoTrue when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested.
canvas_idNoDataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas.
truncatedNoTrue when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set.
page_bytesNoSerialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.
staged_rowsNoRows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.
canvas_tableNoCanvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses.
page_omittedNoRecords dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.
totalResultsNoTotal matching recall/enforcement records in the dataset
effectiveQueryNoSearch filter applied to the recall query, as submitted to openFDA

TDQS

A3.6/5.0
Behavior3/5

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

The readOnlyHint annotation already covers safety, and the description correctly aligns with it by saying 'Search' rather than implying mutation. The description adds some useful staging behavior, but it does not disclose further behavioral traits such as pagination limits, size budget behavior, or endpoint-specific constraints beyond what the schema already documents.

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 two concise sentences with the core purpose front-loaded and the staged-workflow guidance in the second sentence. There is no wasted wording and every clause adds context.

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

Completeness4/5

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

Given the very complete input schema, annotations, and output schema, the description is adequately complemented by structured metadata. The only meaningful completeness gap is the lack of explicit alternative tool routing for counts or non-staged use cases.

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 the baseline is 3; the rich parameter descriptions in the schema carry the burden of explaining pagination, sorting, staging, and search syntax. The description itself adds no new parameter meaning, but it does not need to given the extensive schema.

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?

The description states a clear verb and resource—'Search enforcement reports and recall actions across drugs, food, and devices'—which clearly identifies the tool's domain and distinguishes it from sibling search tools like adverse events or drug shortages. It does not explicitly name a sibling or call out what this tool is not, so it falls just short of the highest clarity bar.

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

Usage Guidelines3/5

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

The description gives a clear follow-on workflow for staged queries: 'With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.' However, it does not state when to choose this tool over alternatives such as openfda_count_values or the other openfda_search_* tools.

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

openfda_search_tobacco_reportsOpenfda Search Tobacco ReportsA
Read-only
Inspect

Search problem reports submitted to the FDA for tobacco products, including e-cigarettes, vaping products, cigarettes, and smokeless tobacco. Reports capture product type, reported health problems (e.g. seizure, chest pain), product problems (e.g. exploding battery), whether a non-user was affected, and submission date. Use to investigate safety signals, find reports by product type, or analyze health effects. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoNumber of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error.
sortNoSort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: date_submitted:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name.
limitNoMaximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures.
stageNoStage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb.
searchNoopenFDA search query using field:value syntax. Examples: tobacco_products:"Electronic cigarette", reported_health_problems:"Seizure", nonuser_affected:"Yes". Omit to browse recent reports. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request.
canvas_idNoCanvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaNoResponse metadata
errorNoPresent when the call failed. Absent on success.
noticeNoCanvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty or paging overshot — how to broaden filters or adjust the query.
resultsNoTobacco problem report records. Key fields: report_id, date_submitted, tobacco_products[] (product type description), reported_health_problems[] (health effects), reported_product_problems[] (device/product defects), number_tobacco_products, number_health_problems, number_product_problems, nonuser_affected.
spilledNoTrue when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested.
canvas_idNoDataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas.
truncatedNoTrue when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set.
page_bytesNoSerialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.
staged_rowsNoRows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.
canvas_tableNoCanvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses.
page_omittedNoRecords dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.
totalResultsNoTotal matching tobacco problem reports in the dataset
effectiveQueryNoSearch filter applied to the query, as submitted to openFDA

TDQS

A4.3/5.0
Behavior4/5

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

The readOnlyHint annotation already establishes the safe read-only nature, and the description aligns with it. The description adds useful context about the report contents and the staging workflow, though pagination limits and other behavioral details are left to the parameter schema.

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 with no wasted words: scope, data contents, and usage workflow are each covered once and front-loaded. The staging instruction earns its place because it routes the agent to the correct follow-up tools.

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 read-only search tool with a detailed input schema, output schema, and readOnly annotation, the description covers the domain, the available report dimensions, and the staging workflow. No essential information for invoking the tool correctly appears to be 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 the schema already documents all six parameters in detail. The description adds high-level domain context and use cases but no new parameter-level semantics, which matches the baseline of 3.

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

Purpose5/5

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

States a specific verb and resource: 'Search problem reports submitted to the FDA for tobacco products', then enumerates product categories and example fields. This distinguishes the tool from sibling search tools such as openfda_search_adverse_events.

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 clear use cases: 'investigate safety signals, find reports by product type, or analyze health effects', and explains the stage=true workflow with openfda_dataframe_describe and openfda_dataframe_query. It does not explicitly state when not to use this tool versus sibling tools, but the domain-specific context is clear.

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. 2 tool updates
    • Changedopenfda_get_drug_label2 fields changed
      • changedInput schema / properties / sections / description
        Previous value: -"Label sections to return, e.g. [\"boxed_warning\",\"indications_and_usage\"]. Names come from the outline an oversized page returns, or from openfda_describe_fields. Omit for the whole label — which returns the section outline instead when the page exceeds the inline size budget. A selection is returned whole even when it exceeds that budget, with its serialized size reported on the notice; the outline names a section measured to fit at the requested limit. Metadata (openfda, set_id, id, effective_time, version) is returned either way and counts toward the size."New value: +"Label sections to return, e.g. [\"boxed_warning\",\"indications_and_usage\"]. Names come from the outline an oversized page returns, or from openfda_describe_fields. Omit for the whole label — which returns the section outline instead when the page exceeds the inline size budget; an empty list is treated as omitted. A selection is returned whole even when it exceeds that budget, with its serialized size reported on the notice; the outline names a section measured to fit at the requested limit. Sections ending in _table hold SPL table markup: raw in structured results, rendered as Markdown tables in the text output. Metadata (openfda, set_id, id, effective_time, version) is returned either way and counts toward the size."
      • changedOutput schema / properties / results / description
        Previous value: -"Drug label records, present when kind is \"full\". Each carries an openfda block (brand_name, generic_name, manufacturer_name, route) plus optional SPL sections like indications_and_usage, warnings, dosage_and_administration, contraindications, adverse_reactions; section presence varies per label. Narrowed to the requested sections plus metadata when sections was supplied."New value: +"Drug label records, present when kind is \"full\". Each carries an openfda block (brand_name, generic_name, manufacturer_name, route) plus optional SPL sections like indications_and_usage, warnings, dosage_and_administration, contraindications, adverse_reactions; section presence varies per label. Sections ending in _table carry raw SPL table markup (tags and character entities) exactly as openFDA returns it. Narrowed to the requested sections plus metadata when sections was supplied."
    • Changedopenfda_search_recalls1 field changed
      • changedOutput schema / properties / results / description
        Previous value: -"Enforcement or recall records — recall_number, classification, recalling_firm, product_description, reason_for_recall, status, voluntary_mandated, distribution_pattern, report_date. Field set varies between enforcement and recall endpoints."New value: +"Enforcement or recall records. Enforcement records (every category) carry recall_number, classification, status, voluntary_mandated, recalling_firm, product_description, reason_for_recall, distribution_pattern, report_date. Device recall records name identity product_res_number and status recall_status, add res_event_number and root_cause_description, share the firm, product, reason, and distribution fields, and carry no recall hazard classification."
  2. 11 tool updates
    • Changedopenfda_count_values5 fields changed
      • changedInput schema / properties / count / description
        Previous value: -"Field to count. Append .exact for whole-phrase counting of free-text fields (e.g. \"patient.reaction.reactionmeddrapt.exact\"). Identifier fields openFDA already indexes as keywords (product_ndc, application_number, pma_number) must be counted bare — .exact on those is rejected as not countable."New value: +"Field to count. openfda_describe_fields gives the verified expression per field as countAs (null = not countable in any form). Otherwise: append .exact for whole-phrase counting of free-text fields (e.g. \"patient.reaction.reactionmeddrapt.exact\"); count identifier fields openFDA already indexes as keywords (product_ndc, application_number, pma_number) bare — .exact on those is rejected as not countable."
      • changedInput schema / properties / limit / description
        Previous value: -"Number of top terms to return (default 100, max 1000)"New value: +"Number of top terms to return (default 100, max 1000 — openFDA's own count maximum). truncated reports whether more distinct terms exist beyond it, except at the maximum itself, where openFDA offers no way to tell."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search or count query was rejected by openFDA (malformed field name, invalid syntax). `not_aggregatable`: openFDA cannot aggregate the count expression as written — an analyzed text field, or .exact on a field already indexed as a keyword. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search or count query was rejected by openFDA (malformed field name, invalid syntax). `not_aggregatable`: openFDA cannot aggregate the count expression as written — an analyzed text field, .exact on a field already indexed as a keyword, or a field with no countable form. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no terms matched — how to verify the field name or adjust the count expression. Absent when terms are returned."New value: +"Why the tally is empty — the search matched no records, or the matched records carry no value for the field — and how to widen it; when truncated, how to reach the omitted terms; at the 1000-term maximum, that openFDA cannot show whether more distinct values exist. Absent when a complete list is returned."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the term list was capped at the limit — more distinct terms may exist."New value: +"True when at least one more distinct term exists beyond the limit. Absent when the list is complete, and at the 1000-term maximum, where openFDA cannot show whether more exist (notice says so)."
    • Changedopenfda_describe_fields2 fields changed
      • addedOutput schema / properties / groups / items / properties / fields / items / properties / countAs
        Added value: +{
        +  "description": "Verified expression to pass as count in openfda_count_values (the bare path or path.exact); null when openFDA cannot aggregate the field in any form",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / groups / items / properties / fields / items / required
        Previous value: -[
        -  "path",
        -  "type",
        -  "note"
        -]New value: +[
        +  "path",
        +  "type",
        +  "countAs",
        +  "note"
        +]
    • Changedopenfda_get_drug_label1 field changed
      • addedOutput schema / properties / meta / properties / totalUnverified
        Added value: +{
        +  "description": "Present (true) only on an empty page at skip > 0 whose total could not be confirmed: openFDA answers a page past the end and a search that matched nothing alike, and the follow-up request for the total failed. total then reads 0 without ruling out records at a lower skip — re-call with skip=0 to tell.",
        +  "type": "boolean"
        +}
    • Changedopenfda_lookup_ndc1 field changed
      • addedOutput schema / properties / meta / properties / totalUnverified
        Added value: +{
        +  "description": "Present (true) only on an empty page at skip > 0 whose total could not be confirmed: openFDA answers a page past the end and a search that matched nothing alike, and the follow-up request for the total failed. total then reads 0 without ruling out records at a lower skip — re-call with skip=0 to tell.",
        +  "type": "boolean"
        +}
    • Changedopenfda_search_adverse_events1 field changed
      • addedOutput schema / properties / meta / properties / totalUnverified
        Added value: +{
        +  "description": "Present (true) only on an empty page at skip > 0 whose total could not be confirmed: openFDA answers a page past the end and a search that matched nothing alike, and the follow-up request for the total failed. total then reads 0 without ruling out records at a lower skip — re-call with skip=0 to tell.",
        +  "type": "boolean"
        +}
    • Changedopenfda_search_animal_events1 field changed
      • addedOutput schema / properties / meta / properties / totalUnverified
        Added value: +{
        +  "description": "Present (true) only on an empty page at skip > 0 whose total could not be confirmed: openFDA answers a page past the end and a search that matched nothing alike, and the follow-up request for the total failed. total then reads 0 without ruling out records at a lower skip — re-call with skip=0 to tell.",
        +  "type": "boolean"
        +}
    • Changedopenfda_search_device_clearances1 field changed
      • addedOutput schema / properties / meta / properties / totalUnverified
        Added value: +{
        +  "description": "Present (true) only on an empty page at skip > 0 whose total could not be confirmed: openFDA answers a page past the end and a search that matched nothing alike, and the follow-up request for the total failed. total then reads 0 without ruling out records at a lower skip — re-call with skip=0 to tell.",
        +  "type": "boolean"
        +}
    • Changedopenfda_search_drug_approvals1 field changed
      • addedOutput schema / properties / meta / properties / totalUnverified
        Added value: +{
        +  "description": "Present (true) only on an empty page at skip > 0 whose total could not be confirmed: openFDA answers a page past the end and a search that matched nothing alike, and the follow-up request for the total failed. total then reads 0 without ruling out records at a lower skip — re-call with skip=0 to tell.",
        +  "type": "boolean"
        +}
    • Changedopenfda_search_drug_shortages1 field changed
      • addedOutput schema / properties / meta / properties / totalUnverified
        Added value: +{
        +  "description": "Present (true) only on an empty page at skip > 0 whose total could not be confirmed: openFDA answers a page past the end and a search that matched nothing alike, and the follow-up request for the total failed. total then reads 0 without ruling out records at a lower skip — re-call with skip=0 to tell.",
        +  "type": "boolean"
        +}
    • Changedopenfda_search_recalls1 field changed
      • addedOutput schema / properties / meta / properties / totalUnverified
        Added value: +{
        +  "description": "Present (true) only on an empty page at skip > 0 whose total could not be confirmed: openFDA answers a page past the end and a search that matched nothing alike, and the follow-up request for the total failed. total then reads 0 without ruling out records at a lower skip — re-call with skip=0 to tell.",
        +  "type": "boolean"
        +}
    • Changedopenfda_search_tobacco_reports1 field changed
      • addedOutput schema / properties / meta / properties / totalUnverified
        Added value: +{
        +  "description": "Present (true) only on an empty page at skip > 0 whose total could not be confirmed: openFDA answers a page past the end and a search that matched nothing alike, and the follow-up request for the total failed. total then reads 0 without ruling out records at a lower skip — re-call with skip=0 to tell.",
        +  "type": "boolean"
        +}
  3. 8 tool updates
    • Changedopenfda_lookup_ndc5 fields changed
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `canvas_not_found`: The canvas_id is well-formed but names no active canvas — expired or never minted. `canvas_capacity_exhausted`: canvas_id was omitted and the active canvas cap is already reached. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "canvas_disabled",
        -  "rate_limited",
        -  "upstream_error",
        -  "malformed_search",
        -  "query_error",
        -  "pagination_limit_reached"
        -]New value: +[
        +  "canvas_disabled",
        +  "canvas_not_found",
        +  "canvas_capacity_exhausted",
        +  "rate_limited",
        +  "upstream_error",
        +  "malformed_search",
        +  "query_error",
        +  "pagination_limit_reached"
        +]
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested."
    • Changedopenfda_search_adverse_events5 fields changed
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `canvas_not_found`: The canvas_id is well-formed but names no active canvas — expired or never minted. `canvas_capacity_exhausted`: canvas_id was omitted and the active canvas cap is already reached. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "canvas_disabled",
        -  "rate_limited",
        -  "upstream_error",
        -  "malformed_search",
        -  "query_error",
        -  "pagination_limit_reached"
        -]New value: +[
        +  "canvas_disabled",
        +  "canvas_not_found",
        +  "canvas_capacity_exhausted",
        +  "rate_limited",
        +  "upstream_error",
        +  "malformed_search",
        +  "query_error",
        +  "pagination_limit_reached"
        +]
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested."
    • Changedopenfda_search_animal_events5 fields changed
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `canvas_not_found`: The canvas_id is well-formed but names no active canvas — expired or never minted. `canvas_capacity_exhausted`: canvas_id was omitted and the active canvas cap is already reached. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "canvas_disabled",
        -  "rate_limited",
        -  "upstream_error",
        -  "malformed_search",
        -  "query_error",
        -  "pagination_limit_reached"
        -]New value: +[
        +  "canvas_disabled",
        +  "canvas_not_found",
        +  "canvas_capacity_exhausted",
        +  "rate_limited",
        +  "upstream_error",
        +  "malformed_search",
        +  "query_error",
        +  "pagination_limit_reached"
        +]
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested."
    • Changedopenfda_search_device_clearances5 fields changed
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `canvas_not_found`: The canvas_id is well-formed but names no active canvas — expired or never minted. `canvas_capacity_exhausted`: canvas_id was omitted and the active canvas cap is already reached. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "canvas_disabled",
        -  "rate_limited",
        -  "upstream_error",
        -  "malformed_search",
        -  "query_error",
        -  "pagination_limit_reached"
        -]New value: +[
        +  "canvas_disabled",
        +  "canvas_not_found",
        +  "canvas_capacity_exhausted",
        +  "rate_limited",
        +  "upstream_error",
        +  "malformed_search",
        +  "query_error",
        +  "pagination_limit_reached"
        +]
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested."
    • Changedopenfda_search_drug_approvals5 fields changed
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `canvas_not_found`: The canvas_id is well-formed but names no active canvas — expired or never minted. `canvas_capacity_exhausted`: canvas_id was omitted and the active canvas cap is already reached. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "canvas_disabled",
        -  "rate_limited",
        -  "upstream_error",
        -  "malformed_search",
        -  "query_error",
        -  "pagination_limit_reached"
        -]New value: +[
        +  "canvas_disabled",
        +  "canvas_not_found",
        +  "canvas_capacity_exhausted",
        +  "rate_limited",
        +  "upstream_error",
        +  "malformed_search",
        +  "query_error",
        +  "pagination_limit_reached"
        +]
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested."
    • Changedopenfda_search_drug_shortages5 fields changed
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `canvas_not_found`: The canvas_id is well-formed but names no active canvas — expired or never minted. `canvas_capacity_exhausted`: canvas_id was omitted and the active canvas cap is already reached. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "canvas_disabled",
        -  "rate_limited",
        -  "upstream_error",
        -  "malformed_search",
        -  "query_error",
        -  "pagination_limit_reached"
        -]New value: +[
        +  "canvas_disabled",
        +  "canvas_not_found",
        +  "canvas_capacity_exhausted",
        +  "rate_limited",
        +  "upstream_error",
        +  "malformed_search",
        +  "query_error",
        +  "pagination_limit_reached"
        +]
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested."
    • Changedopenfda_search_recalls5 fields changed
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `recall_endpoint_non_device`: The recall endpoint was requested for a non-device category. `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `recall_endpoint_non_device`: The recall endpoint was requested for a non-device category. `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `canvas_not_found`: The canvas_id is well-formed but names no active canvas — expired or never minted. `canvas_capacity_exhausted`: canvas_id was omitted and the active canvas cap is already reached. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "recall_endpoint_non_device",
        -  "canvas_disabled",
        -  "rate_limited",
        -  "upstream_error",
        -  "malformed_search",
        -  "query_error",
        -  "pagination_limit_reached"
        -]New value: +[
        +  "recall_endpoint_non_device",
        +  "canvas_disabled",
        +  "canvas_not_found",
        +  "canvas_capacity_exhausted",
        +  "rate_limited",
        +  "upstream_error",
        +  "malformed_search",
        +  "query_error",
        +  "pagination_limit_reached"
        +]
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested."
    • Changedopenfda_search_tobacco_reports5 fields changed
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis — openfda_dataframe_describe lists the staged columns, openfda_dataframe_query runs the SQL. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; list its columns with openfda_dataframe_describe, then reference it in openfda_dataframe_query FROM clauses."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `canvas_not_found`: The canvas_id is well-formed but names no active canvas — expired or never minted. `canvas_capacity_exhausted`: canvas_id was omitted and the active canvas cap is already reached. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "canvas_disabled",
        -  "rate_limited",
        -  "upstream_error",
        -  "malformed_search",
        -  "query_error",
        -  "pagination_limit_reached"
        -]New value: +[
        +  "canvas_disabled",
        +  "canvas_not_found",
        +  "canvas_capacity_exhausted",
        +  "rate_limited",
        +  "upstream_error",
        +  "malformed_search",
        +  "query_error",
        +  "pagination_limit_reached"
        +]
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_describe for its columns, then openfda_dataframe_query for SQL. Absent when staging was not requested."
  4. 10 tool updates
    • Changedopenfda_dataframe_describe3 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"Canvas ID from an openFDA search tool response (present when the search ran with stage=true)."New value: +"Canvas ID from the canvas_id field of an openFDA search tool response (openfda_search_* or openfda_lookup_ndc), present when the search ran with stage=true."
      • removedInput schema / properties / canvas_id / minLength
        Removed value: -1
      • changedInput schema / properties / canvas_id / pattern
        Previous value: -"\\S"New value: +"^[A-Za-z0-9_-]{10}$"
    • Changedopenfda_dataframe_query4 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"Canvas ID from an openFDA search tool response (the canvas_id field, present when the search ran with stage=true)."New value: +"Canvas ID from the canvas_id field of an openFDA search tool response (openfda_search_* or openfda_lookup_ndc), present when the search ran with stage=true."
      • removedInput schema / properties / canvas_id / minLength
        Removed value: -1
      • changedInput schema / properties / canvas_id / pattern
        Previous value: -"\\S"New value: +"^[A-Za-z0-9_-]{10}$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: DataCanvas is disabled — CANVAS_PROVIDER_TYPE is unset. `canvas_not_found`: The canvas_id does not correspond to an active canvas session. `missing_table`: The SQL references a table that is not on the canvas — dropped, expired, or mistyped. `invalid_query`: The SQL is not a valid SELECT, references an unknown column, or uses a blocked operation. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: DataCanvas is disabled — CANVAS_PROVIDER_TYPE is unset. `canvas_not_found`: The canvas_id does not correspond to an active canvas session. `missing_table`: The SQL references a table that is not on the canvas — dropped, expired, or mistyped. `invalid_query`: The SQL is not a valid SELECT, references an unknown column, uses a blocked operation, or fails on a staged value (a CAST that does not convert). Other values are possible when a failure originates below the handler."
    • Changedopenfda_lookup_ndc3 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Passing one stages this lookup onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."New value: +"Canvas ID returned by a prior stage=true call to this tool or an openFDA search tool (openfda_search_*). Passing one stages this lookup onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • removedInput schema / properties / canvas_id / minLength
        Removed value: -1
      • changedInput schema / properties / canvas_id / pattern
        Previous value: -"\\S"New value: +"^[A-Za-z0-9_-]{10}$"
    • Changedopenfda_search_adverse_events3 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."New value: +"Canvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • removedInput schema / properties / canvas_id / minLength
        Removed value: -1
      • changedInput schema / properties / canvas_id / pattern
        Previous value: -"\\S"New value: +"^[A-Za-z0-9_-]{10}$"
    • Changedopenfda_search_animal_events3 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."New value: +"Canvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • removedInput schema / properties / canvas_id / minLength
        Removed value: -1
      • changedInput schema / properties / canvas_id / pattern
        Previous value: -"\\S"New value: +"^[A-Za-z0-9_-]{10}$"
    • Changedopenfda_search_device_clearances3 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."New value: +"Canvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • removedInput schema / properties / canvas_id / minLength
        Removed value: -1
      • changedInput schema / properties / canvas_id / pattern
        Previous value: -"\\S"New value: +"^[A-Za-z0-9_-]{10}$"
    • Changedopenfda_search_drug_approvals3 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."New value: +"Canvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • removedInput schema / properties / canvas_id / minLength
        Removed value: -1
      • changedInput schema / properties / canvas_id / pattern
        Previous value: -"\\S"New value: +"^[A-Za-z0-9_-]{10}$"
    • Changedopenfda_search_drug_shortages3 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."New value: +"Canvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • removedInput schema / properties / canvas_id / minLength
        Removed value: -1
      • changedInput schema / properties / canvas_id / pattern
        Previous value: -"\\S"New value: +"^[A-Za-z0-9_-]{10}$"
    • Changedopenfda_search_recalls3 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."New value: +"Canvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • removedInput schema / properties / canvas_id / minLength
        Removed value: -1
      • changedInput schema / properties / canvas_id / pattern
        Previous value: -"\\S"New value: +"^[A-Za-z0-9_-]{10}$"
    • Changedopenfda_search_tobacco_reports3 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."New value: +"Canvas ID returned by a prior stage=true call to this tool or another openFDA search tool (openfda_search_* or openfda_lookup_ndc). Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • removedInput schema / properties / canvas_id / minLength
        Removed value: -1
      • changedInput schema / properties / canvas_id / pattern
        Previous value: -"\\S"New value: +"^[A-Za-z0-9_-]{10}$"
  5. 1 tool update
    • Changedopenfda_drug_profile19 fields changed
      • changedOutput schema / properties / approval / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "applicationNumber": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "NDA/ANDA application number."
        -      },
        -      "marketingStatus": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Derived marketing/approval status."
        -      },
        -      "sponsor": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Sponsor/applicant name."
        -      }
        -    },
        -    "required": [
        -      "applicationNumber",
        -      "sponsor",
        -      "marketingStatus"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "applicationNumber": {
        +        "description": "NDA/ANDA application number.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "marketingStatus": {
        +        "description": "Derived marketing/approval status.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "sponsor": {
        +        "description": "Sponsor/applicant name.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "applicationNumber",
        +      "sponsor",
        +      "marketingStatus"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / identity / properties / generic_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / identity / properties / generic_name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / identity / properties / product_ndc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / identity / properties / product_ndc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / identity / properties / rxcui / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / identity / properties / rxcui / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / identity / properties / spl_set_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / identity / properties / spl_set_id / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / label / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "dosage": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Dosage and administration (truncated)."
        -      },
        -      "indications": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Indications and usage (truncated)."
        -      },
        -      "warnings": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Warnings (truncated) — boxed warning or warnings_and_cautions for Rx labels, falling back to the OTC-monograph warnings section."
        -      }
        -    },
        -    "required": [
        -      "indications",
        -      "warnings",
        -      "dosage"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "dosage": {
        +        "description": "Dosage and administration (truncated).",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "indications": {
        +        "description": "Indications and usage (truncated).",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "warnings": {
        +        "description": "Warnings (truncated) — boxed warning or warnings_and_cautions for Rx labels, falling back to the OTC-monograph warnings section.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "indications",
        +      "warnings",
        +      "dosage"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / recalls / items / properties / classification / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / recalls / items / properties / classification / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / recalls / items / properties / date / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / recalls / items / properties / date / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / recalls / items / properties / reason / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / recalls / items / properties / reason / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / recalls / items / properties / recalling_firm / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / recalls / items / properties / recalling_firm / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / shortage / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "availability": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Availability note (truncated)."
        -      },
        -      "status": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Shortage status (Current/Resolved)."
        -      }
        -    },
        -    "required": [
        -      "status",
        -      "availability"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "availability": {
        +        "description": "Availability note (truncated).",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "status": {
        +        "description": "Shortage status (Current/Resolved).",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "status",
        +      "availability"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  6. 14 tool updates
    • Changedopenfda_count_values6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "meta",
        +      "results",
        +      "termCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search or count query was rejected by openFDA (malformed field name, invalid syntax). `not_aggregatable`: openFDA cannot aggregate the count expression as written — an analyzed text field, or .exact on a field already indexed as a keyword. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "rate_limited",
        +            "upstream_error",
        +            "malformed_search",
        +            "query_error",
        +            "not_aggregatable"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "meta",
        -  "results",
        -  "termCount"
        -]
    • Changedopenfda_dataframe_describe6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "tables",
        +      "canvas_id"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: DataCanvas is disabled — CANVAS_PROVIDER_TYPE is unset. `canvas_not_found`: The canvas_id does not correspond to an active canvas session. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_disabled",
        +            "canvas_not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "tables",
        -  "canvas_id"
        -]
    • Changedopenfda_dataframe_query6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "rows",
        +      "row_count",
        +      "truncated",
        +      "canvas_id"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: DataCanvas is disabled — CANVAS_PROVIDER_TYPE is unset. `canvas_not_found`: The canvas_id does not correspond to an active canvas session. `missing_table`: The SQL references a table that is not on the canvas — dropped, expired, or mistyped. `invalid_query`: The SQL is not a valid SELECT, references an unknown column, or uses a blocked operation. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_disabled",
        +            "canvas_not_found",
        +            "missing_table",
        +            "invalid_query"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "rows",
        -  "row_count",
        -  "truncated",
        -  "canvas_id"
        -]
    • Changedopenfda_describe_fields6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "endpoint",
        +      "groups",
        +      "queryTips"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "endpoint",
        -  "groups",
        -  "queryTips"
        -]
    • Changedopenfda_drug_profile6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "meta",
        +      "identity",
        +      "label",
        +      "adverse_events",
        +      "recalls",
        +      "approval",
        +      "shortage",
        +      "degraded",
        +      "sectionsFound"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `blank_drug_name`: The drug name carries no searchable character — only quotes, backslashes, or whitespace. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "blank_drug_name"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "meta",
        -  "identity",
        -  "label",
        -  "adverse_events",
        -  "recalls",
        -  "approval",
        -  "shortage",
        -  "degraded",
        -  "sectionsFound"
        -]
    • Changedopenfda_get_drug_label6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "meta",
        +      "kind",
        +      "totalResults",
        +      "effectiveQuery"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "rate_limited",
        +            "upstream_error",
        +            "malformed_search",
        +            "query_error",
        +            "pagination_limit_reached"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "meta",
        -  "kind",
        -  "totalResults",
        -  "effectiveQuery"
        -]
    • Changedopenfda_lookup_ndc6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "meta",
        +      "results",
        +      "totalResults",
        +      "effectiveQuery"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_disabled",
        +            "rate_limited",
        +            "upstream_error",
        +            "malformed_search",
        +            "query_error",
        +            "pagination_limit_reached"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "meta",
        -  "results",
        -  "totalResults",
        -  "effectiveQuery"
        -]
    • Changedopenfda_search_adverse_events6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "meta",
        +      "results",
        +      "totalResults"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_disabled",
        +            "rate_limited",
        +            "upstream_error",
        +            "malformed_search",
        +            "query_error",
        +            "pagination_limit_reached"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "meta",
        -  "results",
        -  "totalResults"
        -]
    • Changedopenfda_search_animal_events6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "meta",
        +      "results",
        +      "totalResults"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_disabled",
        +            "rate_limited",
        +            "upstream_error",
        +            "malformed_search",
        +            "query_error",
        +            "pagination_limit_reached"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "meta",
        -  "results",
        -  "totalResults"
        -]
    • Changedopenfda_search_device_clearances6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "meta",
        +      "results",
        +      "totalResults"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_disabled",
        +            "rate_limited",
        +            "upstream_error",
        +            "malformed_search",
        +            "query_error",
        +            "pagination_limit_reached"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "meta",
        -  "results",
        -  "totalResults"
        -]
    • Changedopenfda_search_drug_approvals6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "meta",
        +      "results",
        +      "totalResults"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_disabled",
        +            "rate_limited",
        +            "upstream_error",
        +            "malformed_search",
        +            "query_error",
        +            "pagination_limit_reached"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "meta",
        -  "results",
        -  "totalResults"
        -]
    • Changedopenfda_search_drug_shortages6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "meta",
        +      "results",
        +      "totalResults"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_disabled",
        +            "rate_limited",
        +            "upstream_error",
        +            "malformed_search",
        +            "query_error",
        +            "pagination_limit_reached"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "meta",
        -  "results",
        -  "totalResults"
        -]
    • Changedopenfda_search_recalls6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "meta",
        +      "results",
        +      "totalResults"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `recall_endpoint_non_device`: The recall endpoint was requested for a non-device category. `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "recall_endpoint_non_device",
        +            "canvas_disabled",
        +            "rate_limited",
        +            "upstream_error",
        +            "malformed_search",
        +            "query_error",
        +            "pagination_limit_reached"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "meta",
        -  "results",
        -  "totalResults"
        -]
    • Changedopenfda_search_tobacco_reports6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "meta",
        +      "results",
        +      "totalResults"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: Staging was requested (stage=true or a canvas_id) but DataCanvas is disabled. `rate_limited`: The openFDA daily or per-minute request limit is exceeded. `upstream_error`: The openFDA API returned a 5xx server error. `malformed_search`: The search query leaves a double quote, parenthesis, or range bracket unclosed, or ends on a backslash. `query_error`: The search query was rejected by openFDA (malformed field name, invalid syntax). `pagination_limit_reached`: skip exceeds the 25000 record pagination ceiling. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_disabled",
        +            "rate_limited",
        +            "upstream_error",
        +            "malformed_search",
        +            "query_error",
        +            "pagination_limit_reached"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "meta",
        -  "results",
        -  "totalResults"
        -]
  7. 9 tool updates
    • Changedopenfda_get_drug_label3 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results to return (1-1000). Default 5. Labels are large."New value: +"Maximum number of results to return (1-1000). Default 5. Labels are large, and the cost of a sections selection is the section summed across every record on the page — so it scales with this limit. Lower it before widening a selection."
      • changedInput schema / properties / sections / description
        Previous value: -"Label sections to return, e.g. [\"boxed_warning\",\"indications_and_usage\"]. Names come from the outline an oversized page returns, or from openfda_describe_fields. Omit for the whole label — which returns the section outline instead when the page exceeds the inline size budget. Metadata (openfda, set_id, id, effective_time, version) is returned either way."New value: +"Label sections to return, e.g. [\"boxed_warning\",\"indications_and_usage\"]. Names come from the outline an oversized page returns, or from openfda_describe_fields. Omit for the whole label — which returns the section outline instead when the page exceeds the inline size budget. A selection is returned whole even when it exceeds that budget, with its serialized size reported on the notice; the outline names a section measured to fit at the requested limit. Metadata (openfda, set_id, id, effective_time, version) is returned either way and counts toward the size."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty or paging overshot — how to broaden filters or correct field names. Absent when results are returned."New value: +"Guidance for this page: how to broaden filters or correct field names when results are empty or paging overshot, the sized re-call example when a page overflowed to its section outline, section names no record carried, and the serialized size when a sections selection exceeds the inline budget. Absent when nothing needs saying."
    • Changedopenfda_lookup_ndc5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of records to return (1-1000, default 10)"New value: +"Maximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures. A record grows with its packaging list, so a product with many package configurations is several times the size of one with a single package."
      • changedOutput schema / properties / meta / properties / limit / description
        Previous value: -"Records returned"New value: +"Page size applied to this request — the requested limit, lowered to the records returned when the 24000-byte inline budget bounded the page (see page_omitted). Not a count of what arrived: a window running past the end of the matched set returns fewer records than this, so read the length of results for the actual count."
      • changedOutput schema / properties / notice / description
        Previous value: -"Canvas staging disclosure when the call staged, and guidance when results are empty — how to broaden filters or correct field names."New value: +"Canvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty — how to broaden filters or correct field names."
      • addedOutput schema / properties / page_bytes
        Added value: +{
        +  "description": "Serialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / page_omitted
        Added value: +{
        +  "description": "Records dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.",
        +  "type": "number"
        +}
    • Changedopenfda_search_adverse_events5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of records to return (1-1000, default 10)"New value: +"Maximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures. Drug reports are by far the largest — a single drug/event report averages tens of kilobytes where a food/event report is a few hundred bytes."
      • changedOutput schema / properties / meta / properties / limit / description
        Previous value: -"Records returned in this response"New value: +"Page size applied to this request — the requested limit, lowered to the records returned when the 24000-byte inline budget bounded the page (see page_omitted). Not a count of what arrived: a window running past the end of the matched set returns fewer records than this, so read the length of results for the actual count."
      • changedOutput schema / properties / notice / description
        Previous value: -"Canvas staging disclosure when the call staged, and guidance when results are empty or paging overshot — how to broaden filters or adjust the query."New value: +"Canvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty or paging overshot — how to broaden filters or adjust the query."
      • addedOutput schema / properties / page_bytes
        Added value: +{
        +  "description": "Serialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / page_omitted
        Added value: +{
        +  "description": "Records dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.",
        +  "type": "number"
        +}
    • Changedopenfda_search_animal_events5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of records to return (1-1000, default 10)"New value: +"Maximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures."
      • changedOutput schema / properties / meta / properties / limit / description
        Previous value: -"Records returned in this response"New value: +"Page size applied to this request — the requested limit, lowered to the records returned when the 24000-byte inline budget bounded the page (see page_omitted). Not a count of what arrived: a window running past the end of the matched set returns fewer records than this, so read the length of results for the actual count."
      • changedOutput schema / properties / notice / description
        Previous value: -"Canvas staging disclosure when the call staged, and guidance when results are empty or paging overshot — how to broaden filters or adjust the query."New value: +"Canvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty or paging overshot — how to broaden filters or adjust the query."
      • addedOutput schema / properties / page_bytes
        Added value: +{
        +  "description": "Serialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / page_omitted
        Added value: +{
        +  "description": "Records dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.",
        +  "type": "number"
        +}
    • Changedopenfda_search_device_clearances5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of records to return (1-1000)."New value: +"Maximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures. A 510(k) record carries a summary narrative and is several times the size of a PMA record."
      • changedOutput schema / properties / meta / properties / limit / description
        Previous value: -"Records returned"New value: +"Page size applied to this request — the requested limit, lowered to the records returned when the 24000-byte inline budget bounded the page (see page_omitted). Not a count of what arrived: a window running past the end of the matched set returns fewer records than this, so read the length of results for the actual count."
      • changedOutput schema / properties / notice / description
        Previous value: -"Canvas staging disclosure when the call staged, and guidance when results are empty — how to broaden filters or correct field names."New value: +"Canvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty — how to broaden filters or correct field names."
      • addedOutput schema / properties / page_bytes
        Added value: +{
        +  "description": "Serialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / page_omitted
        Added value: +{
        +  "description": "Records dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.",
        +  "type": "number"
        +}
    • Changedopenfda_search_drug_approvals5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of records to return (1-1000, default 10)"New value: +"Maximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures. A record carries its application's whole submission history, so a long-running application is an order of magnitude larger than a recent one."
      • changedOutput schema / properties / meta / properties / limit / description
        Previous value: -"Records returned"New value: +"Page size applied to this request — the requested limit, lowered to the records returned when the 24000-byte inline budget bounded the page (see page_omitted). Not a count of what arrived: a window running past the end of the matched set returns fewer records than this, so read the length of results for the actual count."
      • changedOutput schema / properties / notice / description
        Previous value: -"Canvas staging disclosure when the call staged, and guidance when results are empty — how to broaden filters or correct field names."New value: +"Canvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty — how to broaden filters or correct field names."
      • addedOutput schema / properties / page_bytes
        Added value: +{
        +  "description": "Serialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / page_omitted
        Added value: +{
        +  "description": "Records dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.",
        +  "type": "number"
        +}
    • Changedopenfda_search_drug_shortages5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of records to return (1-1000, default 10)"New value: +"Maximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures."
      • changedOutput schema / properties / meta / properties / limit / description
        Previous value: -"Records returned in this response"New value: +"Page size applied to this request — the requested limit, lowered to the records returned when the 24000-byte inline budget bounded the page (see page_omitted). Not a count of what arrived: a window running past the end of the matched set returns fewer records than this, so read the length of results for the actual count."
      • changedOutput schema / properties / notice / description
        Previous value: -"Canvas staging disclosure when the call staged, and guidance when results are empty — how to broaden filters or correct field names."New value: +"Canvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty — how to broaden filters or correct field names."
      • addedOutput schema / properties / page_bytes
        Added value: +{
        +  "description": "Serialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / page_omitted
        Added value: +{
        +  "description": "Records dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.",
        +  "type": "number"
        +}
    • Changedopenfda_search_recalls5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of records to return (1-1000)."New value: +"Maximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures. Device records are the largest here — a device enforcement or recall record runs several kilobytes where a drug or food enforcement record is around one."
      • changedOutput schema / properties / meta / properties / limit / description
        Previous value: -"Records returned"New value: +"Page size applied to this request — the requested limit, lowered to the records returned when the 24000-byte inline budget bounded the page (see page_omitted). Not a count of what arrived: a window running past the end of the matched set returns fewer records than this, so read the length of results for the actual count."
      • changedOutput schema / properties / notice / description
        Previous value: -"Canvas staging disclosure when the call staged, and guidance when results are empty — how to broaden filters or correct field names."New value: +"Canvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty — how to broaden filters or correct field names."
      • addedOutput schema / properties / page_bytes
        Added value: +{
        +  "description": "Serialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / page_omitted
        Added value: +{
        +  "description": "Records dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.",
        +  "type": "number"
        +}
    • Changedopenfda_search_tobacco_reports5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of records to return (1-1000, default 10)"New value: +"Maximum number of records to return (1-1000, default 10). Serialized record size varies by three orders of magnitude across openFDA endpoints, so the page is also bounded by a 24000-byte serialized budget: a page that would overrun it returns fewer records than requested and reports the cut on page_omitted. Whenever any record matched, at least one comes back, however large it measures."
      • changedOutput schema / properties / meta / properties / limit / description
        Previous value: -"Records returned in this response"New value: +"Page size applied to this request — the requested limit, lowered to the records returned when the 24000-byte inline budget bounded the page (see page_omitted). Not a count of what arrived: a window running past the end of the matched set returns fewer records than this, so read the length of results for the actual count."
      • changedOutput schema / properties / notice / description
        Previous value: -"Canvas staging disclosure when the call staged, and guidance when results are empty or paging overshot — how to broaden filters or adjust the query."New value: +"Canvas staging disclosure when the call staged, the byte-budget disclosure and the routes to the withheld records when the inline page was bounded, and guidance when results are empty or paging overshot — how to broaden filters or adjust the query."
      • addedOutput schema / properties / page_bytes
        Added value: +{
        +  "description": "Serialized size of results in this response, in bytes. Present only when the 24000-byte inline budget bounded the page; larger than the budget only when a single record exceeds it on its own.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / page_omitted
        Added value: +{
        +  "description": "Records dropped from the requested limit/skip window so the page fit the inline byte budget. Present only when the page was bounded. Read them by re-calling with skip advanced by the number of records returned, lower limit for a smaller page, or pass stage=true to query a bounded drain of the match with openfda_dataframe_query.",
        +  "type": "number"
        +}
  8. 10 tool updates
    • Changedopenfda_count_values1 field changed
      • changedInput schema / properties / search / description
        Previous value: -"Filter query to scope the count (e.g. patient.drug.medicinalproduct:\"metformin\"). Omit to count across every record in the endpoint."New value: +"Filter query to scope the count (e.g. patient.drug.medicinalproduct:\"metformin\"). Omit to count across every record in the endpoint. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request."
    • Changedopenfda_get_drug_label3 fields changed
      • changedInput schema / properties / search / description
        Previous value: -"Query targeting label fields. Examples: openfda.brand_name:\"aspirin\", openfda.generic_name:\"metformin\", openfda.manufacturer_name:\"pfizer\". For a specific revision, pass set_id with the SPL UUID returned in earlier results."New value: +"Query targeting label fields. Examples: openfda.brand_name:\"aspirin\", openfda.generic_name:\"metformin\", openfda.manufacturer_name:\"pfizer\". For a specific revision, pass set_id with the SPL UUID returned in earlier results. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort expression (field:asc or field:desc). Example: effective_time:desc. Invalid or non-sortable fields cause a query error — use a documented field name."New value: +"Sort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: effective_time:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name."
      • changedInput schema / properties / sort / pattern
        Previous value: -"\\S"New value: +"^ *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?(?: *, *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?)* *$"
    • Changedopenfda_lookup_ndc3 fields changed
      • changedInput schema / properties / search / description
        Previous value: -"openFDA search query. Examples: product_ndc:\"0363-0218\", brand_name:\"aspirin\", generic_name:\"metformin\", openfda.manufacturer_name:\"walgreen\", active_ingredients.name:\"ASPIRIN\""New value: +"openFDA search query. Examples: product_ndc:\"0363-0218\", brand_name:\"aspirin\", generic_name:\"metformin\", openfda.manufacturer_name:\"walgreen\", active_ingredients.name:\"ASPIRIN\". Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort expression (field:asc or field:desc). Example: listing_expiration_date:desc. Invalid or non-sortable fields cause a query error — use a documented field name."New value: +"Sort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: listing_expiration_date:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name."
      • changedInput schema / properties / sort / pattern
        Previous value: -"\\S"New value: +"^ *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?(?: *, *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?)* *$"
    • Changedopenfda_search_adverse_events3 fields changed
      • changedInput schema / properties / search / description
        Previous value: -"openFDA search query. Examples: patient.drug.medicinalproduct:\"aspirin\", patient.reaction.reactionmeddrapt:\"nausea\" AND serious:\"1\". Omit to browse recent."New value: +"openFDA search query. Examples: patient.drug.medicinalproduct:\"aspirin\", patient.reaction.reactionmeddrapt:\"nausea\" AND serious:\"1\". Omit to browse recent. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort expression (field:asc or field:desc). Sortable date fields are category-specific: drug → receivedate:desc (or receiptdate), food → date_created:desc (or date_started), device → date_received:desc (or date_of_event). A field from another category (e.g. receivedate on food or device) causes a query error — use the field for this category."New value: +"Sort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. Sortable date fields are category-specific: drug → receivedate:desc (or receiptdate), food → date_created:desc (or date_started), device → date_received:desc (or date_of_event). A field from another category (e.g. receivedate on food or device) causes a query error — use the field for this category."
      • changedInput schema / properties / sort / pattern
        Previous value: -"\\S"New value: +"^ *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?(?: *, *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?)* *$"
    • Changedopenfda_search_animal_events3 fields changed
      • changedInput schema / properties / search / description
        Previous value: -"openFDA search query using field:value syntax. Examples: animal.species:\"Dog\", drug.brand_name:\"Bravecto\", reaction.veddra_term_name:\"Vomiting\", serious_ae:\"true\". Omit to browse recent reports."New value: +"openFDA search query using field:value syntax. Examples: animal.species:\"Dog\", drug.brand_name:\"Bravecto\", reaction.veddra_term_name:\"Vomiting\", serious_ae:\"true\". Omit to browse recent reports. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort expression (field:asc or field:desc). Example: original_receive_date:desc. Invalid or non-sortable fields cause a query error — use a documented field name."New value: +"Sort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: original_receive_date:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name."
      • changedInput schema / properties / sort / pattern
        Previous value: -"\\S"New value: +"^ *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?(?: *, *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?)* *$"
    • Changedopenfda_search_device_clearances3 fields changed
      • changedInput schema / properties / search / description
        Previous value: -"openFDA search query. Examples: applicant:\"medtronic\", advisory_committee_description:\"cardiovascular\", product_code:\"DXN\", openfda.device_name:\"catheter\". Omit to browse recent."New value: +"openFDA search query. Examples: applicant:\"medtronic\", advisory_committee_description:\"cardiovascular\", product_code:\"DXN\", openfda.device_name:\"catheter\". Omit to browse recent. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort expression (field:asc or field:desc). Example: decision_date:desc. Invalid or non-sortable fields cause a query error — use a documented field name."New value: +"Sort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: decision_date:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name."
      • changedInput schema / properties / sort / pattern
        Previous value: -"\\S"New value: +"^ *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?(?: *, *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?)* *$"
    • Changedopenfda_search_drug_approvals3 fields changed
      • changedInput schema / properties / search / description
        Previous value: -"openFDA search query. Examples: openfda.brand_name:\"humira\", sponsor_name:\"PFIZER\", submissions.submission_type:\"ORIG\" AND submissions.review_priority:\"PRIORITY\". Exact quoted values can be case-sensitive on some fields — sponsor_name is stored uppercase, so use sponsor_name:\"PFIZER\" (a lowercase quoted value returns no matches). Omit to browse recent."New value: +"openFDA search query. Examples: openfda.brand_name:\"humira\", sponsor_name:\"PFIZER\", submissions.submission_type:\"ORIG\" AND submissions.review_priority:\"PRIORITY\". Exact quoted values can be case-sensitive on some fields — sponsor_name is stored uppercase, so use sponsor_name:\"PFIZER\" (a lowercase quoted value returns no matches). Omit to browse recent. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort expression (field:asc or field:desc). Example: submissions.submission_status_date:desc. Invalid or non-sortable fields cause a query error — use a documented field name."New value: +"Sort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: submissions.submission_status_date:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name."
      • changedInput schema / properties / sort / pattern
        Previous value: -"\\S"New value: +"^ *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?(?: *, *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?)* *$"
    • Changedopenfda_search_drug_shortages3 fields changed
      • changedInput schema / properties / search / description
        Previous value: -"openFDA search query using field:value syntax. Examples: status:\"Current\", therapeutic_category:\"Oncology\", generic_name:\"carboplatin\", company_name:\"pfizer\". Omit to browse all records. Call openfda_describe_fields({ endpoint: \"drug/shortages\" }) for the complete field list."New value: +"openFDA search query using field:value syntax. Examples: status:\"Current\", therapeutic_category:\"Oncology\", generic_name:\"carboplatin\", company_name:\"pfizer\". Omit to browse all records. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request. Call openfda_describe_fields({ endpoint: \"drug/shortages\" }) for the complete field list."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort expression (field:asc or field:desc). Example: update_date:desc. Invalid or non-sortable fields cause a query error — use a documented field name."New value: +"Sort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: update_date:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name."
      • changedInput schema / properties / sort / pattern
        Previous value: -"\\S"New value: +"^ *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?(?: *, *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?)* *$"
    • Changedopenfda_search_recalls3 fields changed
      • changedInput schema / properties / search / description
        Previous value: -"openFDA search query. Examples: classification:\"Class I\" (also \"Class II\" or \"Class III\"), recalling_firm:\"pfizer\", reason_for_recall:\"undeclared allergen\". Omit to browse recent."New value: +"openFDA search query. Examples: classification:\"Class I\" (also \"Class II\" or \"Class III\"), recalling_firm:\"pfizer\", reason_for_recall:\"undeclared allergen\". Omit to browse recent. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort expression (field:asc or field:desc). Example: report_date:desc. Invalid or non-sortable fields cause a query error — use a documented field name."New value: +"Sort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort (e.g. report_date:desc,status.exact:asc). Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name."
      • changedInput schema / properties / sort / pattern
        Previous value: -"\\S"New value: +"^ *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?(?: *, *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?)* *$"
    • Changedopenfda_search_tobacco_reports3 fields changed
      • changedInput schema / properties / search / description
        Previous value: -"openFDA search query using field:value syntax. Examples: tobacco_products:\"Electronic cigarette\", reported_health_problems:\"Seizure\", nonuser_affected:\"Yes\". Omit to browse recent reports."New value: +"openFDA search query using field:value syntax. Examples: tobacco_products:\"Electronic cigarette\", reported_health_problems:\"Seizure\", nonuser_affected:\"Yes\". Omit to browse recent reports. Double quotes, parentheses, and range brackets must balance, and the query must not end on a backslash — each is rejected before the request."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort expression (field:asc or field:desc). Example: date_submitted:desc. Invalid or non-sortable fields cause a query error — use a documented field name."New value: +"Sort expression — a field path optionally suffixed with :asc or :desc; comma-separate for multi-field sort. Example: date_submitted:desc. Field paths take only letters, digits, underscores, and dots; anything else is rejected before the request. A well-formed but non-sortable field still causes a query error — use a documented field name."
      • changedInput schema / properties / sort / pattern
        Previous value: -"\\S"New value: +"^ *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?(?: *, *[A-Za-z0-9_]+(?:\\.[A-Za-z0-9_]+)*(?::[^,:]*)?)* *$"
  9. 9 tool updates
    • Changedopenfda_get_drug_label7 fields changed
      • addedInput schema / properties / sections
        Added value: +{
        +  "description": "Label sections to return, e.g. [\"boxed_warning\",\"indications_and_usage\"]. Names come from the outline an oversized page returns, or from openfda_describe_fields. Omit for the whole label — which returns the section outline instead when the page exceeds the inline size budget. Metadata (openfda, set_id, id, effective_time, version) is returned either way.",
        +  "items": {
        +    "description": "A top-level label section name.",
        +    "minLength": 1,
        +    "pattern": "\\S",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / skip / description
        Previous value: -"Number of results to skip for pagination (0-25000). Default 0."New value: +"Number of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error."
      • removedInput schema / properties / skip / maximum
        Removed value: -25000
      • addedOutput schema / properties / kind
        Added value: +{
        +  "description": "Whether this response carries label records (\"full\") or only the section outline of a page too large to inline (\"outline\").",
        +  "enum": [
        +    "full",
        +    "outline"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / outline
        Added value: +{
        +  "description": "Section names available across the matched page and their serialized size, largest first. Present when kind is \"outline\" — pass names back in sections to retrieve them.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One retrievable label section and its serialized size.",
        +    "properties": {
        +      "bytes": {
        +        "description": "Serialized byte size of the section",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "name": {
        +        "description": "Section identifier — pass in `sections` to retrieve it",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "bytes"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / results / description
        Previous value: -"Drug label records. Each carries an openfda block (brand_name, generic_name, manufacturer_name, route) plus optional SPL sections like indications_and_usage, warnings, dosage_and_administration, contraindications, adverse_reactions; section presence varies per label."New value: +"Drug label records, present when kind is \"full\". Each carries an openfda block (brand_name, generic_name, manufacturer_name, route) plus optional SPL sections like indications_and_usage, warnings, dosage_and_administration, contraindications, adverse_reactions; section presence varies per label. Narrowed to the requested sections plus metadata when sections was supplied."
      • changedOutput schema / required
        Previous value: -[
        -  "meta",
        -  "results",
        -  "totalResults",
        -  "effectiveQuery"
        -]New value: +[
        +  "meta",
        +  "kind",
        +  "totalResults",
        +  "effectiveQuery"
        +]
    • Changedopenfda_lookup_ndc3 fields changed
      • changedInput schema / properties / skip / description
        Previous value: -"Number of records to skip for pagination (0-25000, default 0)"New value: +"Number of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error."
      • removedInput schema / properties / skip / maximum
        Removed value: -25000
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
    • Changedopenfda_search_adverse_events3 fields changed
      • changedInput schema / properties / skip / description
        Previous value: -"Number of records to skip for pagination (0-25000, default 0)"New value: +"Number of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error."
      • removedInput schema / properties / skip / maximum
        Removed value: -25000
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
    • Changedopenfda_search_animal_events3 fields changed
      • changedInput schema / properties / skip / description
        Previous value: -"Number of records to skip for pagination (0-25000, default 0)"New value: +"Number of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error."
      • removedInput schema / properties / skip / maximum
        Removed value: -25000
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
    • Changedopenfda_search_device_clearances3 fields changed
      • changedInput schema / properties / skip / description
        Previous value: -"Pagination offset (0-25000)."New value: +"Number of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error."
      • removedInput schema / properties / skip / maximum
        Removed value: -25000
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
    • Changedopenfda_search_drug_approvals3 fields changed
      • changedInput schema / properties / skip / description
        Previous value: -"Number of records to skip for pagination (0-25000, default 0)"New value: +"Number of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error."
      • removedInput schema / properties / skip / maximum
        Removed value: -25000
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
    • Changedopenfda_search_drug_shortages3 fields changed
      • changedInput schema / properties / skip / description
        Previous value: -"Number of records to skip for pagination (0-25000, default 0)"New value: +"Number of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error."
      • removedInput schema / properties / skip / maximum
        Removed value: -25000
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
    • Changedopenfda_search_recalls3 fields changed
      • changedInput schema / properties / skip / description
        Previous value: -"Pagination offset (0-25000)."New value: +"Number of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error."
      • removedInput schema / properties / skip / maximum
        Removed value: -25000
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
    • Changedopenfda_search_tobacco_reports3 fields changed
      • changedInput schema / properties / skip / description
        Previous value: -"Number of records to skip for pagination (0-25000, default 0)"New value: +"Number of records to skip for pagination (default 0). openFDA caps pagination at 25000 records; a higher value returns a pagination_limit_reached error."
      • removedInput schema / properties / skip / maximum
        Removed value: -25000
      • changedInput schema / properties / stage / description
        Previous value: -"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb."New value: +"Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Staging is for record-level SQL over a bounded slice; for a distribution over everything that matched, openfda_count_values aggregates server-side in one request. Requires CANVAS_PROVIDER_TYPE=duckdb."
  10. 10 tool updates
    • Changedopenfda_dataframe_describe1 field changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"Canvas ID from an openFDA search tool response."New value: +"Canvas ID from an openFDA search tool response (present when the search ran with stage=true)."
    • Changedopenfda_dataframe_query4 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"Canvas ID from an openFDA search tool response (the canvas_id field)."New value: +"Canvas ID from an openFDA search tool response (the canvas_id field, present when the search ran with stage=true)."
      • changedOutput schema / properties / row_count / description
        Previous value: -"Number of rows in this response."New value: +"Number of rows in this response. Equals the canvas row limit when truncated is true."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the result hit the canvas row limit and rows beyond it were dropped. Page the rest with ORDER BY plus LIMIT/OFFSET.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "rows",
        -  "row_count",
        -  "canvas_id"
        -]New value: +[
        +  "rows",
        +  "row_count",
        +  "truncated",
        +  "canvas_id"
        +]
    • Changedopenfda_lookup_ndc8 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Omit to start a fresh canvas; the response returns a new one when canvas is enabled. When canvas (CANVAS_PROVIDER_TYPE=duckdb) is enabled the full matched set is staged for SQL and limit/skip apply only to the inline path."New value: +"DataCanvas session id from a prior call. Passing one stages this lookup onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • addedInput schema / properties / stage
        Added value: +{
        +  "default": false,
        +  "description": "Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id for the staged result set. Present when canvas is enabled. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."New value: +"DataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the full staged result. Present when spilled=true; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty — how to broaden filters or correct field names. Absent when results are returned."New value: +"Canvas staging disclosure when the call staged, and guidance when results are empty — how to broaden filters or correct field names."
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when the full result set was staged on the canvas — use canvas_id with openfda_dataframe_query for SQL. False when it fit inline. Absent when canvas is disabled."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."
      • addedOutput schema / properties / staged_rows
        Added value: +{
        +  "description": "Rows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when more rows matched upstream than the 25000-row staging ceiling. Narrow the query (filters, date range) for a complete set."New value: +"True when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set."
    • Changedopenfda_search_adverse_events8 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Omit to start a fresh canvas; the response returns a new one when canvas is enabled. When canvas (CANVAS_PROVIDER_TYPE=duckdb) is enabled the full matched set is staged for SQL and limit/skip apply only to the inline path."New value: +"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • addedInput schema / properties / stage
        Added value: +{
        +  "default": false,
        +  "description": "Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id for the staged result set. Present when canvas is enabled. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."New value: +"DataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the full staged result. Present when spilled=true; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty or paging overshot — how to broaden filters or adjust the query. Absent when results are returned."New value: +"Canvas staging disclosure when the call staged, and guidance when results are empty or paging overshot — how to broaden filters or adjust the query."
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when the full result set was staged on the canvas — use canvas_id with openfda_dataframe_query for SQL. False when it fit inline. Absent when canvas is disabled."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."
      • addedOutput schema / properties / staged_rows
        Added value: +{
        +  "description": "Rows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when more rows matched upstream than the 25000-row staging ceiling. Narrow the query (filters, date range) for a complete set."New value: +"True when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set."
    • Changedopenfda_search_animal_events8 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Omit to start a fresh canvas; the response returns a new one when canvas is enabled. When canvas (CANVAS_PROVIDER_TYPE=duckdb) is enabled the full matched set is staged for SQL and limit/skip apply only to the inline path."New value: +"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • addedInput schema / properties / stage
        Added value: +{
        +  "default": false,
        +  "description": "Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id for the staged result set. Present when canvas is enabled. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."New value: +"DataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the full staged result. Present when spilled=true; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty or paging overshot — how to broaden filters or adjust the query. Absent when results are returned."New value: +"Canvas staging disclosure when the call staged, and guidance when results are empty or paging overshot — how to broaden filters or adjust the query."
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when the full result set was staged on the canvas — use canvas_id with openfda_dataframe_query for SQL. False when it fit inline. Absent when canvas is disabled."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."
      • addedOutput schema / properties / staged_rows
        Added value: +{
        +  "description": "Rows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when more rows matched upstream than the 25000-row staging ceiling. Narrow the query (filters, date range) for a complete set."New value: +"True when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set."
    • Changedopenfda_search_device_clearances8 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Omit to start a fresh canvas; the response returns a new one when canvas is enabled. When canvas (CANVAS_PROVIDER_TYPE=duckdb) is enabled the full matched set is staged for SQL and limit/skip apply only to the inline path."New value: +"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • addedInput schema / properties / stage
        Added value: +{
        +  "default": false,
        +  "description": "Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id for the staged result set. Present when canvas is enabled. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."New value: +"DataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the full staged result. Present when spilled=true; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty — how to broaden filters or correct field names. Absent when results are returned."New value: +"Canvas staging disclosure when the call staged, and guidance when results are empty — how to broaden filters or correct field names."
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when the full result set was staged on the canvas — use canvas_id with openfda_dataframe_query for SQL. False when it fit inline. Absent when canvas is disabled."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."
      • addedOutput schema / properties / staged_rows
        Added value: +{
        +  "description": "Rows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when more rows matched upstream than the 25000-row staging ceiling. Narrow the query (filters, date range) for a complete set."New value: +"True when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set."
    • Changedopenfda_search_drug_approvals8 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Omit to start a fresh canvas; the response returns a new one when canvas is enabled. When canvas (CANVAS_PROVIDER_TYPE=duckdb) is enabled the full matched set is staged for SQL and limit/skip apply only to the inline path."New value: +"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • addedInput schema / properties / stage
        Added value: +{
        +  "default": false,
        +  "description": "Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id for the staged result set. Present when canvas is enabled. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."New value: +"DataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the full staged result. Present when spilled=true; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty — how to broaden filters or correct field names. Absent when results are returned."New value: +"Canvas staging disclosure when the call staged, and guidance when results are empty — how to broaden filters or correct field names."
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when the full result set was staged on the canvas — use canvas_id with openfda_dataframe_query for SQL. False when it fit inline. Absent when canvas is disabled."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."
      • addedOutput schema / properties / staged_rows
        Added value: +{
        +  "description": "Rows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when more rows matched upstream than the 25000-row staging ceiling. Narrow the query (filters, date range) for a complete set."New value: +"True when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set."
    • Changedopenfda_search_drug_shortages8 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Omit to start a fresh canvas; the response returns a new one when canvas is enabled. When canvas (CANVAS_PROVIDER_TYPE=duckdb) is enabled the full matched set is staged for SQL and limit/skip apply only to the inline path."New value: +"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • addedInput schema / properties / stage
        Added value: +{
        +  "default": false,
        +  "description": "Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id for the staged result set. Present when canvas is enabled. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."New value: +"DataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the full staged result. Present when spilled=true; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty — how to broaden filters or correct field names. Absent when results are returned."New value: +"Canvas staging disclosure when the call staged, and guidance when results are empty — how to broaden filters or correct field names."
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when the full result set was staged on the canvas — use canvas_id with openfda_dataframe_query for SQL. False when it fit inline. Absent when canvas is disabled."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."
      • addedOutput schema / properties / staged_rows
        Added value: +{
        +  "description": "Rows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when more rows matched upstream than the 25000-row staging ceiling. Narrow the query (filters, date range) for a complete set."New value: +"True when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set."
    • Changedopenfda_search_recalls8 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Omit to start a fresh canvas; the response returns a new one when canvas is enabled. When canvas (CANVAS_PROVIDER_TYPE=duckdb) is enabled the full matched set is staged for SQL and limit/skip apply only to the inline path."New value: +"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • addedInput schema / properties / stage
        Added value: +{
        +  "default": false,
        +  "description": "Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id for the staged result set. Present when canvas is enabled. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."New value: +"DataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the full staged result. Present when spilled=true; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty — how to broaden filters or correct field names. Absent when results are returned."New value: +"Canvas staging disclosure when the call staged, and guidance when results are empty — how to broaden filters or correct field names."
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when the full result set was staged on the canvas — use canvas_id with openfda_dataframe_query for SQL. False when it fit inline. Absent when canvas is disabled."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."
      • addedOutput schema / properties / staged_rows
        Added value: +{
        +  "description": "Rows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when more rows matched upstream than the 25000-row staging ceiling. Narrow the query (filters, date range) for a complete set."New value: +"True when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set."
    • Changedopenfda_search_tobacco_reports8 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id from a prior call. Omit to start a fresh canvas; the response returns a new one when canvas is enabled. When canvas (CANVAS_PROVIDER_TYPE=duckdb) is enabled the full matched set is staged for SQL and limit/skip apply only to the inline path."New value: +"DataCanvas session id from a prior call. Passing one stages this search onto that canvas (same effect as stage=true) so result sets accumulate for cross-table joins. Omit to stage onto a fresh canvas."
      • addedInput schema / properties / stage
        Added value: +{
        +  "default": false,
        +  "description": "Stage the matched set on a DataCanvas for SQL analysis with openfda_dataframe_query. Default false — the call returns one page for one upstream request. When true, records are also drained onto a canvas table up to a size budget (staged_rows reports how many reached it). Requires CANVAS_PROVIDER_TYPE=duckdb.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session id for the staged result set. Present when canvas is enabled. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."New value: +"DataCanvas session id for the staged result set. Present when this call staged. Pass to openfda_dataframe_query / openfda_dataframe_describe, or back into this tool to accumulate more tables on the same canvas."
      • changedOutput schema / properties / canvas_table / description
        Previous value: -"Canvas table holding the full staged result. Present when spilled=true; reference it in SQL FROM clauses."New value: +"Canvas table holding the staged rows. Present when rows were staged; reference it in SQL FROM clauses."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty or paging overshot — how to broaden filters or adjust the query. Absent when results are returned."New value: +"Canvas staging disclosure when the call staged, and guidance when results are empty or paging overshot — how to broaden filters or adjust the query."
      • changedOutput schema / properties / spilled / description
        Previous value: -"True when the full result set was staged on the canvas — use canvas_id with openfda_dataframe_query for SQL. False when it fit inline. Absent when canvas is disabled."New value: +"True when this call staged its matched set on the canvas — use canvas_id with openfda_dataframe_query for SQL. Absent when staging was not requested."
      • addedOutput schema / properties / staged_rows
        Added value: +{
        +  "description": "Rows written to the canvas table. Compare with meta.total: a smaller value means staging stopped at its size budget and the table holds only the first staged_rows records.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when more rows matched upstream than the 25000-row staging ceiling. Narrow the query (filters, date range) for a complete set."New value: +"True when fewer rows reached the canvas than matched upstream — staging stopped at its size budget or openFDA's 25000-row pagination ceiling. Narrow the query (filters, date range) for a complete set."
  11. 13 tool updates
    • Changedopenfda_count_values6 fields changed
      • changedInput schema / properties / count / description
        Previous value: -"Field to count. Append .exact for whole-phrase counting (e.g. \"patient.reaction.reactionmeddrapt.exact\", \"openfda.brand_name.exact\")"New value: +"Field to count. Append .exact for whole-phrase counting of free-text fields (e.g. \"patient.reaction.reactionmeddrapt.exact\"). Identifier fields openFDA already indexes as keywords (product_ndc, application_number, pma_number) must be counted bare — .exact on those is rejected as not countable."
      • addedInput schema / properties / count / minLength
        Added value: +1
      • addedInput schema / properties / count / pattern
        Added value: +"\\S"
      • changedInput schema / properties / search / description
        Previous value: -"Filter query to scope the count (e.g. patient.drug.medicinalproduct:\"metformin\")"New value: +"Filter query to scope the count (e.g. patient.drug.medicinalproduct:\"metformin\"). Omit to count across every record in the endpoint."
      • addedInput schema / properties / search / minLength
        Added value: +1
      • addedInput schema / properties / search / pattern
        Added value: +"\\S"
    • Changedopenfda_dataframe_describe2 fields changed
      • addedInput schema / properties / canvas_id / minLength
        Added value: +1
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"\\S"
    • Changedopenfda_dataframe_query4 fields changed
      • addedInput schema / properties / canvas_id / minLength
        Added value: +1
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"\\S"
      • addedInput schema / properties / query / minLength
        Added value: +1
      • addedInput schema / properties / query / pattern
        Added value: +"\\S"
    • Changedopenfda_drug_profile3 fields changed
      • addedInput schema / properties / drug / pattern
        Added value: +"\\S"
      • addedOutput schema / properties / degraded
        Added value: +{
        +  "description": "Sub-queries that failed upstream, empty when every section resolved. A section listed here is unknown, not absent — a null section with no entry here genuinely has no FDA record.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One failed sub-query and why it failed.",
        +    "properties": {
        +      "message": {
        +        "description": "Upstream failure message for this section, truncated.",
        +        "type": "string"
        +      },
        +      "reason": {
        +        "description": "Machine-readable failure reason (e.g. rate_limited, upstream_error, query_error).",
        +        "type": "string"
        +      },
        +      "section": {
        +        "description": "Profile section whose sub-query failed.",
        +        "enum": [
        +          "identity",
        +          "label",
        +          "adverse_events",
        +          "recalls",
        +          "approval",
        +          "shortage"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "section",
        +      "reason",
        +      "message"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "meta",
        -  "identity",
        -  "label",
        -  "adverse_events",
        -  "recalls",
        -  "approval",
        -  "shortage",
        -  "sectionsFound"
        -]New value: +[
        +  "meta",
        +  "identity",
        +  "label",
        +  "adverse_events",
        +  "recalls",
        +  "approval",
        +  "shortage",
        +  "degraded",
        +  "sectionsFound"
        +]
    • Changedopenfda_get_drug_label4 fields changed
      • addedInput schema / properties / search / minLength
        Added value: +1
      • addedInput schema / properties / search / pattern
        Added value: +"\\S"
      • addedInput schema / properties / sort / minLength
        Added value: +1
      • addedInput schema / properties / sort / pattern
        Added value: +"\\S"
    • Changedopenfda_lookup_ndc6 fields changed
      • addedInput schema / properties / canvas_id / minLength
        Added value: +1
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"\\S"
      • addedInput schema / properties / search / minLength
        Added value: +1
      • addedInput schema / properties / search / pattern
        Added value: +"\\S"
      • addedInput schema / properties / sort / minLength
        Added value: +1
      • addedInput schema / properties / sort / pattern
        Added value: +"\\S"
    • Changedopenfda_search_adverse_events6 fields changed
      • addedInput schema / properties / canvas_id / minLength
        Added value: +1
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"\\S"
      • addedInput schema / properties / search / minLength
        Added value: +1
      • addedInput schema / properties / search / pattern
        Added value: +"\\S"
      • addedInput schema / properties / sort / minLength
        Added value: +1
      • addedInput schema / properties / sort / pattern
        Added value: +"\\S"
    • Changedopenfda_search_animal_events6 fields changed
      • addedInput schema / properties / canvas_id / minLength
        Added value: +1
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"\\S"
      • addedInput schema / properties / search / minLength
        Added value: +1
      • addedInput schema / properties / search / pattern
        Added value: +"\\S"
      • addedInput schema / properties / sort / minLength
        Added value: +1
      • addedInput schema / properties / sort / pattern
        Added value: +"\\S"
    • Changedopenfda_search_device_clearances6 fields changed
      • addedInput schema / properties / canvas_id / minLength
        Added value: +1
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"\\S"
      • addedInput schema / properties / search / minLength
        Added value: +1
      • addedInput schema / properties / search / pattern
        Added value: +"\\S"
      • addedInput schema / properties / sort / minLength
        Added value: +1
      • addedInput schema / properties / sort / pattern
        Added value: +"\\S"
    • Changedopenfda_search_drug_approvals6 fields changed
      • addedInput schema / properties / canvas_id / minLength
        Added value: +1
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"\\S"
      • addedInput schema / properties / search / minLength
        Added value: +1
      • addedInput schema / properties / search / pattern
        Added value: +"\\S"
      • addedInput schema / properties / sort / minLength
        Added value: +1
      • addedInput schema / properties / sort / pattern
        Added value: +"\\S"
    • Changedopenfda_search_drug_shortages6 fields changed
      • addedInput schema / properties / canvas_id / minLength
        Added value: +1
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"\\S"
      • addedInput schema / properties / search / minLength
        Added value: +1
      • addedInput schema / properties / search / pattern
        Added value: +"\\S"
      • addedInput schema / properties / sort / minLength
        Added value: +1
      • addedInput schema / properties / sort / pattern
        Added value: +"\\S"
    • Changedopenfda_search_recalls7 fields changed
      • addedInput schema / properties / canvas_id / minLength
        Added value: +1
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"\\S"
      • changedInput schema / properties / search / description
        Previous value: -"openFDA search query. Examples: classification:\"Class I\" (also \"Class II\" or \"Class III\"), recalling_firm:\"pfizer\", reason_for_recall:\"undeclared allergen\"."New value: +"openFDA search query. Examples: classification:\"Class I\" (also \"Class II\" or \"Class III\"), recalling_firm:\"pfizer\", reason_for_recall:\"undeclared allergen\". Omit to browse recent."
      • addedInput schema / properties / search / minLength
        Added value: +1
      • addedInput schema / properties / search / pattern
        Added value: +"\\S"
      • addedInput schema / properties / sort / minLength
        Added value: +1
      • addedInput schema / properties / sort / pattern
        Added value: +"\\S"
    • Changedopenfda_search_tobacco_reports6 fields changed
      • addedInput schema / properties / canvas_id / minLength
        Added value: +1
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"\\S"
      • addedInput schema / properties / search / minLength
        Added value: +1
      • addedInput schema / properties / search / pattern
        Added value: +"\\S"
      • addedInput schema / properties / sort / minLength
        Added value: +1
      • addedInput schema / properties / sort / pattern
        Added value: +"\\S"
  12. 2 tool updates
    • Changedopenfda_search_adverse_events1 field changed
      • changedInput schema / properties / sort / description
        Previous value: -"Sort expression (field:asc or field:desc). Example: receivedate:desc. Invalid or non-sortable fields cause a query error — use a documented field name."New value: +"Sort expression (field:asc or field:desc). Sortable date fields are category-specific: drug → receivedate:desc (or receiptdate), food → date_created:desc (or date_started), device → date_received:desc (or date_of_event). A field from another category (e.g. receivedate on food or device) causes a query error — use the field for this category."
    • Changedopenfda_search_drug_approvals1 field changed
      • changedInput schema / properties / search / description
        Previous value: -"openFDA search query. Examples: openfda.brand_name:\"humira\", sponsor_name:\"pfizer\", submissions.submission_type:\"ORIG\" AND submissions.review_priority:\"PRIORITY\". Omit to browse recent."New value: +"openFDA search query. Examples: openfda.brand_name:\"humira\", sponsor_name:\"PFIZER\", submissions.submission_type:\"ORIG\" AND submissions.review_priority:\"PRIORITY\". Exact quoted values can be case-sensitive on some fields — sponsor_name is stored uppercase, so use sponsor_name:\"PFIZER\" (a lowercase quoted value returns no matches). Omit to browse recent."
  13. 2 tool updates
    • Changedopenfda_describe_fields1 field changed
      • changedInput schema / properties / endpoint / enum
        Previous value: -[
        -  "drug/event",
        -  "drug/label",
        -  "drug/enforcement",
        -  "drug/ndc",
        -  "drug/drugsfda",
        -  "drug/shortages",
        -  "food/event",
        -  "food/enforcement",
        -  "device/event",
        -  "device/510k",
        -  "device/pma",
        -  "device/recall",
        -  "device/enforcement",
        -  "animalandveterinary/event",
        -  "tobacco/problem"
        -]New value: +[
        +  "drug/event",
        +  "drug/label",
        +  "drug/enforcement",
        +  "drug/ndc",
        +  "drug/drugsfda",
        +  "drug/shortages",
        +  "food/event",
        +  "food/enforcement",
        +  "device/event",
        +  "device/510k",
        +  "device/pma",
        +  "device/recall",
        +  "device/enforcement",
        +  "device/classification",
        +  "device/registrationlisting",
        +  "device/udi",
        +  "device/covid19serology",
        +  "animalandveterinary/event",
        +  "tobacco/problem",
        +  "other/substance"
        +]
    • Changedopenfda_drug_profile1 field changed
      • changedOutput schema / properties / label / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "dosage": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Dosage and administration (truncated)."
        -      },
        -      "indications": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Indications and usage (truncated)."
        -      },
        -      "warnings": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Warnings (truncated)."
        -      }
        -    },
        -    "required": [
        -      "indications",
        -      "warnings",
        -      "dosage"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "dosage": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Dosage and administration (truncated)."
        +      },
        +      "indications": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Indications and usage (truncated)."
        +      },
        +      "warnings": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Warnings (truncated) — boxed warning or warnings_and_cautions for Rx labels, falling back to the OTC-monograph warnings section."
        +      }
        +    },
        +    "required": [
        +      "indications",
        +      "warnings",
        +      "dosage"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  14. 2 tool updates
    • Changedopenfda_count_values4 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The limit applied to the term list.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of terms returned in this response.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the term list was capped at the limit — more distinct terms may exist.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / truncationCeiling
        Added value: +{
        +  "description": "Count of the lowest-ranked term returned — omitted terms fall at or below it.",
        +  "type": "number"
        +}
    • Changedopenfda_get_drug_label3 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The limit applied to this page.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of labels returned in this response.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when more labels matched than this page returned — page with skip for the rest.",
        +  "type": "boolean"
        +}

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Query FEMA disaster declarations, public assistance grants, housing aid, and NFIP flood insurance claims via MCP. Supports STDIO and Streamable HTTP.
    83 npm
    1
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    Enables querying the openFDA drug adverse event database for pharmacovigilance work-ups: case searches, counts and demographic/outcome breakdowns, disproportionality measures (ROR/PRR with Mantel-Haenszel adjustment), and empirical Bayes (MGPS/EBGM) signal scores, including bulk screening and stratification by sex, age, or year alongside confounder-adjusted analyses.
    15
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.