# Licensy (remote · mcp.licensy.ai)

Real-time U.S. medical license verification across all 50 states + DC.

- Trust score: 37/100 (low)
- Change this week: −24
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `mcp.licensy.ai`: 37/100 (this document), [markdown](https://verifymcp.io/servers/ai-licensy-mcp-server/mcp.md), [page](https://verifymcp.io/servers/ai-licensy-mcp-server/mcp)

## Channel facts

- Endpoint: `https://mcp.licensy.ai/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.1.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 92/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server supports Client ID Metadata Documents, the current MCP client-registration mechanism.
- **Transport & Reachability**: 0/100
  - Transport blocked by authentication: the endpoint requires auth we don't have to verify streamable-http.
- **Schema Quality & AI Usability**: 0/100
  - Schema blocked by authentication: the endpoint requires auth we don't have to read it.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 0/100
  - Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools.
- **Capabilities**: 0/100
  - Capabilities blocked by authentication: the endpoint requires auth we don't have to read them.

**Unverified: 5 categories.** Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.

## Install

### Claude

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

### Codex

```toml
[mcp_servers.ai-licensy-mcp-server]
url = "https://mcp.licensy.ai/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-licensy-mcp-server": {
      "type": "remote",
      "url": "https://mcp.licensy.ai/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add ai-licensy-mcp-server --url https://mcp.licensy.ai/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  ai-licensy-mcp-server:
    url: "https://mcp.licensy.ai/mcp"
```

### Other

```json
{
  "mcpServers": {
    "ai-licensy-mcp-server": {
      "type": "http",
      "url": "https://mcp.licensy.ai/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-01 (score 37, 0)

- [security regression] Endpoint reachability: reachable → behind authorisation

### 2026-07-31 (score 37, +14)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 23, −39)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 62, 0)

- [security] Tool “get_license_status” rewrote its description, which is the text the model reads
- [security] Tool “verify_license” rewrote its description, which is the text the model reads
- [functional] Schema quality: excellent → good

### 2026-07-28 (score 62, +1)

- [functional] Server version: 3.4.4 → 3.4.5

### 2026-07-27 (score 61, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 60)

First indexed and scored.

## MCP tools (9)

### `verify_license` (~268 tokens)

Verify a U.S. physician's medical license status in a specific state. Returns current status (active/expired/suspended/etc.), expiration date, and a confidence indicator.

Use this when:
 \- Confirming a physician is currently licensed before scheduling care
 \- Validating credentials during onboarding or recredentialing
 \- Answering 'is Dr. X licensed in [state]?' questions

Do NOT use this for:
 \- Bulk verification of >1 NPI — use bulk_verify instead (paid tier)
 \- Historical 'was this physician licensed on date X' — use get_license_history instead (paid tier)

Input: NPI (preferred) OR (license_number + state), plus state. State accepts either 2-letter code ('CA') or full name ('California').

A 'not_found' status is a confirmed absence; 'verification_unavailable' means the state board was unreachable (retry — do not treat as unlicensed).

Output: status, state, expiration_date, license_active. Paid tiers additionally receive license_number, issuance_date, board_source, last_refreshed_at, screenshot_url for audit-grade primary-source verification.

Data is sourced directly from state medical boards and refreshed every 24 hours. Licensy covers all 50 states + DC.

Input parameters:

- `inp` (object, required)

### `list_physician_licenses` (~172 tokens)

List all U.S. medical licenses Licensy has on file for a single physician (by NPI), one per state. Each entry shows current status and expiration date.

Use this when:
 \- Surveying a physician's multi-state license portfolio
 \- Recredentialing across multiple states at once
 \- Checking which states a physician is licensed in

Do NOT use this for:
 \- A single-state yes/no — use get_license_status (cheaper)
 \- Bulk verification across multiple NPIs — use bulk_verify

Input: NPI (10 digits). Optional include_inactive flag (default false).
Output: array of {status, state, expiration_date, license_active}.

Free tier returns these summary fields. Paid tier callers receive the full license record per state.

Input parameters:

- `inp` (object, required)

### `get_license_status` (~212 tokens)

Return only the license status string for a single physician in a single state. The minimal-output companion to verify_license: optimized for agents that need only a yes/no decision and want to minimize tokens in the LLM context.

Use this when:
 \- You need a one-word answer for routing logic (active vs anything else)
 \- You're checking a license inside a tight inner loop
 \- You want to minimize tokens spent on auxiliary fields

Use verify_license instead when you need expiration date, license_active boolean, or any other field.

Input: NPI (10 digits), state.
Output: a single status from the controlled vocabulary: active | expired | lapsed | inactive | suspended | revoked | surrendered | pending | not_found | verification_unavailable.

Note: 'not_found' is a confirmed absence (no record on file). 'verification_unavailable' means the state board could not be reached, so licensure could not be confirmed — retry rather than treating it as unlicensed.

Input parameters:

- `inp` (object, required)

### `get_screenshot_url` (~145 tokens)

Return an audit-grade screenshot of the state medical board page used to verify a physician's license. The URL is signed and valid for 15 minutes.

Use this when:
 \- You need primary-source evidence for an audit, credentialing file, or insurance contract
 \- The end user asks 'where did this come from?'
 \- You're generating a credentialing PDF that needs proof attachments

Identify the license by: NPI + state, OR by `license_id` if you already fetched it via verify_license / list_physician_licenses.

Free-tier callers receive a structured tier_upgrade_required response. Paid tier (Pro / Enterprise) only.

Input parameters:

- `inp` (object, required)

### `bulk_verify` (~133 tokens)

Verify medical licenses for many (NPI, state) pairs in a single call. Returns one result per input, in input order. Use this instead of calling verify_license in a loop — bulk_verify parallelises server-side, returns faster, and is billed as a single call.

Limits: Pro tier max 100 pairs per call; Enterprise max 1000.

Use this when:
 \- Initial roster ingestion for a credentialing project
 \- Quarterly recredentialing audit of a multi-state group
 \- Pre-call verification of a physician list before scheduling

Paid tier only (Pro or Enterprise).

Input parameters:

- `inp` (object, required)

### `search_disciplinary_actions` (~148 tokens)

Search for known disciplinary actions against a physician (suspension, revocation, surrender, probation). Sourced from state medical board status text.

Use this when:
 \- Pre-employment screening
 \- Recredentialing — required by most insurance contracts
 \- Investigating a referral source

Input: NPI (preferred) OR full name. Optional state filter.
Output: array of {state, action_type, date, source_url}. Action types: suspension | revocation | surrender | probation | reprimand | other.

Coverage note: this surfaces board-status-level signal. Underlying PDF documents are on the roadmap.

Paid tier only (Pro or Enterprise).

Input parameters:

- `inp` (object, required)

### `get_license_history` (~143 tokens)

Return a physician's license status as it was on a specific past date (point-in-time / retroactive lookup).

Use this when:
 \- Insurance company asks 'was this physician licensed when they treated patient X on 2024-08-12?'
 \- Legal discovery for a malpractice case
 \- Retroactive credentialing audit

Input: NPI + state + as_of_date (ISO 8601).

Coverage caveat: full append-only license history is on the roadmap. v1 returns best-available data and a `coverage_start` date marking the earliest reliable point-in-time queries.

Paid tier only (Pro or Enterprise).

Input parameters:

- `inp` (object, required)

### `subscribe_to_changes` (~125 tokens)

Subscribe a webhook URL to license-change events for one or more NPIs. Licensy POSTs a signed JSON payload to your URL when a subscribed event fires.

Events:
  status_change             — license status changes (active → expired, etc.)
  expiration_warning_60d    — license expires in 60 days
  new_disciplinary_action   — new sanction added

Status: webhook delivery is on the roadmap. This tool records the subscription intent today; deliveries will begin once the dispatcher ships.

Paid tier only (Pro or Enterprise).

Input parameters:

- `inp` (object, required)

### `unsubscribe` (~103 tokens)

Cancel a webhook subscription you previously created via subscribe_to_changes. Paid tier only (Pro or Enterprise).

Use this when the agent's workflow that wanted the events has completed, or the customer wants to stop receiving change-notifications for a set of NPIs.

Input: subscription_id (string, returned from subscribe_to_changes).
Output: {success: true} on cancellation.

Idempotent — repeat calls with the same id return success without error.

Input parameters:

- `inp` (object, required)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/ai-licensy-mcp-server/mcp#diagnostics

## Score history

- 2026-08-03: 37
- 2026-08-02: 37
- 2026-08-01: 37
- 2026-07-31: 37
- 2026-07-30: 23
- 2026-07-29: 62
- 2026-07-28: 62
- 2026-07-27: 61
- 2026-07-26: 60

## Links

- Remote endpoint: https://mcp.licensy.ai/mcp
- Repository: https://github.com/licensyai/LicensyAI-MCP
- Website: https://licensy.ai/mcp
- Changelog RSS feed: https://verifymcp.io/servers/ai-licensy-mcp-server/mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/ai-licensy-mcp-server/mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/ai-licensy-mcp-server/mcp
