Telehealth Ledger

Read-only MCP server for Telehealth Ledger's published price checks. Each row carries the price, what it covers, the date it was checked and the provider page it was read from. No authentication. Data is CC BY 4.0; credit Telehealth Ledger, telehealthledger.com. Prices are dated checks of published pages, not quotes, and not medical advice. Telehealth Ledger earns commission from most of the providers it lists; the data carries no tracked links.

Hosted MCP Server

npx add-mcp 'https://telehealthledger.com/mcp'

Installs into Claude Code, Codex, Cursor and more

Documentation

Endpoint

URLhttps://telehealthledger.com/mcp
Transportstreamable-http, json-rpc-2.0
Protocol version2025-06-18
Methodsinitialize, tools/list, tools/call
Authenticationnone
AccessRead-only

Tools

These are the tools the endpoint returns for tools/list, printed from the same definitions.

search_prices: Search published prices

Search published Telehealth Ledger price rows. Optional filters: provider (name or slug), treatment (slug or label), and maxPrice (maximum comparisonPriceUsd), plus limit. Each row is the same record as GET /api/prices, including profileUrl and verifiedAt, the date the price was checked. Prices are dated checks, not quotes.

ArgumentTypeRequiredMeaning
providerstringNoProvider name or slug. Matched case-insensitively against the provider name and slug.
treatmentstringNoTreatment slug or label. Matched case-insensitively.
maxPricenumberNoMaximum comparisonPriceUsd, inclusive.
limitintegerNoMaximum rows to return. Default 25.

get_provider_prices: Prices for one provider

Return published price rows for one provider slug. Rows match GET /api/prices, including profileUrl and verifiedAt, the date the price was checked. Prices are dated checks, not quotes.

ArgumentTypeRequiredMeaning
slugstringYesProvider slug, the last segment of profileUrl.

service_health: Service health

Report whether the public Telehealth Ledger service is responding. Returns the same status and service fields as GET /api/health. This is an uptime check, not a health claim.

No arguments.

Worked example

A request for one compounded semaglutide row, and the endpoint’s own response to it, generated when this page was built. On the wire, content[0].text is a JSON string; it is printed here as parsed JSON so it can be read. structuredContent carries the same object.

Request

POST https://telehealthledger.com/mcp
Content-Type: application/json

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search_prices",
    "arguments": {
      "treatment": "compounded-semaglutide",
      "limit": 1
    }
  }
}

