Analyze NIH grant portfolios and funding history using the OpenNIH FY1985-present corpus, then connect grants to investigators, institutions, publications, clinical trials, patents, targets, or drugs with ToolUniverse. Use for NIH grant discovery, topic or Institute/Center trends, PI and institution profiles, activity-code or mechanism analysis, funding growth and concentration, grant-writing landscape research, SBIR/STTR landscapes, research-policy analysis, expert discovery, funding-to-output translational impact studies, or public-facing NIH explainers for patients, advocates, local and national journalists, trainees, applicants, institutions, entrepreneurs, and taxpayers.
80
100%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Build source-traceable NIH funding analyses with explicit scopes, count units, data coverage, and interpretation limits. Use OpenNIH_* for funding facts and other ToolUniverse sources only for downstream evidence they actually cover.
Always read references/tool-reference.md before choosing tools or comparing totals. Read references/verified-cases.md when testing the skill, debugging an unexpected response, or adapting one of the verified case patterns. Read references/public-value-cases.md for a patient, family, advocate, journalist, trainee, applicant, taxpayer, policy, or other public-facing request.
Start from the reader's decision, not from the available endpoints:
| Reader | Optimize the answer for | Never imply |
|---|---|---|
| Patient, family, advocate | A topic-specific research map, recent activity, inspectable projects, and next contacts | Clinical expertise, quality of care, treatment advice, or patient benefit from funding alone |
| Journalist, taxpayer, policy analyst | A reproducible headline number, its definition, its largest drivers, and its sensitivity to alternate queries | That the largest number is the truest, a partial year is final, or spending caused outcomes |
| Researcher, trainee, applicant | Funded precedents, active mechanisms, institutions, and project language | Application odds, reviewer preferences, mentorship quality, or K99-to-R00 conversion |
| Institution or translational team | Resolved peer portfolios and exact identifiers for output follow-up | Raw-name totals as one entity or grant-output chronology as causality |
| Local reporter or community | A location-qualified portfolio joined through resolved institutions | That an institution-name substring is a city/state geography query or that award location equals beneficiary location |
| Entrepreneur | Topic-specific R41/R42/R43/R44 awards, companies, and phase-labeled project activity | Commercial success, current company status, addressable market, or Phase I-to-II conversion from annual award rows |
For public output, give: (1) a one-sentence answer with window/surface/unit, (2) the records or outliers that drive it, (3) the material definition sensitivity, (4) what the evidence does not prove, and (5) a public link or stable-identifier next step. If an answer cannot change a reader's next action, narrow the question before adding more tables.
OpenNIH_source_status before a broad report, an absence claim, publication/detail linkage, or any current-year conclusion. Capture the main-corpus fiscal years, latest-year status, snapshot-lag note, and sidecar coverage relevant to the requested window.Choose the matching path:
OpenNIH_search_grants, then OpenNIH_topic_trend. Use OpenNIH_ic_topic_cross to measure the topic within one named IC or to inspect its RCDC/text classification. ic="ALL" returns one combined NIH scope, not a per-IC table. To rank ICs, fully paginate search_grants, choose all-mechanism or comparable=true RPG scope explicitly, group the returned ic field, and reconcile the pages before reporting.LAST, FIRST first. If a user supplies First Last and gets zero results, retry Last, First and surname-only. Collect every returned pi_profile_id; disambiguate candidates using full displayed name, institution, project title, IC, and fiscal year before calling OpenNIH_get_pi_profile. The same historical name and institution can still appear under multiple source profile IDs; inspect overlap and provenance rather than summing profiles.OpenNIH_rank_institutions and use its returned entity_id. Paginate the ranking if the requested institution is not on the first page. Never construct or guess an entity ID from a name, and never treat search_grants(institution=...) substring totals as one resolved entity without inspecting every matched org_name.OpenNIH_funding_trend, OpenNIH_activity_code_distribution, or single-year OpenNIH_institution_concentration snapshots.OpenNIH_search_grants(project_num=...), then OpenNIH_fetch for a citation-shaped record and public URL. NIHReporter_get_project/NIHReporter_search_projects (the live official NIH RePORTER API) is a simpler direct path for a single known project or a live full-text search, when the OpenNIH bulk-corpus machinery above is more than the question needs.institution= as a city/state filter. OpenNIH returns raw organization names but no location fields on grant rows; require a separately sourced institution-to-location crosswalk joined through resolved entities, or state that geographic attribution is unsupported.core_project_num when the question asks for distinct awards. A core number alone is not fetchable.ic_topic_cross selects RCDC, inspect every matched_rcdc_categories value. Generic words such as disease, disorder, syndrome, or research can make the matched-category list noisy. Rerun a distinctive seed such as Alzheimer instead of Alzheimer's Disease, and compare forced text versus rcdc when the conclusion depends on classification.matched_rcdc_categories, alternate_surface_grants, and no_match_note. A phrase such as health equity may have no exact official RCDC category while title text matches many awards; this is a controlled-vocabulary gap, not $0 or absence.PASC matched PASCALL and a surname; prefer a disease-specific phrase and deduplicate a multi-query union by stable award identifiers.meta.total <= 100050; limit is 50 and offset is capped at 100000. If the slice is larger, narrow it by fiscal year, exact IC/activity, or a more specific query, and aggregate reconciled partitions. For a retrievable slice, verify collected rows equal meta.total, the number of non-null amounts equals meta.reported_grant_count, and distinct non-null core IDs equal meta.distinct_awards. Sum dollars only when at least one amount is reported; when reported_grant_count=0, require meta.total_funding=null and report dollars as not reported, never $0.OpenNIH_search as citation discovery, not a record-level precision audit. Multi-component matches can be canonicalized to a parent project whose visible title/text omits the query terms. Validate the matching component with search_grants before using a citation-shaped hit as representative topical evidence.project_num values before reporting dollars or counts. Use meta.total > meta.unique_project_nums to detect repetition across the full slice even when the returned page shows each number only once. In a multi-component award, search_grants.meta.total_funding is a row sum and can contain both a parent amount and component allocations. If the component sum equals the parent, the row sum doubles unique-award dollars. Show the canonical parent amount and component allocation table separately; if the structure does not reconcile, withhold a unique-award total.get_institution_profile is a multi-scope container: mechanism_mix is the institution's all-mechanism portfolio, while funding_trend and top_pis are RPG-research only. Its sections share the requested window, not one funding scope.rank_institutions may roll up campus name families; profiles, mechanism mix, growth, and concentration use one canonical entity_id. Totals can differ even when labels look identical.rank_institutions, sort_by="funding_scale" means top-funded. The default composite is a weighted score; label it a composite ranking, not a funding ranking.rank_institutions can return positive funding and fully reported rows while search_grants, funding_trend, institution profile/growth, and concentration return null dollars for the same years. Treat that ranking-dollar surface as quarantined unless it reconciles at runtime; counts may still be described separately. Do not use its funding or composite order in a cross-endpoint historical conclusion.ic_topic_cross, total_grants is a count of distinct non-null core awards in the RPG-research slice, while total_funding is recorded nominal funding for that same slice. ic="ALL" combines all matched ICs and still returns top institutions, not an IC breakdown.mechanism_mix, share is a 0–1 fraction; render 0.528174 as 52.82%.funding_growth, yoy_growth_pct and cagr_pct are already percentages; render 3.9084 as 3.91%, not 390.84%. The response does not carry a partial field, so check the same years with funding_trend and exclude a partial endpoint from growth/CAGR interpretation.institution_concentration, gini and top5_share are 0–1 fractions, while hhi uses the 0–10,000 scale. Always report total_institutions and use like-for-like single-year snapshots.total_institutions=0. This means the metric is unavailable, not that concentration or funding is zero.topic_trend omits years with no matches and returns data=[] for a wholly unmatched window. Do not claim it zero-filled every requested year; distinguish “no matching rows in covered corpus years” from missing corpus coverage.meta.total_grants; the profile name may remain populated while funding and profile-level year fields are null. Use meta.fiscal_year_start/end for the requested window.get_pi_profile response does not expose a publications field, even when source_status reports the official publication source loaded. Missing is not zero; perform publication linking through PubMed/OpenAlex with exact identifiers or explicit author disambiguation.grant_count, active_grants, and total_funding are always row-level fields, not deduplicated award facts. When a full project number repeats, official parent amounts can be copied onto multiple component rows and inflate both counts and dollars. Reconcile distinct core awards through search_grants and canonical fetch before making award-level claims, even when the current profile page shows no duplicate.fetch returns one canonical row. If metadata.matching_rows > 1, its amount is neither the component sum nor a server-certified deduplicated award total; inspect all search_grants rows.official_detail_source_loaded=true does not mean the requested fiscal years have official detail rows. Check source_status sidecar-year coverage and the actual returned detail fields.award_amount = null as not reported, never zero. State the reported-dollar coverage when it materially affects a comparison.rank_institutions competitive RPG-research totals with funding_trend all-mechanism totals.distinct_awards for award counts and name the unit every time.partial=true. In particular, a latest-year shard or sidecar does not imply a complete fiscal year; inspect the returned row and source_status at analysis time.topic_trend as title-keyword evidence, not semantic classification. Multiword queries use AND logic. Test synonyms separately and show query sensitivity when conclusions depend on terminology.match_strategy, matched categories, and window coverage.no_match_note and alternate_surface_grants; use auto/text or a window reaching FY2008 before making an absence claim.ic_scope.kind, n, and matched_ic_names when filtering by IC. Historical labels may be modernized or many-to-one: a modern alias can select multiple raw labels, while a legacy abbreviation may resolve to zero. Do not reconstruct historical organizational ownership from display labels alone.ic_scope.kind="fragment", treat the result as an inspected multi-IC subset, not the named IC. A broad phrase such as National Institute reported n=26 while returning 25 matched-name entries and only 17 unique modernized display names in the verified case. Preserve all three quantities, flag any mismatch, and prefer an exact abbreviation or ALL; do not infer a precise IC count from the fragment response.source_status before saying a grant, PI, publication link, or fiscal-year record is absent. Say “not found in this snapshot/query” when corpus lag or sidecar gaps remain possible.org_name. Strings such as Massachusetts or Boston match names, not verified locations, and omit organizations whose names lack the place word.meta.total_grants; returned grants and collaborators, including explicit “none returned” and the collaborators' window-independent scope; duplicate full-number audit before using profile counts or dollars; publications reported as unavailable from this endpoint rather than zero.If the data cannot meet a minimum, keep the section and state the actual coverage and reason.
Use exact identifiers where available. Grade claims as:
A publication linked to an award is an attributed output, not proof that the award caused the result. A later trial, patent, or drug program requires independent identity and subject-matter confirmation. An exact grant-number link is stronger than a name/topic match, but it still establishes attribution rather than causality. A topical trial hit is X3 until an exact identifier or independently verified award acknowledgment is found.
For a funding-to-impact study, construct a compact evidence table with:
For broad analyses, return a narrative report with:
For a narrow lookup, answer directly and include only the necessary provenance and caveat. Prefer tables for repeated comparisons and concise prose for one finding.
Before returning, verify that:
ic_topic_cross(ic="ALL") as a ranking;n, matched-list length, and unique displayed names separately when they disagree;sort_by="funding_scale" rather than the composite default;164aaf1
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.