Skip to main content
Glama

Formulary Churn

formulary_churn
Read-onlyIdempotent

Given a quarter-pair (report_quarter_from, report_quarter_to) AND a formulary or plan filter, returns the formulary delta: drugs added, drugs dropped, drugs re-tiered, and optionally drugs whose control flags (prior auth / step therapy / quantity limit) changed. Diffs drug_silver.fact_drug_formulary across two SPUF report_quarters on (formulary_id, drug) keys, where a drug is its RxCUI by default (grain='rxcui'), so a manufacturer or package NDC swap of the same drug is not churn; grain='ndc' gives the package-level diff. Pass rxcui_filter=[...] to ask whether coverage of specific drugs changed.

Returns: per-category row lists (cap 5000 each), aggregates (formularies_compared, n_added, n_dropped, n_tier_changed, n_control_changed, n_unchanged, churn_rate, tier_movement_distribution), truncated_by_category flags.

READING churn_rate: it is (added + dropped + re-tiered) divided by the number of drugs on the formulary in the FROM quarter — CHANGE EVENTS PER FROM-QUARTER DRUG, not a percentage. It is >= 0 and CAN EXCEED 1 (a formulary that drops everything and adds as many new drugs scores 2.0), because added drugs are not members of the denominator. The answer carries churn_rate_definition saying exactly this, the two denominators (n_in_from_quarter, n_in_to_quarter), and two bounded companions that ARE 0-1: share_dropped (dropped / FROM-quarter drugs) and share_added (added / TO-quarter drugs).

Use cases: year-over-year formulary stability tracking, drop investigations for a specific drug class, IRA-era churn rate (crossing 2025 → 2026 will surface the redesign-driven churn).

KNOWN GAPS: spuf_quarterly_publication_lag (CMS publishes 6 weeks after quarter end; very recent quarter changes won't show); ira_era_break_2026 (IRA Part D redesign in 2026 changed formulary structures; churn comparison crossing this boundary mixes regime changes with normal churn); formulary_churn_truncated (per-category lists capped at 5000).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
grainNorxcui
rxcui_filterNo
plan_id_filterNo
report_quarter_toYes
contract_id_filterNo
formulary_id_filterNo
report_quarter_fromYes
acknowledge_era_breakNo
include_control_changesNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
unitNo
as_ofNo
valueYes
sourceYes
statusNocomplete
caveatsNo
failureNo
qualityNo
refusalNo
vintageNoas_restated
audit_idYesUUID; ties to medicare_silver.audit_log row.
signatureNo
tenant_idNoCalling tenant slug, resolved by the binding and stamped via the per-call tenant context. Defaults to the bootstrap 'internal' tenant for local/in-process callers.
timestampYes
confidenceNo
data_as_ofNo
request_idYes
methodologyNo
snapshot_setYes{table_fqn → iceberg_snapshot_id (int64)}. Per M-2 §2.2.
tool_versionYes
response_hashYesSHA-256 of canonicalized form per M-2 §2.4.
result_statusYes
vintage_basisNodefault_unmeasured
as_of_assertedNo
as_of_observedNo
parse_revisionNo
as_of_effectiveNo
freshness_stateNounknown
methodology_eraNo
confidence_basisNo
semantic_versionYes
invariants_appliedNo
finality_confidenceNo
cms_vintage_sequenceYes
parser_artifact_hashYes
methodology_blend_factorsNo
parser_artifact_hash_basisNonot_evaluated

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedInput schema / properties / grain
      Added value: +{
      +  "default": "rxcui",
      +  "type": "string"
      +}
    • addedInput schema / properties / rxcui_filter
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  2. First observed

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources