Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Retrieve and interpret post-market safety records across **every FDA-regulated
.claude/skills/tooluniverse-product-safety-surveillance/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | — | — |
| case-05 | ✗→✓ | ▲ Improved | — | — |
| case-12 | ✗→✗ | = Same ✗ | — | — |
| case-13 | ✗→✗ | = Same ✗ | — | — |
| case-10 | ✗→✗ | = Same ✗ | — | — |
Retrieve and interpret post-market safety records across every FDA-regulated product class except drug-AE signal mining: medical devices, food / dietary supplements / cosmetics, veterinary drugs, and drug supply (shortages), plus cross-product enforcement/recall reports.
KEY PRINCIPLES
field:value terms; combine with a space-separated AND. Phrases and special characters need care (see Query Grammar).total hit count from meta.results.total.tooluniverse-pharmacovigilance / tooluniverse-adverse-event-detection.USE for:
DO NOT USE for (point elsewhere):
tooluniverse-pharmacovigilance or tooluniverse-adverse-event-detectionThis skill retrieves and interprets multi-product safety records. It does not compute drug-AE signal statistics.
| Product class | Question | Tool | openFDA endpoint | |---|---|---|---| | Device | Adverse events / malfunctions / deaths (MAUDE) | OpenFDA_search_device_adverse_events | /device/event.json | | Device | Recalls | OpenFDA_search_device_recalls | /device/recall.json | | Device | Enforcement / recall reports | OpenFDA_search_device_enforcement | /device/enforcement.json | | Device | 510(k) clearances (context) | OpenFDA_search_device_510k | /device/510k.json | | Device | Unique Device Identifier (UDI) lookup | OpenFDADevice_search_udi | -- | | Device | US regulatory class (1/2/3) | OpenFDADevice_get_classification | -- | | Device | Premarket Approval (PMA, Class 3 devices) | OpenFDADevice_search_pma | -- | | Food/supplement/cosmetic | Adverse events (CAERS) | OpenFDA_search_food_adverse_events | /food/event.json | | Food | Enforcement / recall reports | OpenFDA_search_food_enforcement | /food/enforcement.json | | Veterinary | Animal drug adverse events | OpenFDA_search_animalvet_adverse_events | /animalandveterinary/event.json | | Drug supply | Shortages | OpenFDA_search_drug_shortages | /drug/shortages.json | | Drug | Enforcement / recall reports | OpenFDA_search_drug_enforcement | /drug/enforcement.json | | Drug | Adverse events (raw FAERS records) | OpenFDA_search_drug_events | /drug/event.json | | Drug | Labels | OpenFDA_search_drug_labels | /drug/label.json |
All tools take a Lucene search string plus optional limit and skip. All are keyless and verified live.
Note: OpenFDADevice_search_recalls/_search_adverse_events/_search_510k return the same underlying openFDA data as OpenFDA_search_device_recalls/_device_adverse_events/_device_510k above (two independently-added wrappers over the same endpoints) — either works, no need to call both. Use whichever is already in your loaded toolset; the OpenFDADevice_* family additionally has the three UDI/classification/PMA tools with no equivalent in the other family.
field:value (e.g. event_type:Death, status:Current).device.generic_name:pacemaker, products.industry_name:Cosmetics, animal.species:Dog, reaction.veddra_term_name:Vomiting, drug.active_ingredients.name:carprofen.AND (verified working): device.generic_name:pacemaker AND event_type:Death.+AND+ — the +-joined boolean form errors through these tools. Use a literal space around AND.+ only for adjacency within a single field value (e.g. device.generic_name:infusion+pump). This is matched as tokens, not an exact phrase.(, ), /, leading +) inside values — they break the query. Pick a simpler token (e.g. products.industry_name:Dietary instead of the full Dietary Conventional Foods/Meal Replacements).YYYYMMDD (e.g. date_received); recalls/enforcement use YYYY-MM-DD (e.g. event_date_initiated, recall_initiation_date).{status:"success", data:{meta:{results:{total, skip, limit}}, results:[...]}}. Read the hit count from data.meta.results.total.&count=<field>; these TU wrappers center on search. To rank terms, retrieve a batch (e.g. limit:100) and tally the field yourself in Python./device/event.json)| Field | Meaning | |---|---| | event_type | Death, Injury, Malfunction, or No answer provided. Death/Injury = patient harm; Malfunction = device failure without (reported) harm. | | device[].generic_name / device[].brand_name | Device category / trade name. | | device[].manufacturer_d_name | Device manufacturer. | | patient[] | Patient-level outcome data (may be sparse). | | mdr_text[].text | Narrative; text_type_code distinguishes event description vs manufacturer narrative. | | report_number | MAUDE report id. Duplicate / follow-up reports of the same event are common — do not count reports as distinct events. | | date_received | YYYYMMDD FDA received date. |
/device/recall.json)| Field | Meaning | |---|---| | product_description | What was recalled. | | recalling_firm | Firm issuing the recall. | | recall_status | e.g. Open, Terminated. Terminated = FDA closed the action. | | product_code | FDA device product code. | | k_numbers[] | Associated 510(k) clearance numbers. | | root_cause_description | FDA root-cause category (e.g. Labeling design). | | event_date_initiated | YYYY-MM-DD recall start. |
/.../enforcement.json)| Field | Meaning | |---|---| | classification | Recall severity: Class I (serious/fatal hazard), Class II (temporary/reversible), Class III (unlikely to cause harm). | | status | Ongoing / Terminated / Completed. | | reason_for_recall | Why recalled. | | product_description | Recalled product. | | recalling_firm | Firm. |
/food/event.json)| Field | Meaning | |---|---| | reactions[] | MedDRA reaction terms (British spelling, e.g. Diarrhoea, Nausea). | | outcomes[] | e.g. Hospitalization, Life Threatening, Disability, Death, Other Serious or Important Medical Event, Visited an ER. | | products[].industry_name | Product category (Cosmetics, Dietary Conventional Foods/Meal Replacements, Milk/Butter/Dried Milk Prod, …). | | products[].role | SUSPECT (implicated) vs CONCOMITANT (also consumed). | | products[].name_brand | Brand name. | | consumer | age, gender of the consumer (often sparse). |
/animalandveterinary/event.json)| Field | Meaning | |---|---| | animal.species | Dog, Cat, Horse, … | | animal.gender | Animal sex. | | number_of_animals_affected | Count in the report. | | reaction[].veddra_term_name | VeDDRA clinical sign (e.g. Vomiting, Diarrhoea). | | drug[].brand_name / drug[].active_ingredients[].name | Implicated product / active. | | drug[].used_according_to_label / off_label_use | Label vs off-label use. |
/drug/shortages.json)| Field | Meaning | |---|---| | status | Current or Resolved. | | availability | e.g. Unavailable, Limited. | | generic_name | Drug in shortage. | | shortage_reason | e.g. Delay in shipping of the drug, Demand increase for the drug. | | dosage_form | e.g. Injection, Tablet. | | therapeutic_category[] | Clinical category. | | company_name | Manufacturer. | | update_type / initial_posting_date / update_date | Posting metadata. |
AND for combinations). Keep values simple; avoid special characters.data.meta.results.total and data.results[].event_type:Death; enforcement classification:Class I; CAERS outcomes:Death/Hospitalization; shortage status:Current.limit:100 and tally in Python (no count aggregation in these wrappers).> "Are there any reported deaths in adverse-event reports for pacemakers?"
OpenFDA_search_device_adverse_events {"search":"device.generic_name:pacemaker AND event_type:Death","limit":1}Real output (abbrev): status:success, meta.results.total = 16619; first record event_type = Death, device.generic_name = DEFIBRILLATOR/PACEMAKER. Interpretation: 16,619 MAUDE reports match a pacemaker device with a Death event type. These are spontaneous reports — duplicates likely, and "Death" means a death was reported in temporal association, not that the device caused it.
> "What device recalls has Medtronic Navigation issued?"
OpenFDA_search_device_recalls {"search":"recalling_firm:Medtronic","limit":1}Real output (abbrev): total = 1896; first record recall_status = Terminated, product_code = HAW, root_cause_description = Labeling design, k_numbers = ["K990214"], event_date_initiated = 2011-01-20, product_description = a tactile probe for spine surgery. Interpretation: 1,896 recall records match firms containing "Medtronic". recall_status: Terminated means FDA has closed this action; the root cause was a labeling-design issue.
> "Is ketorolac injection in shortage right now?"
OpenFDA_search_drug_shortages {"search":"dosage_form:Injection AND status:Current","limit":1}Real output (abbrev): total = 799; first record generic_name = Ketorolac Tromethamine Injection, status = Current, shortage_reason = Delay in shipping of the drug, availability = Unavailable, company_name = Fresenius Kabi USA, LLC. Interpretation: 799 current shortage records are injectables; ketorolac tromethamine injection is currently in shortage (status Current, availability Unavailable) due to a shipping delay.
> "Are there CAERS adverse-event reports implicating cosmetics?"
OpenFDA_search_food_adverse_events {"search":"products.industry_name:Cosmetics","limit":1}Real output (abbrev): total = 52214; first record products[].industry_name = Cosmetics, products[].role = SUSPECT, outcomes = ["Hospitalization","Other Serious or Important Medical Event"]. Interpretation: 52,214 CAERS reports name a cosmetic product as SUSPECT. CAERS is voluntary; a SUSPECT role reflects the reporter's attribution, not a verified causal link.
> "What adverse events are reported for carprofen in dogs?"
OpenFDA_search_animalvet_adverse_events {"search":"drug.active_ingredients.name:carprofen AND animal.species:Dog","limit":1}Real output (abbrev): total = 46469; first record animal.species = Dog, reaction[].veddra_term_name includes Leucocytosis NOS, Neutrophilia, Depression, Elevated alanine aminotransferase (ALT). Interpretation: 46,469 veterinary reports match carprofen-containing products in dogs. VeDDRA terms describe reported clinical signs; counts reflect reporting, not incidence.
meta.results.total) are report counts, not incidence or rates. There is no exposure denominator, so you cannot compute risk.SUSPECT role is reporter attribution.tooluniverse-pharmacovigilance / tooluniverse-adverse-event-detection.meta.last_updated date; openFDA lags real-world events.See references/openfda_fields.md for the full per-endpoint field reference and additional query examples.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 3 counted toward the lift figure. The other 19 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +9 percentage points is the difference between those two pass rates over the 3 comparable cases. 7 cases got worse with the skill loaded, and they are included in that figure.
The publisher has shipped newer versions since this run, so these numbers describe v1, not the version currently listed.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.