Skip to content

Distill

by data.spencermcw.com · remote · no sign-in to list tools · v1.0.0 · published by com.spencermcw.data

Pre-computed answers with sources and confidence, paid per call over x402 (USDC on Base).

Changes · 7

7 tools: 7 change things.

Scanned Oct 21, 2026

3 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http distill https://data.spencermcw.com/mcp

Findings

Matches of fixed checks, with the text they matched.

3 warn
  • The server marks "hospital_prices" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"openWorldHint":false}; The input takes a statement or command to run (input.code), which can change anything it can reach.

    What this check looks for
  • The server marks "hospital_compare" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "hospital_compare" says "compare": a word for reading.

    What this check looks for
  • The server marks "hospital_payers" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"openWorldHint":false}; The input takes a statement or command to run (input.code), which can change anything it can reach.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

7 tools

Changes things 7Claude Code: ask
  • hospital_changesChange records from diffing consecutive weekly builds: a hospital republishing its file (source raw_sha256), items and payer rates that appear, disappear or change price, a hospita…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Change records from diffing consecutive weekly builds: a hospital republishing its file (source raw_sha256), items and payer rates that appear, disappear or change price, a hospital’s status or file date changing, and the canonical payer of a payer/plan name changing. Keys: source `<source_id>`; hospital `<hospital id>`; item `<source_id>|<type>|<code>|<setting>|<billing_class>|<modifiers>`; rate `<item key>|<payer name>|<plan name>|<methodology>` (names as the hospital writes them; one rate per methodology, empty when none is given); plan `<payer name>|<plan name>`. Money is integer micro-USD (unit usd_micro). Each record cites the sha256 of the file versions it came from. Pages of up to 100, oldest first; pass next_cursor back as cursor. Price: $0.05 per call. Free tier: 3 free calls a day per IP, at most 3 rows per answer, taken by an unpaid call unless its _meta["distill/free-tier"] is "skip". Confidence: Change records are diffs of consecutive serving DBs, computed deterministically; confidence is the feed’s freshness only: 1 within 14 days of the newest build, then halving every 30 days. Posted standard charges from hospital machine-readable files (45 CFR 180): posted rates, not a quote; not medical or financial advice. What you pay depends on your plan, your care and the hospital. See /terms.

    Annotations the server declares

    • title: Hospital price and file changes, as a paged feed
    • readOnlyHint: true
    • openWorldHint: false
  • hospital_compareFor each named hospital: whether it posts the code, and over its items for the code (only those without modifiers when it posts any, so a professional -26 or bilateral -50 line doe…1 finding

    Why it is in this group

    • The name "hospital_compare" says "compare": a word for reading.
    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "hospital_compare" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"openWorldHint":false}; The name "hospital_compare" says "compare": a word for reading.

      What this check looks for
    Description, as the server wrote it
    For each named hospital: whether it posts the code, and over its items for the code (only those without modifiers when it posts any, so a professional -26 or bilateral -50 line does not skew the row) nearest-rank statistics of its gross charges, discounted cash prices and negotiated dollar amounts across payers and plans, the range of negotiated percentages, the de-identified minimum and maximum, and the number of payers. The same filters as hospital.prices. Hospital ids come from hospital.prices (or pass a CMS certification number). Not charged when none of the hospitals is known. Price: $0.02 per call. Free tier: 3 free calls a day per IP, at most 3 rows per answer, taken by an unpaid call unless its _meta["distill/free-tier"] is "skip". Confidence: Mean over the returned rows (each rate; an item with no rate counts once) of normalize × quality × freshness. Normalize: the stored per-rate normalize confidence (payer canonicalization: rule 1, model 0.9, fallback 0.6; rate basis for rates with no dollar amount: rule 1, model 0.9, fallback 0.75; 1 for an item with no rate). Quality of the MRF: 1 valid against the v3.0 schema, 0.85 parsed with conformance errors, 0.7 parsed only after header repair. Freshness: 1 while the MRF’s last_updated_on is at most 365 days old, then halving every 180 days (0.5 with no date), times 1 within 14 days of our fetch, then halving every 30 days. Rows are each hospital’s items for the code as compared. Posted standard charges from hospital machine-readable files (45 CFR 180): posted rates, not a quote; not medical or financial advice. What you pay depends on your plan, your care and the hospital. See /terms.

    Annotations the server declares

    • title: One billing code across up to 10 named hospitals, one normalized row each
    • readOnlyHint: true
    • openWorldHint: false
  • hospital_payersEvery payer’s negotiated dollar amounts for the code at the hospitals within the radius, grouped by canonical payer_id (the stable id behind the many ways hospitals write a payer’s…1 finding

    Why it is in this group

    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "hospital_payers" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"openWorldHint":false}; The input takes a statement or command to run (input.code), which can change anything it can reach.

      What this check looks for
    Description, as the server wrote it
    Every payer’s negotiated dollar amounts for the code at the hospitals within the radius, grouped by canonical payer_id (the stable id behind the many ways hospitals write a payer’s name), plan type and methodology (a per diem and a case rate are never pooled): how many hospitals and rates, and nearest-rank statistics. Payers with the most hospitals first. Percentage-only rates are left out (they have no dollar amount; hospital.prices shows them). The payer_ids here are what the payer filter of hospital.prices and hospital.compare takes. Price: $0.02 per call. Free tier: 3 free calls a day per IP, at most 3 rows per answer, taken by an unpaid call unless its _meta["distill/free-tier"] is "skip". Confidence: Mean over every rate in the payer rows returned of normalize × quality × freshness, with the same factors as hospital.prices (normalize: the stored per-rate payer canonicalization confidence, rule 1, model 0.9, fallback 0.6; quality: 1 valid v3.0, 0.85 with conformance errors, 0.7 after header repair; freshness: 1 while last_updated_on is at most 365 days old, then halving every 180 days, times 1 within 14 days of our fetch, then halving every 30 days). Posted standard charges from hospital machine-readable files (45 CFR 180): posted rates, not a quote; not medical or financial advice. What you pay depends on your plan, your care and the hospital. See /terms.

    Annotations the server declares

    • title: Negotiated prices for one billing code in one area, per canonical payer and plan type
    • readOnlyHint: true
    • openWorldHint: false
  • hospital_pricesFrom the machine-readable standard-charge files hospitals must publish (45 CFR 180), parsed and normalized: for each hospital within the radius that posts the code, nearest first, …1 finding

    Why it is in this group

    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "hospital_prices" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"openWorldHint":false}; The input takes a statement or command to run (input.code), which can change anything it can reach.

      What this check looks for
    Description, as the server wrote it
    From the machine-readable standard-charge files hospitals must publish (45 CFR 180), parsed and normalized: for each hospital within the radius that posts the code, nearest first, the gross charge, the discounted cash price, the de-identified minimum and maximum, and every payer and plan’s negotiated dollar amount or percentage (with the v3.0 median, 10th and 90th percentile allowed amounts), payers canonicalized to a stable payer_id. Filters: payer, plan type, plan name text, setting, billing class. A summary gives nearest-rank statistics over the hospitals returned. Served states: Colorado. An area with no hospital posting the code answers 404 and is not charged. Price: $0.02 per call. Free tier: 3 free calls a day per IP, at most 3 rows per answer, taken by an unpaid call unless its _meta["distill/free-tier"] is "skip". Confidence: Mean over the returned rows (each rate; an item with no rate counts once) of normalize × quality × freshness. Normalize: the stored per-rate normalize confidence (payer canonicalization: rule 1, model 0.9, fallback 0.6; rate basis for rates with no dollar amount: rule 1, model 0.9, fallback 0.75; 1 for an item with no rate). Quality of the MRF: 1 valid against the v3.0 schema, 0.85 parsed with conformance errors, 0.7 parsed only after header repair. Freshness: 1 while the MRF’s last_updated_on is at most 365 days old, then halving every 180 days (0.5 with no date), times 1 within 14 days of our fetch, then halving every 30 days. Posted standard charges from hospital machine-readable files (45 CFR 180): posted rates, not a quote; not medical or financial advice. What you pay depends on your plan, your care and the hospital. See /terms.

    Annotations the server declares

    • title: Posted hospital prices for one billing code near a US ZIP code or point
    • readOnlyHint: true
    • openWorldHint: false
  • tax_changesChange records read from the states’ rate and boundary files: rates that change, begin or end; ZIP+4 and 5-digit ZIP ranges whose jurisdictions change; new files posted.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Change records read from the states’ rate and boundary files: rates that change, begin or end; ZIP+4 and 5-digit ZIP ranges whose jurisdictions change; new files posted. Each record cites the sha256 of the files it came from. Pages of up to 100, oldest first; pass next_cursor back as cursor. Price: $0.05 per call. Free tier: 3 free calls a day per IP, at most 3 rows per answer, taken by an unpaid call unless its _meta["distill/free-tier"] is "skip". Confidence: Freshness only (change records are read from the state files deterministically): 1 until the next SST posting deadline (the 1st of Mar, Jun, Sep or Dec) after the files were last checked, then halving every 30 days. Not tax advice. Rates as published by the state in its Streamlined Sales Tax rate and boundary files for the stated effective period; verify with the state. See /terms.

    Annotations the server declares

    • title: Quarterly sales-tax rate and boundary changes in the Streamlined Sales Tax states
    • readOnlyHint: true
    • openWorldHint: false
  • tax_sales_rateFrom the state’s own Streamlined Sales Tax rate and boundary files (24 states: AR, GA, IA, IN, KS, KY, MI, MN, NC, ND, NE, NJ, NV, OH, OK, RI, SD, TN, UT, VT, WA, WI, WV, WY).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    From the state’s own Streamlined Sales Tax rate and boundary files (24 states: AR, GA, IA, IN, KS, KY, MI, MN, NC, ND, NE, NJ, NV, OH, OK, RI, SD, TN, UT, VT, WA, WI, WV, WY). Matches an address when the state publishes address records, else the ZIP+4 record, else the 5-digit record (the lowest rate in the ZIP, per SSUTA 305). Returns each jurisdiction’s rate, the combined rate, and the period it holds. Locations outside these states answer 404 and are not charged. Price: $0.005 per call. Free tier: 3 free calls a day per IP, at most 3 rows per answer, taken by an unpaid call unless its _meta["distill/free-tier"] is "skip". Confidence: agreement × freshness. Agreement: for a 5-digit ZIP answer, the share of that ZIP’s ZIP+4 records with the same combined rate; for a ZIP+4 answer, the share of address records inside it with the same rate; 1 for an address match or when the state publishes nothing finer. Freshness: 1 until the next SST posting deadline (the 1st of Mar, Jun, Sep or Dec) after the files were last checked, then halving every 30 days. Not tax advice. Rates as published by the state in its Streamlined Sales Tax rate and boundary files for the stated effective period; verify with the state. See /terms.

    Annotations the server declares

    • title: The sales-tax rate at a US ZIP+4, ZIP or street address in a Streamlined Sales Tax state
    • readOnlyHint: true
    • openWorldHint: false
  • tax_sales_rate_batchThe same answer as tax.sales_rate for each location, in order.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    The same answer as tax.sales_rate for each location, in order. A location that fails (outside the SST states, a bad date) carries its own error; the call is still one price. Price: $0.1 per call. Free tier: 3 free calls a day per IP, at most 3 rows per answer, taken by an unpaid call unless its _meta["distill/free-tier"] is "skip". Confidence: The lowest per-location confidence in the batch; each is agreement × freshness. Agreement: for a 5-digit ZIP answer, the share of that ZIP’s ZIP+4 records with the same combined rate; for a ZIP+4 answer, the share of address records inside it with the same rate; 1 for an address match or when the state publishes nothing finer. Freshness: 1 until the next SST posting deadline (the 1st of Mar, Jun, Sep or Dec) after the files were last checked, then halving every 30 days. Not tax advice. Rates as published by the state in its Streamlined Sales Tax rate and boundary files for the stated effective period; verify with the state. See /terms.

    Annotations the server declares

    • title: Sales-tax rates for up to 100 US locations in one call (Streamlined Sales Tax states)
    • readOnlyHint: false
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.0.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http distill https://data.spencermcw.com/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [],
    "ask": [
      "mcp__distill__tax_sales_rate",
      "mcp__distill__tax_sales_rate_batch",
      "mcp__distill__tax_changes",
      "mcp__distill__hospital_prices",
      "mcp__distill__hospital_compare",
      "mcp__distill__hospital_payers",
      "mcp__distill__hospital_changes"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as distill. Review it before you use it.