Response

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": {
          "license": {
            "name": "CC BY 4.0",
            "url": "https://creativecommons.org/licenses/by/4.0/",
            "attribution": "Telehealth Ledger, telehealthledger.com"
          },
          "canonical": "https://telehealthledger.com/api/prices",
          "note": "Prices are dated checks of published program pages, not quotes. verifiedAt is the check date. These figures are not medical advice and make no health claim.",
          "matched": 33,
          "filters": {
            "treatment": "compounded-semaglutide",
            "limit": 1
          },
          "schema_version": "3",
          "dataset_version": "2026-11-13.83086d1a",
          "null_meaning": "A blank cell (CSV) or null (JSON) means the fact is not on record. It never means zero, none or not applicable: a blank fee is an unrecorded fee, a blank doseScope is an unrecorded dose range.",
          "rows": [
            {
              "provider": "SnagRX",
              "slug": "snagrx",
              "treatment": "compounded-semaglutide",
              "treatmentLabel": "Compounded semaglutide injection",
              "medicationType": "compounded",
              "productName": "Compounded semaglutide injection",
              "priceBasis": "continuing",
              "comparisonPriceUsd": 99,
              "introPriceUsd": null,
              "salePriceUsd": null,
              "recurringPriceUsd": 99,
              "recurringPriceLowUsd": null,
              "recurringPeriodDays": null,
              "upfrontPriceUsd": 828,
              "effectiveMonthlyPriceUsd": 69,
              "commitmentMonths": 12,
              "medicationIncluded": true,
              "verifiedAt": "2026-11-10",
              "sourceUrl": "https://snagrx.com/semaglutide",
              "profileUrl": "https://telehealthledger.com/providers/snagrx",
              "priceRole": "continuing-monthly",
              "lowestPriceUsd": 99,
              "approvalLabel": "compounded (not FDA-approved)",
              "license": "CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/); attribution: Telehealth Ledger, telehealthledger.com",
              "medicationPriceUsd": 99,
              "mandatoryFeesUsd": null,
              "allInContinuingUsd": null,
              "totalStatus": "incomplete",
              "missingParts": "required recurring fees",
              "feeNote": "Total not given: required recurring fees not on record; shipping included (checked 12 Nov 2026).",
              "knownRecurringUsd": null,
              "offerId": "snagrx-compounded-semaglutide-injection",
              "providerId": "snagrx",
              "treatmentId": "compounded-semaglutide",
              "planId": "12-month",
              "format": "Weekly subcutaneous injection",
              "doseScope": "",
              "schemaVersion": "3",
              "shippingStatus": "included",
              "shippingSource": "https://snagrx.com/semaglutide",
              "shippingCheckedOn": "2026-11-12",
              "datasetVersion": "2026-11-13.83086d1a"
            }
          ]
        }
      }
    ],
    "structuredContent": {
      "license": {
        "name": "CC BY 4.0",
        "url": "https://creativecommons.org/licenses/by/4.0/",
        "attribution": "Telehealth Ledger, telehealthledger.com"
      },
      "canonical": "https://telehealthledger.com/api/prices",
      "note": "Prices are dated checks of published program pages, not quotes. verifiedAt is the check date. These figures are not medical advice and make no health claim.",
      "matched": 33,
      "filters": {
        "treatment": "compounded-semaglutide",
        "limit": 1
      },
      "schema_version": "3",
      "dataset_version": "2026-11-13.83086d1a",
      "null_meaning": "A blank cell (CSV) or null (JSON) means the fact is not on record. It never means zero, none or not applicable: a blank fee is an unrecorded fee, a blank doseScope is an unrecorded dose range.",
      "rows": [
        {
          "provider": "SnagRX",
          "slug": "snagrx",
          "treatment": "compounded-semaglutide",
          "treatmentLabel": "Compounded semaglutide injection",
          "medicationType": "compounded",
          "productName": "Compounded semaglutide injection",
          "priceBasis": "continuing",
          "comparisonPriceUsd": 99,
          "introPriceUsd": null,
          "salePriceUsd": null,
          "recurringPriceUsd": 99,
          "recurringPriceLowUsd": null,
          "recurringPeriodDays": null,
          "upfrontPriceUsd": 828,
          "effectiveMonthlyPriceUsd": 69,
          "commitmentMonths": 12,
          "medicationIncluded": true,
          "verifiedAt": "2026-11-10",
          "sourceUrl": "https://snagrx.com/semaglutide",
          "profileUrl": "https://telehealthledger.com/providers/snagrx",
          "priceRole": "continuing-monthly",
          "lowestPriceUsd": 99,
          "approvalLabel": "compounded (not FDA-approved)",
          "license": "CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/); attribution: Telehealth Ledger, telehealthledger.com",
          "medicationPriceUsd": 99,
          "mandatoryFeesUsd": null,
          "allInContinuingUsd": null,
          "totalStatus": "incomplete",
          "missingParts": "required recurring fees",
          "feeNote": "Total not given: required recurring fees not on record; shipping included (checked 12 Nov 2026).",
          "knownRecurringUsd": null,
          "offerId": "snagrx-compounded-semaglutide-injection",
          "providerId": "snagrx",
          "treatmentId": "compounded-semaglutide",
          "planId": "12-month",
          "format": "Weekly subcutaneous injection",
          "doseScope": "",
          "schemaVersion": "3",
          "shippingStatus": "included",
          "shippingSource": "https://snagrx.com/semaglutide",
          "shippingCheckedOn": "2026-11-12",
          "datasetVersion": "2026-11-13.83086d1a"
        }
      ]
    },
    "isError": false
  }
}

What the data covers

132 price rows from 32 brands; the newest check is dated 13 November 2026. Each row carries its own check date (verifiedAt), the provider page it was read from (sourceUrl) and its profile on this site (profileUrl).

Reading a row

  • offerId names one row and stays the same when its price changes. A provider can list several plans of one treatment, so a provider and a treatment together do not name a row. providerId, treatmentId and planId are its parts.
  • schemaVersion (3) changes only when a column is added or redefined; columns are only added at the end. datasetVersion (2026-11-13.83086d1a) changes whenever any value does. The CSV, the JSON feed and the MCP answers built from the same data carry the same two values.
  • A blank cell (CSV) or null (JSON) means the fact is not on record. It never means zero, none or not applicable: a blank fee is an unrecorded fee, a blank doseScope is an unrecorded dose range.
  • comparisonPriceUsd is the price the rankings use. allInContinuingUsd adds a required recurring fee and is filled only when every required part is on record; missingParts says what is not.
  • shippingStatus is what the provider's own page said about shipping: included, stated-amount, not-stated (the page was read and does not say) or not-read. shippingSource is that page and shippingCheckedOn the date it was read. Shipping counts as a known part only when it is included or an amount.
  • Statistics by provider (a median, a count of providers) count each provider once, at its lowest qualifying price, however many rows it has.

Treatments in the data

  • Compounded glutathione injection (glutathione-injection)
  • Compounded NAD+ injection (nad-injection)
  • Compounded NAD+ nasal spray (nad-nasal-spray)
  • Compounded oral NAD+ (nad-oral)
  • Compounded oral semaglutide (oral-semaglutide)
  • Compounded oral Sermorelin (sermorelin-oral)
  • Compounded oral tirzepatide (oral-tirzepatide)
  • Compounded semaglutide injection (compounded-semaglutide)
  • Compounded Sermorelin injection (sermorelin-injection)
  • Compounded tirzepatide injection (compounded-tirzepatide)
  • Mounjaro injection (mounjaro)
  • Ozempic injection (ozempic)
  • Wegovy injection (wegovy)
  • Zepbound injection (zepbound)

Licence and credit

The data is published under CC BY 4.0. Credit: Telehealth Ledger, telehealthledger.com.

Price CSV · Methodology · Corrections · Press