# MCP server for AI agents

AI agents can call InPlan through our remote MCP server at `https://api.inplan.io/mcp`. It gives an agent 7 tools, from "is this provider in this plan?" to "which plans list this provider?", and every answer keeps its source type and date. Add the server with your API key and the agent can use it at once.

Source: https://inplan.io/docs/mcp · Updated 2026-10-30

## Endpoint

```text
https://api.inplan.io/mcp
```

The server speaks the Model Context Protocol over **Streamable HTTP**. It is stateless: every JSON-RPC request is a `POST` to the endpoint and gets a JSON answer. It serves protocol version `2026-07-28` and the earlier versions that start with `initialize` (`2025-11-25`, `2025-06-18`, `2025-03-26`), so current clients connect without extra settings.

## API key

Send your InPlan API key as a bearer token, the same key you use for the API: `Authorization: Bearer ip_live_...`. The free plan gives 500 calls a month with no credit card. [Get a free key](https://inplan.io/signup).

Without a key, an agent can still connect and list the tools. A tool call without a key returns a tool error that tells the agent where to get a free key.

Tool calls count exactly like API calls. Each call costs 1 call of your monthly quota (a batch costs 1 per accepted pair), and your plan, per-second limit and quota apply. Errors come back as tool errors with the same `type` values as the API, for example `quota_exceeded` or `plan_upgrade_required`. See [Rate limits and quotas](https://inplan.io/docs/rate-limits) and [Errors](https://inplan.io/docs/errors).

## Tools

| Tool | What it answers | Same as | Plan |
| --- | --- | --- | --- |
| check_network | Is this provider in this plan? `npi`, `plan_id`, optional `year`. | [`GET /v1/check`](https://inplan.io/docs/api/check) | Free and above |
| check_network_batch | The same answer for up to 100 pairs in one call. | [`POST /v1/check/batch`](https://inplan.io/docs/api/check-batch) | Builder and above |
| plans_for_provider | Every plan whose directory lists the provider. Filters: `market`, `state`, `year`; pages: `limit`, `offset`. | [`GET /v1/providers/{npi}/plans`](https://inplan.io/docs/api/provider-plans) | Free and above |
| lookup_provider | Who an NPI is: name, credential, specialties, locations, plan summary. | [`GET /v1/providers/{npi}`](https://inplan.io/docs/api/providers) | Free and above |
| get_plan | Plan details by plan ID. | [`GET /v1/plans/{plan_id}`](https://inplan.io/docs/api/plans) | Free and above |
| search_plan_providers | Providers a Marketplace plan lists. Filters: `state`, `specialty`, `zip`, `radius`; pages: `cursor`. | [`GET /v1/plans/{plan_id}/providers`](https://inplan.io/docs/api/plan-providers) | Growth and above |
| coverage | The markets, states and insurers we hold listings for, with plan counts and dates. | [`GET /v1/coverage`](https://inplan.io/docs/api/coverage) | Free and above |

Each tool result has a short plain-text summary, then the full API answer: as JSON text, and as `structuredContent` for clients that read structured output. The answer has the same fields as the API endpoint, with `sources` and `data_as_of`.

## How agents should read answers

- **listed**: The plan's network directory lists the provider. The evidence names the plan year, the network tier and the source type with its date.
- **not_found**: No listing was found in current directory data for this provider and plan. It is not a statement that the provider is out of network.
- **no_provider_network**: The plan is a prescription drug plan; it has no provider network.

The tool descriptions and the server instructions tell the agent the same thing, and to ask users to confirm with the plan before care. See [Answers and evidence](https://inplan.io/docs/answers-and-evidence).

## Claude Code

Put your key in an environment variable, then add the server once:

```text
claude mcp add --transport http inplan https://api.inplan.io/mcp \
  --header "Authorization: Bearer $INPLAN_KEY"
```

Run `/mcp` in Claude Code to see the server and its 7 tools. Then ask, for example: "Is NPI 1184617268 in plan 29276OH0970001?"

## Claude Desktop

Claude Desktop reads local servers from `claude_desktop_config.json` (Settings, Developer, Edit Config). The `mcp-remote` bridge connects it to our remote server with your key:

```text
{
  "mcpServers": {
    "inplan": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://api.inplan.io/mcp", "--header", "Authorization:${INPLAN_AUTH}"],
      "env": { "INPLAN_AUTH": "Bearer ip_live_..." }
    }
  }
}
```

Restart Claude Desktop after you save the file. The bridge runs with `npx`, so Node.js must be installed.

## Cursor

Add the server to `~/.cursor/mcp.json` (all projects) or `.cursor/mcp.json` (one project). Cursor reads `INPLAN_KEY` from your environment:

```text
{
  "mcpServers": {
    "inplan": {
      "url": "https://api.inplan.io/mcp",
      "headers": { "Authorization": "Bearer ${env:INPLAN_KEY}" }
    }
  }
}
```

## VS Code and other clients

VS Code asks for the key once and stores it securely with this `.vscode/mcp.json`:

```text
{
  "servers": {
    "inplan": {
      "type": "http",
      "url": "https://api.inplan.io/mcp",
      "headers": { "Authorization": "Bearer ${input:inplan-key}" }
    }
  },
  "inputs": [
    { "type": "promptString", "id": "inplan-key", "description": "InPlan API key", "password": true }
  ]
}
```

Any client that supports remote servers over Streamable HTTP needs three things: the URL, the transport and the header.

```text
{
  "type": "streamable-http",
  "url": "https://api.inplan.io/mcp",
  "headers": { "Authorization": "Bearer ip_live_..." }
}
```

## Test with curl

List the tools (no key needed):

```text
curl https://api.inplan.io/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2025-06-18" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
```

Call a tool with your key:

```text
curl https://api.inplan.io/mcp \
  -H "Authorization: Bearer $INPLAN_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2025-06-18" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"check_network",
       "arguments":{"npi":"1184617268","plan_id":"29276OH0970001"}}}'
```
