Skip to main content
Glama

get_product_recalls

Read-only

Returns safety recalls from federal agencies — drug recalls (FDA), medical device recalls (FDA), food/dietary supplement recalls (FDA), consumer-product recalls (CPSC), and vehicle, equipment, tire and child-restraint recall campaigns (NHTSA, since 1966). Use this when the user asks about: recent recalls for a specific company or product, FDA Class I (most severe) recalls, food contamination recalls, drug shortages and recalls, vehicle recalls by make or model (e.g. all Ford F-150 recalls), or to add a 'product-safety event' flag to insider activity / 8-K filings / enforcement actions. Sources (filter via the source enum): fda_drug — openFDA /drug/enforcement.json. Drug recalls including prescription, OTC, biologics. Class I/II/III severity. fda_device — openFDA /device/enforcement.json. Medical device recalls (implants, diagnostics, equipment, software). Same classification scheme. fda_food — openFDA /food/enforcement.json. Food + dietary supplements. Pathogen contamination, allergen mislabeling, etc. cpsc — saferproducts.gov RestWebServices/Recall. Consumer-product recalls (clothing, electronics, toys, batteries, etc.). No severity classification; classification field is null. nhtsa — NHTSA recall campaigns from NHTSA's flat files, updated daily. One row per campaign (recall_number = NHTSA's campaign number, e.g. '26V652000'); recalling_firm = the manufacturer that filed the defect report; product_description = NHTSA's defect summary; reason_for_recall = its consequence; remedy and notes as NHTSA writes them. Consumer advisories first: do_not_drive (NHTSA advises owners not to drive the vehicle until it is repaired) and park_outside (park outside, away from structures: fire risk); null on campaigns that predate the advisories. product_quantity is NHTSA's potential units affected (null when not stated); vehicle_model_year_count is the number of distinct make/model/year combinations, not units. makes lists up to 20 makes ('+N more' beyond). A campaign's full vehicle list comes only with source=nhtsa + recall_number: vehicles (500 per page, by make / model / year), vehicles_total, and vehicles_next_cursor (pass it back as vehicles_cursor). classification and status are null (NHTSA uses neither). A campaign NHTSA's file stops listing keeps its row: nhtsa_listing says 'no longer listed by NHTSA' and nhtsa_unlisted_since is the date KeyVex first observed it missing (NHTSA publishes no removal date or reason); both are null while NHTSA lists it. Source: NHTSA Office of Defects Investigation; public domain (http://www.usa.gov/publicdomain/label/1.0/). Cross-source pairing pattern: Recall → 8-K Item 7.01/8.01: pair with get_material_events Recall → insider sells: pair with get_insider_transactions Recall → SEC/DOJ follow-on: pair with get_enforcement_actions Recall → company filings: pair with get_proxy_filings (DEF 14A risk factors) Each record is one recall. Identifier format: {source}-{recall_number} (e.g., 'fda_drug-D-1234-2026'). FDA classifications: Class I — serious adverse health consequence or death Class II — temporary or reversible health consequence Class III — unlikely to cause adverse health consequence Source freshness (per-source publication cadence, not KeyVex bug): CPSC publishes within ~1-2 days; recent data flows hourly-fresh. openFDA's snapshot updates every ~10-14 days, and each snapshot carries recall_initiation_date values that LAG the snapshot date by another 30-45 days (the time between FDA classifying a recall and openFDA exposing it). Net: FDA records in this collection typically run ~4-6 weeks behind real-world recall dates, while CPSC is current. A default desc-by-date sort therefore looks CPSC-heavy at the top even when FDA matters more for the query. Filter by source='fda_*' to see FDA-only and avoid the skew. Searching recalling_firm / product_description: case-insensitive; 4+ characters match anywhere, 1-3 characters match a whole word ('3M', 'GE'). A term of 3+ characters searches EVERY recall; a 1-2 character term searches only the newest 5,000 recalls the query's other filters select (the oldest, with sort_order=asc), and coverage_warning says so. Vehicle filters (vehicle_make, vehicle_model) match NHTSA campaigns only, through their vehicles: vehicle_make is the exact make, case- and space-insensitive ('ford' = 'FORD'); vehicle_model follows the search rule above (3+ characters search every campaign; 1-2 characters the newest 5,000). classification filter scope: 'classification' is an FDA-only field. CPSC and NHTSA records always have classification=null (neither uses the FDA severity scheme). Filtering by classification excludes ALL CPSC and NHTSA rows by definition. The query response surfaces this with a notice in coverage_warning when the filter is set.

Input Schema

NameRequiredDescriptionDefault
limitNoMaximum records to return. Default 50, max 500.
sinceNoISO date (YYYY-MM-DD). Only recalls whose recall_initiation_date is on or after this date.
untilNoISO date (YYYY-MM-DD). Only recalls whose recall_initiation_date is on or before this date.
sourceNoFilter to a single agency / category. Omit to see all sources combined.
statusNoExact match. Common values: 'Ongoing', 'Completed', 'Terminated', 'Recall Initiated'.
sort_byNoDefault: recall_initiation_date.
sort_orderNoDefault: desc (most recent first).
vehicle_makeNoNHTSA campaigns that name a vehicle of this make (e.g., 'Ford', 'Toyota'). Exact make, case- and space-insensitive. Matches NHTSA rows only.
recall_numberNoRecall identifier as filed (e.g., FDA 'D-1234-2026', NHTSA '26V652000'). Combine with source for direct doc lookup, fastest path; with source=nhtsa the answer also lists the campaign's vehicles.
vehicle_modelNoNHTSA campaigns that name a vehicle model containing this text (e.g., 'F-150', 'Camry'). Matches NHTSA rows only. Case-insensitive. 4+ characters match anywhere in the text; 1-3 characters match a whole word ('3M', 'GE', 'ABC'). A term of 3+ characters searches EVERY recall. A 1-2 character term searches only a window: the newest 5,000 recalls (the oldest, with sort_order=asc) that your other filters select (source, dates, classification, status, a 3+ character term); coverage_warning says so, and since/until move the window.
classificationNoFDA severity classification. Class I is most severe (death / serious harm). Ignored for CPSC records.
recalling_firmNoThe recalling firm's name (e.g., 'Pfizer', 'Abbott', 'Whole Foods'). Case-insensitive. 4+ characters match anywhere in the text; 1-3 characters match a whole word ('3M', 'GE', 'ABC'). A term of 3+ characters searches EVERY recall. A 1-2 character term searches only a window: the newest 5,000 recalls (the oldest, with sort_order=asc) that your other filters select (source, dates, classification, status, a 3+ character term); coverage_warning says so, and since/until move the window.
vehicles_cursorNoWith source=nhtsa + recall_number: the vehicles_next_cursor of the previous answer, for the campaign's next 500 vehicles.
product_descriptionNoThe product description (e.g., 'lithium', 'romaine', 'insulin pump'). Case-insensitive. 4+ characters match anywhere in the text; 1-3 characters match a whole word ('3M', 'GE', 'ABC'). A term of 3+ characters searches EVERY recall. A 1-2 character term searches only a window: the newest 5,000 recalls (the oldest, with sort_order=asc) that your other filters select (source, dates, classification, status, a 3+ character term); coverage_warning says so, and since/until move the window.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / recall_number / description
      Previous value: -"Recall identifier as filed (e.g., FDA 'D-1234-2026'). Combine with source for direct doc lookup, fastest path."New value: +"Recall identifier as filed (e.g., FDA 'D-1234-2026', NHTSA '26V652000'). Combine with source for direct doc lookup, fastest path; with source=nhtsa the answer also lists the campaign's vehicles."
    • changedInput schema / properties / source / description
      Previous value: -"Filter to a single agency / category. Omit to see all sources combined. 'nhtsa' is not covered: it returns an INVALID_PARAMETER error."New value: +"Filter to a single agency / category. Omit to see all sources combined."
    • changedInput schema / properties / vehicle_make / description
      Previous value: -"NOT COVERED: KeyVex does not serve NHTSA vehicle recalls yet, so this filter returns an INVALID_PARAMETER error rather than an empty list."New value: +"NHTSA campaigns that name a vehicle of this make (e.g., 'Ford', 'Toyota'). Exact make, case- and space-insensitive. Matches NHTSA rows only."
    • changedInput schema / properties / vehicle_model / description
      Previous value: -"NOT COVERED: KeyVex does not serve NHTSA vehicle recalls yet, so this filter returns an INVALID_PARAMETER error rather than an empty list."New value: +"NHTSA campaigns that name a vehicle model containing this text (e.g., 'F-150', 'Camry'). Matches NHTSA rows only. Case-insensitive. 4+ characters match anywhere in the text; 1-3 characters match a whole word ('3M', 'GE', 'ABC'). A term of 3+ characters searches EVERY recall. A 1-2 character term searches only a window: the newest 5,000 recalls (the oldest, with sort_order=asc) that your other filters select (source, dates, classification, status, a 3+ character term); coverage_warning says so, and since/until move the window."
    • addedInput schema / properties / vehicles_cursor
      Added value: +{
      +  "description": "With source=nhtsa + recall_number: the vehicles_next_cursor of the previous answer, for the campaign's next 500 vehicles.",
      +  "type": "string"
      +}
  2. Changed4 schema fields changed
    • changedInput schema / properties / product_description / description
      Previous value: -"Case-insensitive substring against the product description (e.g., 'lithium', 'romaine', 'insulin pump')."New value: +"The product description (e.g., 'lithium', 'romaine', 'insulin pump'). Case-insensitive. 4+ characters match anywhere in the text; 1-3 characters match a whole word ('3M', 'GE', 'ABC'). A term of 3+ characters searches EVERY recall. A 1-2 character term searches only a window: the newest 5,000 recalls (the oldest, with sort_order=asc) that your other filters select (source, dates, classification, status, a 3+ character term); coverage_warning says so, and since/until move the window."
    • changedInput schema / properties / recalling_firm / description
      Previous value: -"Case-insensitive substring against the recalling firm name (e.g., 'Pfizer', 'Abbott', 'Whole Foods')."New value: +"The recalling firm's name (e.g., 'Pfizer', 'Abbott', 'Whole Foods'). Case-insensitive. 4+ characters match anywhere in the text; 1-3 characters match a whole word ('3M', 'GE', 'ABC'). A term of 3+ characters searches EVERY recall. A 1-2 character term searches only a window: the newest 5,000 recalls (the oldest, with sort_order=asc) that your other filters select (source, dates, classification, status, a 3+ character term); coverage_warning says so, and since/until move the window."
    • changedInput schema / properties / vehicle_make / description
      Previous value: -"NOT COVERED: KeyVex holds no NHTSA vehicle recalls, so this filter returns an INVALID_PARAMETER error rather than an empty list."New value: +"NOT COVERED: KeyVex does not serve NHTSA vehicle recalls yet, so this filter returns an INVALID_PARAMETER error rather than an empty list."
    • changedInput schema / properties / vehicle_model / description
      Previous value: -"NOT COVERED: KeyVex holds no NHTSA vehicle recalls, so this filter returns an INVALID_PARAMETER error rather than an empty list."New value: +"NOT COVERED: KeyVex does not serve NHTSA vehicle recalls yet, so this filter returns an INVALID_PARAMETER error rather than an empty list."
  3. Changed6 schema fields changed
    • changedInput schema / properties / classification / description
      Previous value: -"FDA severity classification. Class I is most severe (death / serious harm). Ignored for NHTSA / CPSC records."New value: +"FDA severity classification. Class I is most severe (death / serious harm). Ignored for CPSC records."
    • changedInput schema / properties / product_description / description
      Previous value: -"Case-insensitive substring against the product description (e.g., 'lithium', 'romaine', 'airbag')."New value: +"Case-insensitive substring against the product description (e.g., 'lithium', 'romaine', 'insulin pump')."
    • changedInput schema / properties / recalling_firm / description
      Previous value: -"Case-insensitive substring against the recalling firm name (e.g., 'Pfizer', 'Toyota', 'Whole Foods')."New value: +"Case-insensitive substring against the recalling firm name (e.g., 'Pfizer', 'Abbott', 'Whole Foods')."
    • changedInput schema / properties / source / description
      Previous value: -"Filter to a single agency / category. Omit to see all sources combined."New value: +"Filter to a single agency / category. Omit to see all sources combined. 'nhtsa' is not covered: it returns an INVALID_PARAMETER error."
    • changedInput schema / properties / vehicle_make / description
      Previous value: -"NHTSA-only filter. Vehicle make, uppercase (e.g., 'TOYOTA', 'FORD'). Ignored for other sources."New value: +"NOT COVERED: KeyVex holds no NHTSA vehicle recalls, so this filter returns an INVALID_PARAMETER error rather than an empty list."
    • changedInput schema / properties / vehicle_model / description
      Previous value: -"NHTSA-only filter. Case-insensitive substring against vehicle model. Ignored for other sources."New value: +"NOT COVERED: KeyVex holds no NHTSA vehicle recalls, so this filter returns an INVALID_PARAMETER error rather than an empty list."
  4. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover only the safety profile (readOnly, openWorld, destructive=false), while the description adds substantial non-obvious behavior: per-source publication lag (FDA ~4-6 weeks behind, CPSC current), the NHTSA 'no longer listed' / nhtsa_unlisted_since semantics, null classification/status on non-FDA rows, and coverage_warning behavior. None of this is discoverable from annotations or schema.

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?

Purpose and usage are front-loaded, and the density of real information is high, but the block is very long and the search-window rule is restated in both the description and three schema fields. Trimming that redundancy would improve it without losing information.

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

Completeness5/5

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

For a 14-parameter, zero-required, multi-source tool with no output schema, the description supplies the identifier format ({source}-{recall_number}), the per-source field semantics, the pagination model, and freshness caveats — everything an agent needs to construct a correct call and interpret the result.

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

Parameters5/5

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

Schema coverage is 100%, so baseline is 3, but the description goes well beyond it: it explains the 1-2 vs 3+ character search-window rule, the exact-match semantics of vehicle_make, that vehicle_make/vehicle_model match NHTSA rows only, that classification filtering definitionally excludes all CPSC/NHTSA rows, and how vehicles_cursor paginates a campaign's 500-vehicle pages.

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

Purpose5/5

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

Opens with a specific verb+resource ('Returns safety recalls from federal agencies') and immediately enumerates the five covered sources with their agencies. It is clearly distinguishable from siblings like get_fda_approvals, get_drug_adverse_events, and get_consumer_complaints.

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 lists the user intents that select this tool (company/product recalls, Class I recalls, food contamination, drug shortages, vehicle recalls by make/model) and gives a cross-source pairing pattern routing to get_material_events, get_insider_transactions, get_enforcement_actions, and get_proxy_filings. It also tells the agent when to filter source='fda_*' to avoid CPSC skew.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources