{
  "note": "Policy-driven biomedical evidence linter. The typed proposition contract returns ALLOW/REVIEW/BLOCK with exact evidence receipts; experimental free-text discovery is conservatively capped at REVIEW. No model is in the decision path. Load these as Anthropic tool-use tools; the server is `biosingularity-mcp` (stdio).",
  "tools": [
    {
      "name": "verify_proposition",
      "description": "Verify one TYPED biomedical proposition under a declared policy.\n\nThis is the automatable gate. Unlike verify_answer's heuristic free-text discovery, it can\nreturn recommendation=ALLOW when the predicate is registered, the subject resolves, and an\nexact evidence receipt supports the proposition. Unknown predicates and source failures return\nREVIEW; contradicted propositions return BLOCK.",
      "input_schema": {
        "properties": {
          "subject_type": {
            "title": "Subject Type",
            "type": "string"
          },
          "subject_id": {
            "title": "Subject Id",
            "type": "string"
          },
          "predicate": {
            "title": "Predicate",
            "type": "string"
          },
          "object_value": {
            "title": "Object Value",
            "type": "string"
          },
          "polarity": {
            "default": "affirmed",
            "title": "Polarity",
            "type": "string"
          },
          "policy": {
            "default": "research-ai-core/0.1",
            "title": "Policy",
            "type": "string"
          }
        },
        "required": [
          "subject_type",
          "subject_id",
          "predicate",
          "object_value"
        ],
        "title": "verify_propositionArguments",
        "type": "object"
      }
    },
    {
      "name": "search_evidence",
      "description": "Find candidate papers through the source-neutral evidence retrieval broker.\n\nDirect OpenAlex is the baseline and SemOpenAlex adds graph retrieval. A source timeout returns\nan explicit PARTIAL packet with fallback, not a false empty result. Records are deduplicated by\nDOI/OpenAlex id and preserve per-source provenance and rank explanations.\n\nDISCOVERY ONLY: candidates cannot decide a proposition or create ALLOW/BLOCK. An empty result\nis not negative evidence. ``sources`` is an optional comma-separated allow-list of\n``openalex_api,semopenalex``.",
      "input_schema": {
        "properties": {
          "proposition": {
            "title": "Proposition",
            "type": "string"
          },
          "limit": {
            "default": 20,
            "title": "Limit",
            "type": "integer"
          },
          "published_after": {
            "default": "",
            "title": "Published After",
            "type": "string"
          },
          "open_access": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Open Access"
          },
          "sources": {
            "default": "",
            "title": "Sources",
            "type": "string"
          }
        },
        "required": [
          "proposition"
        ],
        "title": "search_evidenceArguments",
        "type": "object"
      }
    },
    {
      "name": "expand_evidence_neighbourhood",
      "description": "Expand one bounded citation hop around an OpenAlex work id.\n\n``direction`` is ``references``, ``citations``, or ``both`` and the result is capped at 50.\nCitation edges are DISCOVERY context only: citation does not imply support, contradiction,\nquality, or a clean publication status.",
      "input_schema": {
        "properties": {
          "work_id": {
            "title": "Work Id",
            "type": "string"
          },
          "direction": {
            "default": "both",
            "title": "Direction",
            "type": "string"
          },
          "limit": {
            "default": 20,
            "title": "Limit",
            "type": "integer"
          },
          "sources": {
            "default": "",
            "title": "Sources",
            "type": "string"
          }
        },
        "required": [
          "work_id"
        ],
        "title": "expand_evidence_neighbourhoodArguments",
        "type": "object"
      }
    },
    {
      "name": "resolve_research_object",
      "description": "Resolve an exact DOI or OpenAlex work id to a provenance-stamped discovery record.\n\nResolution establishes identity only. It does not establish that the work supports a claim or\nis free of integrity issues.",
      "input_schema": {
        "properties": {
          "identifier": {
            "title": "Identifier",
            "type": "string"
          },
          "sources": {
            "default": "",
            "title": "Sources",
            "type": "string"
          }
        },
        "required": [
          "identifier"
        ],
        "title": "resolve_research_objectArguments",
        "type": "object"
      }
    },
    {
      "name": "evidence_context_markers",
      "description": "Return non-deciding OA, topic, citation, and retraction-screening context for a work.\n\nContext markers help a reviewer prioritise follow-up. In particular,\n``is_retracted_screening=false`` is never a clean-paper verdict.",
      "input_schema": {
        "properties": {
          "identifier": {
            "title": "Identifier",
            "type": "string"
          },
          "sources": {
            "default": "",
            "title": "Sources",
            "type": "string"
          }
        },
        "required": [
          "identifier"
        ],
        "title": "evidence_context_markersArguments",
        "type": "object"
      }
    },
    {
      "name": "search_literature",
      "description": "Retrieve candidate papers from SemOpenAlex for human/evidence-pipeline review.\n\nThis is DISCOVERY ONLY: matching titles or abstracts cannot return SUPPORTED/CONTRADICTED,\ncannot create an ALLOW, and an empty result is not negative evidence. The adapter owns a fixed\nescaped SPARQL template, caps results at 50, times out after five seconds, caches for 24 hours,\nand opens a circuit after repeated endpoint failures. It never automates the UniversalSearch UI.\n\n``published_after`` is optional YYYY-MM-DD. ``open_access`` currently fails closed until the\nproperty is validated against the configured SemOpenAlex snapshot.",
      "input_schema": {
        "properties": {
          "proposition": {
            "title": "Proposition",
            "type": "string"
          },
          "limit": {
            "default": 20,
            "title": "Limit",
            "type": "integer"
          },
          "published_after": {
            "default": "",
            "title": "Published After",
            "type": "string"
          },
          "open_access": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Open Access"
          }
        },
        "required": [
          "proposition"
        ],
        "title": "search_literatureArguments",
        "type": "object"
      }
    },
    {
      "name": "verify_answer",
      "description": "Discover and check bounded propositions in a free-text biomedical answer.\n\nFinds the checkable parts of the text (cited DOIs, gene/drug/disease claims), verifies each, and\nreturns a unified REVIEW/REJECT verdict with receipts. Free-text extraction is experimental and\ncannot return PASS; use verify_proposition for an automatable typed ALLOW/BLOCK decision.",
      "input_schema": {
        "properties": {
          "answer": {
            "title": "Answer",
            "type": "string"
          }
        },
        "required": [
          "answer"
        ],
        "title": "verify_answerArguments",
        "type": "object"
      }
    },
    {
      "name": "repair_answer",
      "description": "Ground an answer, apply deterministic subtractive edits, then re-verify.\n\nCall this when verify_answer returns recommend='reject' or 'review' and you need an answer to\nsend rather than a retry. Applies only the deterministic remediations: retracted citations are\nDELETED, contradicted sentences are STRUCK, and sourced safety warnings are APPENDED. It NEVER\nrewrites a claim into a new assertion, so a repair cannot introduce a new falsehood \u2014 anything\nthat would need rewriting (softening a claim, citing a missing source) comes back in `residual`\nfor you to handle.\n\nReturns ship_status as SHIP, REVIEW_REQUIRED, or DO_NOT_SHIP. ``safe_to_ship`` is a deprecated\ncompatibility alias; free-text repairs normally remain REVIEW_REQUIRED.",
      "input_schema": {
        "properties": {
          "answer": {
            "title": "Answer",
            "type": "string"
          }
        },
        "required": [
          "answer"
        ],
        "title": "repair_answerArguments",
        "type": "object"
      }
    },
    {
      "name": "verify_discovery",
      "description": "Verify an AI-generated DISCOVERY / hypothesis before surfacing it \u2014 the trust gate beneath\nan autonomous research platform (OpenScience.ai, Claude Science, any biomedical agent).\n\nDecomposes the hypothesis into checkable parts (cited DOIs, gene/drug/disease entities, drug\ninteractions), verifies each against the datalake, and returns {recommend: 'publish'|'review'|\n'reject', trust (0-1), overall_severity, summary, counts, claims:[{kind, ref, severity, detail,\nreceipt}]}. A discovery grounded on a retracted paper or a contradicted variant is 'reject'; one\nwith nothing checkable is 'review' (never auto-'publish' \u2014 we don't green-light the unverifiable).",
      "input_schema": {
        "properties": {
          "hypothesis": {
            "title": "Hypothesis",
            "type": "string"
          }
        },
        "required": [
          "hypothesis"
        ],
        "title": "verify_discoveryArguments",
        "type": "object"
      }
    },
    {
      "name": "attest_answer",
      "description": "Ground an answer AND return a SIGNED, re-verifiable receipt \u2014 the compliance artifact.\n\nRuns verify_answer, then packages the verdict + every claim's receipt + a datalake\nfreshness snapshot into a signed receipt (HMAC-SHA256 over canonical JSON). Requires\nBIOSINGULARITY_SIGNING_KEY in the environment; without it, returns the UNSIGNED receipt\nplus a note. Hand the receipt to an auditor/journal to independently confirm the verdict\nwas not tampered with, and to detect if its ground-truth has gone stale since issuance.",
      "input_schema": {
        "properties": {
          "answer": {
            "title": "Answer",
            "type": "string"
          }
        },
        "required": [
          "answer"
        ],
        "title": "attest_answerArguments",
        "type": "object"
      }
    },
    {
      "name": "audit_references",
      "description": "Audit a reference list / bibliography / any text for RETRACTED or corrected sources.\n\nExtracts DOIs and checks each against PubMed for retraction, retraction-notice, and\nerratum. Use this to ground a citation list before relying on it. Returns a per-\nreference verdict (red=retracted, amber=unresolved/corrected, green=clean) with the\nPubMed receipt for each.",
      "input_schema": {
        "properties": {
          "text": {
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "text"
        ],
        "title": "audit_referencesArguments",
        "type": "object"
      }
    },
    {
      "name": "citation_tallies",
      "description": "Check whether the citing literature DISPUTES a reference, via scite Smart Citations.\n\nReturns supporting vs contrasting (disputing) vs mentioning citation-statement tallies for the\nDOI. A reference with contrasting citations is CONTESTED \u2014 not retracted, but a finding later\nwork reports contrary results for; the verdict is amber 'disputed'. This complements the\nretraction check: it catches claims built on a paper the field actively disputes. Public scite\nendpoint, no API key required.",
      "input_schema": {
        "properties": {
          "doi": {
            "title": "Doi",
            "type": "string"
          }
        },
        "required": [
          "doi"
        ],
        "title": "citation_talliesArguments",
        "type": "object"
      }
    },
    {
      "name": "verify_variant",
      "description": "Verify a genetic variant's pathogenicity against ClinVar, and CONTRADICT a false claim.\n\nquery: e.g. 'CFTR p.Phe508del', an rsID like 'rs80357906', or a ClinVar VariationID. asserts\n(optional): 'pathogenic' or 'benign' \u2014 if refuted by ClinVar the verdict is red 'contradicted'.\nDeepened with gnomAD population frequency (ACMG BA1/BS1: a 'pathogenic' claim on a common\nvariant is contradicted by its own frequency) and dbNSFP in-silico consensus (ACMG PP3/BP4).\nThe highest-signal catch for fabricated pathogenicity.",
      "input_schema": {
        "properties": {
          "query": {
            "title": "Query",
            "type": "string"
          },
          "asserts": {
            "default": "",
            "title": "Asserts",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "title": "verify_variantArguments",
        "type": "object"
      }
    },
    {
      "name": "check_drug_interaction",
      "description": "Check a drug-drug interaction against DDInter. A MAJOR interaction surfaces red \u2014\nthe 'claimed safe to combine but isn't' catch.",
      "input_schema": {
        "properties": {
          "drug_a": {
            "title": "Drug A",
            "type": "string"
          },
          "drug_b": {
            "title": "Drug B",
            "type": "string"
          }
        },
        "required": [
          "drug_a",
          "drug_b"
        ],
        "title": "check_drug_interactionArguments",
        "type": "object"
      }
    },
    {
      "name": "verify_cell_line",
      "description": "Check a cell line against the Cellosaurus register of PROBLEMATIC (misidentified /\ncontaminated) cell lines. A line shown to be a contaminant of another (e.g. MDA-MB-435 is\nreally the M14 melanoma; KB, HEp-2, Chang Liver, INT-407 are all HeLa) surfaces red \u2014 its\nresults may reflect the contaminant, not the claimed cell type. The cell-line analogue of the\nretraction check. A line NOT in the register is an info note (absence is not proof of\nauthenticity). Works offline (bundled register), no API key. Accepts a name, synonym, or CVCL id.",
      "input_schema": {
        "properties": {
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "title": "verify_cell_lineArguments",
        "type": "object"
      }
    },
    {
      "name": "gene_essentiality",
      "description": "Check a gene's cancer-dependency / essentiality against DepMap (HGNC-normalized).\nA claimed dependency DepMap doesn't support is flagged.",
      "input_schema": {
        "properties": {
          "gene": {
            "title": "Gene",
            "type": "string"
          }
        },
        "required": [
          "gene"
        ],
        "title": "gene_essentialityArguments",
        "type": "object"
      }
    },
    {
      "name": "corroborate_gene_disease",
      "description": "CORROBORATE a gene-disease association across DisGeNET + Open Targets + GWAS at once.\n\nReturns one consensus verdict: corroborated (>=2 sources agree, with a confidence),\nsingle-source, unsupported (no source has it), inconclusive (a source was down), or\nunverifiable (disease not a recognized/specific term). The reasoning-engine verdict \u2014\na single source is a lookup; agreement is the trust signal.",
      "input_schema": {
        "properties": {
          "gene": {
            "title": "Gene",
            "type": "string"
          },
          "disease": {
            "title": "Disease",
            "type": "string"
          }
        },
        "required": [
          "gene",
          "disease"
        ],
        "title": "corroborate_gene_diseaseArguments",
        "type": "object"
      }
    },
    {
      "name": "verify_variant_trait",
      "description": "Verify a variant/gene-trait association against the GWAS Catalog (genome-wide significance).\nquery: e.g. 'rs7903146 : type 2 diabetes' or 'APOE : Alzheimer disease'.",
      "input_schema": {
        "properties": {
          "query": {
            "title": "Query",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "title": "verify_variant_traitArguments",
        "type": "object"
      }
    },
    {
      "name": "verify_phenotype",
      "description": "Verify a gene-phenotype claim against HPO. query: e.g. 'FBN1 : ectopia lentis'.",
      "input_schema": {
        "properties": {
          "query": {
            "title": "Query",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "title": "verify_phenotypeArguments",
        "type": "object"
      }
    },
    {
      "name": "check_drug",
      "description": "Check a drug against ChEMBL for market WITHDRAWAL (red) and FDA black-box warning (amber),\nenriched (when PHARMBLOOM_DATABASE_URL is set) with FDA regulatory / IP status: Orange Book\napproval and patent/exclusivity expiry (e.g. 'off-patent / generic since 2011').\nPrefers the local ChEMBL mirror; falls back to the public EBI API.",
      "input_schema": {
        "properties": {
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "title": "check_drugArguments",
        "type": "object"
      }
    },
    {
      "name": "check_trial",
      "description": "Check a clinical trial (NCT id) against ClinicalTrials.gov: early termination/withdrawal/suspension,\nplus ICMJE prospective-registration and FDAAA 801 results-reporting compliance.",
      "input_schema": {
        "properties": {
          "nct_id": {
            "title": "Nct Id",
            "type": "string"
          }
        },
        "required": [
          "nct_id"
        ],
        "title": "check_trialArguments",
        "type": "object"
      }
    },
    {
      "name": "verify_trial_integrity",
      "description": "Trial-integrity check for one NCT id: was it registered PROSPECTIVELY (before the first\nparticipant enrolled, as ICMJE requires as a condition of publication), and were results\nreported within the 12-month FDAAA 801 / EU CTR window?\n\nReturns the verdict plus {prospectively_registered, results_reported_on_time} \u2014 each true/false,\nor null when the registry record lacks the dates to decide (never guessed). Use before citing a\ntrial as evidence, or when screening a manuscript that reports one. Retrospective registration\nmeans the pre-specified outcomes cannot be verified against the registry, so a reported primary\nendpoint may have been chosen after the data were seen.",
      "input_schema": {
        "properties": {
          "nct_id": {
            "title": "Nct Id",
            "type": "string"
          }
        },
        "required": [
          "nct_id"
        ],
        "title": "verify_trial_integrityArguments",
        "type": "object"
      }
    },
    {
      "name": "check_reproducibility",
      "description": "Check whether a paper's DECLARED evidence actually resolves: data accessions (GEO, ENA/SRA,\nBioProject, BioSample, ArrayExpress, dbGaP, PDB, PRIDE, Zenodo/figshare/Dryad DOIs), the\ndata-availability statement's category, and \u2014 with `repo` \u2014 whether a declared code repository\ndeclares a runnable environment. Keyless and live; no datalake needed.\n\nThis answers 'can this evidence be independently re-examined?', NOT 'is this paper right?'. It\nCANNOT return red and never contradicts a claim: an accession that does not resolve is amber\ncontext, because a dead accession is not evidence the findings are false. A registry we could\nnot REACH is reported under a different code (repro_accession_uncheckable) from a registry that\nauthoritatively has no such record (repro_accession_unresolved) \u2014 never conflate them, and never\nread either as 'the data does not exist'. Absence of a data-availability statement is info, not\na finding. Pass `doi` for a published paper, `text` to scan a methods/availability paragraph you\nalready have, or `accession` to check one identifier.\n\nThe result also carries `claims_not_assessed: true`, `complete`, and\n`all_declared_evidence_resolves` (true/false/NULL \u2014 null means completeness is unknown and must\nnot be read as either). There is deliberately no reproducibility score.",
      "input_schema": {
        "properties": {
          "doi": {
            "default": "",
            "title": "Doi",
            "type": "string"
          },
          "text": {
            "default": "",
            "title": "Text",
            "type": "string"
          },
          "accession": {
            "default": "",
            "title": "Accession",
            "type": "string"
          },
          "repo": {
            "default": "",
            "title": "Repo",
            "type": "string"
          }
        },
        "title": "check_reproducibilityArguments",
        "type": "object"
      }
    },
    {
      "name": "evidence_base_integrity",
      "description": "Integrity score for a systematic review's INCLUDED STUDIES \u2014 how much of the pooled\nevidence base is retracted, withdrawn, or under a formal expression of concern.\n\n`included_studies` MUST be the review's included-studies list (the PRISMA included set) \u2014 the\nstudies whose results were pooled. It is the DENOMINATOR of the score.\n\n`bibliography` is OPTIONAL and is the full reference list. Any DOI there that is not in\n`included_studies` is reported as a BACKGROUND citation and EXCLUDED from the score.\n\nDo NOT paste a bibliography into `included_studies`. If you only have one undifferentiated\nreference list, call audit_references instead \u2014 this tool refuses to guess which references are\nthe included studies, because a percentage that mixes included studies with background\ncitations is a misleading number.\n\nReturns the score with its denominator always disclosed, the mutually-exclusive partition, the\nmust-drop and must-review lists with receipts, and a re-analysis prompt. It does NOT recompute\nan effect size and does NOT say whether your conclusion survives \u2014 it has no effect estimates,\nand `robustness_unknown` is always true in the output. A disputed-in-the-literature count is\nreturned under `contested_count_not_scored`; it is never part of the headline fraction.",
      "input_schema": {
        "properties": {
          "included_studies": {
            "title": "Included Studies",
            "type": "string"
          },
          "bibliography": {
            "default": "",
            "title": "Bibliography",
            "type": "string"
          },
          "contested": {
            "default": true,
            "title": "Contested",
            "type": "boolean"
          }
        },
        "required": [
          "included_studies"
        ],
        "title": "evidence_base_integrityArguments",
        "type": "object"
      }
    },
    {
      "name": "screen_manuscript",
      "description": "One-shot integrity screen of a manuscript: references (retracted / erratum / disputed),\ncell lines (misidentified), trials (ICMJE prospective registration + FDAAA results reporting),\nand confident-but-uncheckable prose \u2014 with a published triage rubric and a receipt behind every\nfinding. IMPORTANT: check `screen_complete` before you report anything. When it is false the\ndocument could not be fully read, `triage_tier` is 'incomplete', and `triage.points` is a LOWER\nBOUND \u2014 an incomplete screen is NEVER a clean screen, and must never be summarized as one.\nAlso read `not_checked`: it names the axes that did not run and the axes this screen never\nassesses (statistics, images, plagiarism, authorship). Native formats need no extra dependency\n(.txt .md .tex .rst .bib .ris .docx .odt); .pdf needs the [doc] extra and fails loudly without it.\nScreening a folder of submissions is `screen_submission_queue`.",
      "input_schema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "screen_manuscriptArguments",
        "type": "object"
      }
    },
    {
      "name": "screen_manuscript_text",
      "description": "Screen pasted manuscript TEXT (no file) with the same four verifiers and the same published\nrubric as `screen_manuscript`. IMPORTANT: check `screen_complete` first \u2014 when it is false the\ntext could not be fully screened (commonly: no reference list could be located, or the\nbibliography carries no DOIs), `triage_tier` is 'incomplete', and the points are a LOWER BOUND.\nAn incomplete screen is never a clean screen. Read `not_checked` before summarizing.",
      "input_schema": {
        "properties": {
          "text": {
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "text"
        ],
        "title": "screen_manuscript_textArguments",
        "type": "object"
      }
    },
    {
      "name": "review_scientific_manuscript",
      "description": "Create a four-stage scientific review candidate packet from manuscript TEXT.\n\nStages: exact claim/issue extraction; methods/statistical reporting checks; bounded\nOpenAlex/SemOpenAlex candidate discovery; and, when ``previous_text`` is supplied,\nversion-aware claim drift plus reviewer-issue resolution candidates. Pass reviewer concerns as\nnewline-separated ``review_issues``. Heuristic stages can only return REVIEW, search records are\nstructurally DISCOVERY/decision_eligible=false, and an empty claim set is INCOMPLETE rather than\nclean. Every candidate carries exact source offsets and a receipt. Use two independent domain\nreviewers plus an adjudicator before reporting scientific accuracy or issue resolution.",
      "input_schema": {
        "properties": {
          "text": {
            "title": "Text",
            "type": "string"
          },
          "previous_text": {
            "default": "",
            "title": "Previous Text",
            "type": "string"
          },
          "review_issues": {
            "default": "",
            "title": "Review Issues",
            "type": "string"
          },
          "discover": {
            "default": false,
            "title": "Discover",
            "type": "boolean"
          }
        },
        "required": [
          "text"
        ],
        "title": "review_scientific_manuscriptArguments",
        "type": "object"
      }
    },
    {
      "name": "screen_submission_queue",
      "description": "Screen a FOLDER of submissions as one queue, with reference identifiers deduped across the\nwhole queue and audited once (NCBI etiquette) plus a shared-retracted ledger. Use this instead\nof looping `screen_manuscript` over a folder. IMPORTANT: report `rollup.n_incomplete` and\n`rollup.n_unreadable` ALONGSIDE `rollup.tiers.act_now` \u2014 an unread document is not a clean one,\nand every incomplete row is sorted above every complete row for exactly that reason. Do NOT\nquote any percentage over this queue unless you state the screened-only denominator\n(`rollup.n_screened`).",
      "input_schema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "screen_submission_queueArguments",
        "type": "object"
      }
    },
    {
      "name": "portfolio_integrity",
      "description": "Portfolio integrity exposure for one or more NIH grants: how much of what a research\nPORTFOLIO funded has since been retracted or corrected, with receipts.\n\nReport this as a portfolio's exposure, NEVER as a judgment about the people who did the\nwork. A retraction is frequently an honest error and is often not attributable to the\nresearcher; many are initiated by the authors themselves. This tool returns no author or\ninvestigator names \u2014 there is no such field in the data \u2014 and you must not add any, or\nattribute the findings to a named person, group, or institution.\n\n`grants` is one or more NIH core project numbers, comma-separated (e.g. \"R21AI156197\").\nReturns per-grant and portfolio-level counts over a denominator that is the number of\noutputs NIH RePORTER ATTRIBUTES to the portfolio, plus `coverage`. When coverage < 1.0 the\ncounts are FLOORS (`is_floor: true`), not totals \u2014 say \"at least N\", never \"N\". A source\noutage returns an amber 'not assessed' result, never a clean one. Retracted and disputed are\nreported separately and must not be summed: ~14% of outputs in a typical healthy portfolio\ncross the 'disputed' threshold, so a combined percentage manufactures a false accusation.\nNIH only \u2014 RePORTER is the sole funder with a keyless grant->publications endpoint, so a\nnon-NIH grant number comes back as an amber 'could not confirm', not as a clean portfolio.",
      "input_schema": {
        "properties": {
          "grants": {
            "title": "Grants",
            "type": "string"
          },
          "cap": {
            "default": 200,
            "title": "Cap",
            "type": "integer"
          },
          "contested": {
            "default": false,
            "title": "Contested",
            "type": "boolean"
          }
        },
        "required": [
          "grants"
        ],
        "title": "portfolio_integrityArguments",
        "type": "object"
      }
    },
    {
      "name": "watch_check",
      "description": "Re-check a biosingularity watchlist file and report only what CHANGED since the last\ncheck: newly retracted references, new errata, newly disputed work, and references that used\nto resolve and no longer do. Returns the drift digest with a receipt per change.\n\n`status` is 'clean' ONLY when every reference was actually VERIFIED. 'incomplete' means no clean\nbill is available \u2014 because a source was unreachable, because `--limit` deferred work, OR because\na reference is not indexed in PubMed and so was never checked for retraction at all\n(`summary.not_indexed`). Read `summary.complete`, `summary.not_indexed`, `sources_reached` (per\nsource: true = answered, false = asked and failed, null = NOT CONSULTED \u2014 the\n`watch_source_not_consulted` notices name what a quiet digest rests on) and the `unchecked` array\nbefore telling anyone their library is fine.\n\n`write` defaults to false: recording the new baseline belongs to whoever owns the schedule,\nbecause consuming the drift here would leave the next human run with nothing to report.",
      "input_schema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          },
          "write": {
            "default": false,
            "title": "Write",
            "type": "boolean"
          }
        },
        "required": [
          "path"
        ],
        "title": "watch_checkArguments",
        "type": "object"
      }
    },
    {
      "name": "provenance",
      "description": "Durable provenance lookup: everything the substrate already knows about a reference\n(DOI / PMID / drug / NCT / gene / gene|MONDO pair) \u2014 every flag with its receipt, when it\nwas detected, and how stale it is. The citable trust record. Needs the [store] extra + substrate.",
      "input_schema": {
        "properties": {
          "ref": {
            "title": "Ref",
            "type": "string"
          }
        },
        "required": [
          "ref"
        ],
        "title": "provenanceArguments",
        "type": "object"
      }
    },
    {
      "name": "scan_folder",
      "description": "Scan a file or folder for references and return a trust-metadata manifest: which files\ncite retracted/flagged work, with per-file verdicts. Use to audit a manuscript or bibliography.",
      "input_schema": {
        "properties": {
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "scan_folderArguments",
        "type": "object"
      }
    },
    {
      "name": "data_freshness",
      "description": "Report how old each datalake source is \u2014 the age of the ground truth behind the datalake\nverdicts. Call this to disclose data age: a 'stale' source means re-check against the live source\nbefore trusting its verdict. The reference/retraction audit (audit_references) is always live.",
      "input_schema": {
        "properties": {},
        "title": "data_freshnessArguments",
        "type": "object"
      }
    }
  ]
}
