Back to the catalog

MedPrice AI

Hosted MCP server exposing US hospital procedure cost data to AI assistants

Open source Repository Open in the app JSON README (API)

About

Hosted MCP server exposing US hospital procedure cost data to AI assistants

Details

Kind
MCP servers
Topic
No topic detected
Publisher
medprice-ai
Origin
official
Category
ferramentas
Transport
http
Version
0.0.1
Forks
1
Open pull requests
3
Last push
2026-09-07T17:25:33Z
Repository state
ativo
Language
TypeScript
Added
2026-08-29 04:00:46
Updated
2026-08-29 04:00:46
Origin id
io.github.medprice-ai/mcp-medprice-ai

README

# mcp-medprice-ai

A hosted MCP server exposing US hospital chargemaster cost data to AI assistants.

- **MCP endpoint**: `https://mcp.medprice.ai/mcp`
- **gRPC backend**: `api.medprice.ai:443`

## Install in Claude Code

```bash
claude mcp add --transport http mcp-medprice-ai https://mcp.medprice.ai/mcp
```

To share with everyone in a project, add `--scope project` (writes to `.mcp.json`). To make it available across all your projects, use `--scope user`.

## Usage

The server exposes five tools:

- **`list_hospitals`** — returns the supported hospitals with their `hospital_id`, EIN, name, structured_locations (addresses with geocoded coordinates where available), last_updated_on, and revision history (each revision's date, `revision_id`, and whether it has payer-specific rate data).
- **`get_hospital_chargemaster_cost`** — looks up cost stats for a billing code at a single hospital.
- **`list_hospital_code_costs`** — looks up cost stats for a billing code across every hospital that has a matching chargemaster entry, paginated. Use this instead of calling `get_hospital_chargemaster_cost` once per hospital when comparing prices for the same procedure across hospitals.
- **`list_code_types`** — lists every distinct billing code type (e.g. CPT, MS-DRG) with catalogued cost data, along with each type's distinct code count and total hospital reports.
- **`list_codes`** — lists every distinct code under a given code type, paginated, with a raw chargemaster description and reporting-hospital count per code. Use this to discover which codes exist under a code system before pricing them.

The typical flow is to call `list_hospitals` first to discover available hospitals and their IDs, then call `get_hospital_chargemaster_cost` with the desired `hospital_id` — or call `list_hospital_code_costs` directly when the question is about a code across hospitals rather than one specific hospital. Once installed, you can just ask your assistant something like:

> What's the fee schedule cost of MS-DRG 652 at Medical City Alliance?

The assistant will call `list_hospitals` to find the hospital's ID, then call `get_hospital_chargemaster_cost` with:

```json
{
  "hospital_id": "1",
  "code_type": "MS-DRG",
  "code": "652",
  "methodology": "fee schedule"
}
```

and returns:

```json
{
  "hospital": "MEDICAL CITY ALLIANCE",
  "found": true,
  "cost": {
    "code_type": "MS-DRG",
    "code": "652",
    "min": "26851.11",
    "max": "190885.00",
    "avg": "34387.70",
    "median": "28084.07",
    "std_dev": "13735.94"
  },
  "description": {
    "hospital_name": "MEDICAL CITY ALLIANCE",
    "location": "3101 N Tarrant Pkwy, Fort Worth, TX, 76177",
    "code_description": "KIDNEY TRANSPLANT",
    "methodology_note": "fee schedule"
  }
}
```

### Tool reference

#### `list_hospitals`

- **`page_size`** (optional) — maximum number of hospitals to return. Defaults to 500 (the entire current registry in one call), capped at 500.
- **`page_token`** (optional) — opaque token from a previous response's `next_page_token`, for pagination. If `next_page_token` is non-empty, keep calling with it until it's empty rather than assuming one page is the full list.

Each hospital's `revisions` array now includes a `revision_id` per revision (in addition to `revision_date` and `has_payer_data`) — pass it as `get_hospital_chargemaster_cost`'s `revision_id` to price that specific past revision instead of the hospital's latest one.

#### `get_hospital_chargemaster_cost`

- **`hospital_id`** (required) — opaque hospital identifier from `list_hospitals`.
- **`code_type`** (required) — code system, e.g. `APR-DRG`, `CDM`, `CPT`, `HCPCS`, `MS-DRG`, `RC`. Hospitals may also support additional proprietary code types.
- **`code`** (required) — the billing/chargemaster code.
- **`methodology`** (optional) — one of `case rate`, `fee schedule`, `other`, `percent of total billed charges`, `per diem`. Omit to aggregate across all methodologies.
- **`revision_id`** (optional) — a `revision_id` from `list_hospitals`, to price that specific past revision instead of the hospital's latest one.

#### `list_hospital_code_costs`

Like `get_hospital_chargemaster_cost`, but returns one result per hospital that has a matching chargemaster entry for the code, instead of requiring a `hospital_id` up front — useful for "which hospital is cheapest for X" questions without a `list_hospitals` + N × `get_hospital_chargemaster_cost` round trip.

- **`code_type`** (required) — same as above.
- **`code`** (required) — same as above.
- **`methodology`** (optional) — same as above.
- **`page_size`** (optional) — maximum number of results to return. Defaults to 500 (every matching hospital in one call at the current registry size), capped at 500.
- **`page_token`** (optional) — opaque token from a previous response's `next_page_token`, for pagination. If `next_page_token` is non-empty, keep calling with it until it's empty rather than assuming one page is the full list.

Returns `results` (each shaped like a `get_hospital_chargemaster_cost` response, plus a `hospital_id` to link back to `list_hospitals`/`get_hospital_chargemaster_cost`) and `next_page_token`. Only hospitals with a matching entry (their latest revision) are included — there are no `found: false` entries.

#### `list_code_types`

No arguments. Returns `code_types`, one entry per distinct code type present in the catalog (most code-rich first), each with `code_type`, `code_count` (distinct codes catalogued under that type), and `total_hospital_reports` (sum of `hospital_count` across every code under that type — not a distinct-hospital count). Unpaginated.

Use this to discover which code systems have data before drilling into `list_codes`.

#### `list_codes`

- **`code_type`** (required) — code system to list codes for, e.g. `CPT`. From `list_code_types`.
- **`page_size`** (optional) — maximum number of results to return. Defaults to 500, capped at 500.
- **`page_token`** (optional) — opaque token from a previous response's `next_page_token`, for pagination. If `next_page_token` is non-empty, keep calling with it until it's empty rather than assuming one page is the full list.

Returns `codes` (each with `code`, `raw_description` — raw chargemaster text, not necessarily a human-readable procedure name — and `hospital_count`, distinct hospitals reporting that code on their latest revision), `next_page_token`, and `total_count` (total matching codes across all pages). Use this to discover which codes exist under a code system before pricing them with `get_hospital_chargemaster_cost` or `list_hospital_code_costs`.

## Development

### Run locally against the production gRPC backend

```bash
GRPC_HOST=api.medprice.ai:443 npx tsx src/index.ts
```

### Run locally against a custom gRPC backend

```bash
GRPC_HOST=<host:port> npx tsx src/index.ts
```

### Run as HTTP server

```bash
TRANSPORT=http GRPC_HOST=api.medprice.ai:443 npx tsx src/index.ts
```

All MCP requests go to `POST /mcp`. `PORT` defaults to `3000`.

### Test gRPC connectivity

```bash
GRPC_HOST=api.medprice.ai:443 npx tsx src/test.ts
```

## Docker

### Build

```bash
docker build -t mcp-medprice-ai .
```

### Run

```bash
docker run --rm -p 3000:3000 \
  -e GRPC_HOST=api.medprice.ai:443 \
  mcp-medprice-ai
```

`TRANSPORT=http` and `PORT=3000` are set by default in the image. Override `PORT` if needed:

```bash
docker run --rm -p 8080:8080 \
  -e GRPC_HOST=api.medprice.ai:443 \
  -e PORT=8080 \
  mcp-medprice-ai
```

More