Koskamo

InPlan MCP

An official MCP server provided by InPlan that allows AI agents to check Medicare Advantage and marketplace plan provider networks. It exposes seven tools to verify if a provider is listed in a specific plan, retrieve provider details, list plans for a provider, and access coverage data, all while preserving source evidence and dates.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

InPlan MCP logo, by InPlanVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by InPlan
You need:Send your InPlan API key as a bearer tokenGet a free key
MCP endpoint (Streamable HTTP)
https://api.inplan.io/mcp
Vendor documentation

What you can do with it

  • Check if a provider is in a specific plan
  • Retrieve provider profile and specialties
  • List all plans listing a specific provider
  • Get plan details and coverage data

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
inplan 1.0.0
MCP protocol
2025-06-18
Tools
7 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

InPlan answers "which plans list this provider?" and "is this provider in this plan?" for US Marketplace (ACA) and Medicare Advantage plans, by NPI and plan ID, with the source type and as_of date behind every answer. Use check_network for one provider and plan, check_network_batch for many, plans_for_provider for every plan that lists a provider, lookup_provider to confirm who an NPI is, get_plan and search_plan_providers for a plan, and coverage to see which states and insurers we hold. An answer of "not_found" means no listing was found in current directory data; it is not a statement that the provider is out of network. Directories change, so tell users to confirm with the plan before care. Tool calls need an InPlan API key sent as "Authorization: Bearer <key>"; a free key is at https://inplan.io/signup.

Tools

7 advertised

lookup_provider — Look up a provider by NPI
Advertised by the server during the last successful anonymous check.
Advertised read-only

Identity of a US healthcare provider by NPI: name, credential, specialties, practice locations and groups, plus a summary of the Marketplace (ACA) and Medicare Advantage plans whose network directories list them (plan counts, states, plan years, as_of dates). Use it to confirm who an NPI is before checking networks. For the plan list itself use plans_for_provider. Costs 1 call.

lookup_provider input schema
{
  "type": "object",
  "required": [
    "npi"
  ],
  "properties": {
    "npi": {
      "type": "string",
      "description": "10-digit National Provider Identifier, as a string, e.g. \"1184617268\"."
    }
  }
}
lookup_provider output schema
{
  "type": "object",
  "required": [
    "request_id",
    "data_as_of",
    "data",
    "sources"
  ],
  "properties": {
    "data": {
      "type": "object",
      "description": "The answer. Same shape as the matching InPlan API v1 endpoint.",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "How to read the answer."
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "type",
          "description",
          "as_of"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "as_of": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "description": "Source types behind the answer (insurer_directory, plan_directory, provider_registry, plan_catalog), each with its as_of date."
    },
    "data_as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "Date (YYYY-MM-DD) of the newest data behind this answer."
    },
    "request_id": {
      "type": "string",
      "description": "Request id; quote it when you contact support."
    }
  },
  "additionalProperties": {}
}
lookup_provider annotations
{
  "title": "Look up a provider by NPI",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
plans_for_provider — Plans that list a provider
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every Marketplace (ACA) and Medicare Advantage plan whose network directory lists the provider, one row per plan and plan year, each with plan name, insurer, state, network tier and source {type, as_of}. Medicare Advantage rows carry service_area_states and provider_state_in_service_area. Filter by market, state or year; page with limit and offset (next_offset is null on the last page). A plan missing from this list is not a statement that the provider is out of network. Costs 1 call per page.

plans_for_provider input schema
{
  "type": "object",
  "required": [
    "npi"
  ],
  "properties": {
    "npi": {
      "type": "string",
      "description": "10-digit National Provider Identifier, as a string, e.g. \"1184617268\"."
    },
    "year": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Plan year, e.g. 2026. Optional; by default all plan years we hold are considered."
    },
    "limit": {
      "type": "integer",
      "maximum": 500,
      "minimum": 1,
      "description": "Plans per page, 1 to 500. Default 50."
    },
    "state": {
      "type": "string",
      "description": "2-letter US state code, e.g. \"OH\". Optional."
    },
    "market": {
      "enum": [
        "aca",
        "ma"
      ],
      "type": "string",
      "description": "\"aca\" = Marketplace plans, \"ma\" = Medicare Advantage plans. Optional; default both."
    },
    "offset": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Rows to skip; pass next_offset from the previous page. Default 0."
    }
  }
}
plans_for_provider output schema
{
  "type": "object",
  "required": [
    "request_id",
    "data_as_of",
    "data",
    "sources"
  ],
  "properties": {
    "data": {
      "type": "object",
      "description": "The answer. Same shape as the matching InPlan API v1 endpoint.",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "How to read the answer."
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "type",
          "description",
          "as_of"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "as_of": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "description": "Source types behind the answer (insurer_directory, plan_directory, provider_registry, plan_catalog), each with its as_of date."
    },
    "data_as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "Date (YYYY-MM-DD) of the newest data behind this answer."
    },
    "request_id": {
      "type": "string",
      "description": "Request id; quote it when you contact support."
    }
  },
  "additionalProperties": {}
}
plans_for_provider annotations
{
  "title": "Plans that list a provider",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
check_network — Is this provider in this plan?
Advertised by the server during the last successful anonymous check.
Advertised read-only

Answers whether one plan's network directory lists one provider. answer "listed" (in_network: true) comes with evidence: plan year, network tier and source {type, as_of}. answer "not_found" (in_network: null) means 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, so never report it as "out of network". answer "no_provider_network" is a drug-only plan. Directories change; tell users to confirm with the plan before care. Costs 1 call.

check_network input schema
{
  "type": "object",
  "required": [
    "npi",
    "plan_id"
  ],
  "properties": {
    "npi": {
      "type": "string",
      "description": "10-digit National Provider Identifier, as a string, e.g. \"1184617268\"."
    },
    "year": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Plan year, e.g. 2026. Optional; by default all plan years we hold are considered."
    },
    "plan_id": {
      "type": "string",
      "description": "Plan ID. Marketplace (ACA) plans: 14 characters like \"29276OH0970001\" (a 16-character \"-01\" variant form is accepted). Medicare Advantage plans: \"H1234-001-000\" (the segment \"-000\" is optional)."
    }
  }
}
check_network output schema
{
  "type": "object",
  "required": [
    "request_id",
    "data_as_of",
    "data",
    "sources"
  ],
  "properties": {
    "data": {
      "type": "object",
      "description": "The answer. Same shape as the matching InPlan API v1 endpoint.",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "How to read the answer."
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "type",
          "description",
          "as_of"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "as_of": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "description": "Source types behind the answer (insurer_directory, plan_directory, provider_registry, plan_catalog), each with its as_of date."
    },
    "data_as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "Date (YYYY-MM-DD) of the newest data behind this answer."
    },
    "request_id": {
      "type": "string",
      "description": "Request id; quote it when you contact support."
    }
  },
  "additionalProperties": {}
}
check_network annotations
{
  "title": "Is this provider in this plan?",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
check_network_batch — Check up to 100 provider and plan pairs
Advertised by the server during the last successful anonymous check.
Advertised read-only

The check_network answer for up to 100 (npi, plan_id) pairs in one request, with the same listed / not_found / no_provider_network semantics. Invalid pairs come back with a per-item error and are not charged; each accepted pair costs 1 call. Needs the Builder plan or higher.

check_network_batch input schema
{
  "type": "object",
  "required": [
    "items"
  ],
  "properties": {
    "year": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Default plan year for items that do not set one. Optional."
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "npi",
          "plan_id"
        ],
        "properties": {
          "npi": {
            "type": "string",
            "description": "10-digit National Provider Identifier, as a string, e.g. \"1184617268\"."
          },
          "year": {
            "type": "integer",
            "maximum": 9007199254740991,
            "minimum": -9007199254740991,
            "description": "Plan year, e.g. 2026. Optional; by default all plan years we hold are considered."
          },
          "plan_id": {
            "type": "string",
            "description": "Plan ID. Marketplace (ACA) plans: 14 characters like \"29276OH0970001\" (a 16-character \"-01\" variant form is accepted). Medicare Advantage plans: \"H1234-001-000\" (the segment \"-000\" is optional)."
          }
        }
      },
      "maxItems": 100,
      "minItems": 1,
      "description": "1 to 100 pairs."
    }
  }
}
check_network_batch output schema
{
  "type": "object",
  "required": [
    "request_id",
    "data_as_of",
    "data",
    "sources"
  ],
  "properties": {
    "data": {
      "type": "object",
      "description": "The answer. Same shape as the matching InPlan API v1 endpoint.",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "How to read the answer."
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "type",
          "description",
          "as_of"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "as_of": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "description": "Source types behind the answer (insurer_directory, plan_directory, provider_registry, plan_catalog), each with its as_of date."
    },
    "data_as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "Date (YYYY-MM-DD) of the newest data behind this answer."
    },
    "request_id": {
      "type": "string",
      "description": "Request id; quote it when you contact support."
    }
  },
  "additionalProperties": {}
}
check_network_batch annotations
{
  "title": "Check up to 100 provider and plan pairs",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_plan — Plan details
Advertised by the server during the last successful anonymous check.
Advertised read-only

Details of one Marketplace (ACA) or Medicare Advantage plan by plan ID: name, insurer or organization, state or service area, plan type, metal level, the plan years we hold, and whether we hold its directory listings, with their as_of date. Costs 1 call.

get_plan input schema
{
  "type": "object",
  "required": [
    "plan_id"
  ],
  "properties": {
    "year": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Plan year, e.g. 2026. Optional; by default all plan years we hold are considered."
    },
    "plan_id": {
      "type": "string",
      "description": "Plan ID. Marketplace (ACA) plans: 14 characters like \"29276OH0970001\" (a 16-character \"-01\" variant form is accepted). Medicare Advantage plans: \"H1234-001-000\" (the segment \"-000\" is optional)."
    }
  }
}
get_plan output schema
{
  "type": "object",
  "required": [
    "request_id",
    "data_as_of",
    "data",
    "sources"
  ],
  "properties": {
    "data": {
      "type": "object",
      "description": "The answer. Same shape as the matching InPlan API v1 endpoint.",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "How to read the answer."
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "type",
          "description",
          "as_of"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "as_of": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "description": "Source types behind the answer (insurer_directory, plan_directory, provider_registry, plan_catalog), each with its as_of date."
    },
    "data_as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "Date (YYYY-MM-DD) of the newest data behind this answer."
    },
    "request_id": {
      "type": "string",
      "description": "Request id; quote it when you contact support."
    }
  },
  "additionalProperties": {}
}
get_plan annotations
{
  "title": "Plan details",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_plan_providers — Providers listed in a plan
Advertised by the server during the last successful anonymous check.
Advertised read-only

Providers that a Marketplace (ACA) plan's network directory lists, with name, credential, primary specialty, network tiers and up to 5 locations. Filter by state, specialty (substring, e.g. "cardiology"), zip, or zip plus radius in miles. Pages are cursor-based: pass next_cursor back unchanged until it is null; with filters a page can hold fewer than limit providers. Medicare Advantage plans: use check_network or plans_for_provider instead. Needs the Growth plan or higher. Costs 1 call per page.

search_plan_providers input schema
{
  "type": "object",
  "required": [
    "plan_id"
  ],
  "properties": {
    "zip": {
      "type": "string",
      "description": "5-digit ZIP code, as a string. Optional."
    },
    "year": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Plan year, e.g. 2026. Optional; by default all plan years we hold are considered."
    },
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Providers per page, 1 to 100. Default 25."
    },
    "state": {
      "type": "string",
      "description": "2-letter US state code, e.g. \"OH\". Optional."
    },
    "cursor": {
      "type": "string",
      "description": "next_cursor from the previous page."
    },
    "radius": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Miles around zip, 1 to 100. Needs zip."
    },
    "plan_id": {
      "type": "string",
      "description": "Plan ID. Marketplace (ACA) plans: 14 characters like \"29276OH0970001\" (a 16-character \"-01\" variant form is accepted). Medicare Advantage plans: \"H1234-001-000\" (the segment \"-000\" is optional)."
    },
    "specialty": {
      "type": "string",
      "maxLength": 60,
      "description": "Specialty name or part of it, e.g. \"family medicine\". Optional."
    }
  }
}
search_plan_providers output schema
{
  "type": "object",
  "required": [
    "request_id",
    "data_as_of",
    "data",
    "sources"
  ],
  "properties": {
    "data": {
      "type": "object",
      "description": "The answer. Same shape as the matching InPlan API v1 endpoint.",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "How to read the answer."
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "type",
          "description",
          "as_of"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "as_of": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "description": "Source types behind the answer (insurer_directory, plan_directory, provider_registry, plan_catalog), each with its as_of date."
    },
    "data_as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "Date (YYYY-MM-DD) of the newest data behind this answer."
    },
    "request_id": {
      "type": "string",
      "description": "Request id; quote it when you contact support."
    }
  },
  "additionalProperties": {}
}
search_plan_providers annotations
{
  "title": "Providers listed in a plan",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
coverage — What InPlan covers
Advertised by the server during the last successful anonymous check.
Advertised read-only

The markets, states and insurers InPlan holds directory listings for, with plan counts and as_of dates, by plan year. Filter by market, state or year. Use it to see which states and insurers you can query. Costs 1 call.

coverage input schema
{
  "type": "object",
  "properties": {
    "year": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Plan year, e.g. 2026. Optional; by default all plan years we hold are considered."
    },
    "state": {
      "type": "string",
      "description": "2-letter US state code, e.g. \"OH\". Optional."
    },
    "market": {
      "enum": [
        "aca",
        "ma"
      ],
      "type": "string",
      "description": "\"aca\" = Marketplace plans, \"ma\" = Medicare Advantage plans. Optional; default both."
    }
  }
}
coverage output schema
{
  "type": "object",
  "required": [
    "request_id",
    "data_as_of",
    "data",
    "sources"
  ],
  "properties": {
    "data": {
      "type": "object",
      "description": "The answer. Same shape as the matching InPlan API v1 endpoint.",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "How to read the answer."
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "type",
          "description",
          "as_of"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "as_of": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "description": "Source types behind the answer (insurer_directory, plan_directory, provider_registry, plan_catalog), each with its as_of date."
    },
    "data_as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "Date (YYYY-MM-DD) of the newest data behind this answer."
    },
    "request_id": {
      "type": "string",
      "description": "Request id; quote it when you contact support."
    }
  },
  "additionalProperties": {}
}
coverage annotations
{
  "title": "What InPlan covers",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
631 ms
95th percentile latency
631 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 631 ms · metadata changed · 7 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http inplan-mcp https://api.inplan.io/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add inplan-mcp --url https://api.inplan.io/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable inplan-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "inplan-mcp": {
      "url": "https://api.inplan.io/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "inplan-mcp": {
      "type": "streamableHttp",
      "url": "https://api.inplan.io/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start inplan-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "inplan-mcp": {
      "type": "http",
      "url": "https://api.inplan.io/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http inplan-mcp https://api.inplan.io/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "inplan-mcp": {
      "url": "https://api.inplan.io/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "inplan-mcp": {
      "serverUrl": "https://api.inplan.io/mcp"
    }
  }
}

Let your agent find its tools

Find servers like InPlan MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run InPlan MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing