Skip to content

Model Context Protocol

A hosted MCP server for claim scrubbing and denial resolution

MCP is the open standard that lets AI agents call external tools without custom glue code. Point any MCP-capable client at DenialPath’s endpoint and it gets claim scrubbing, denial resolution and appeal drafting as first-class tools, no wrapper to write, no edit to guess at.

Setup

Add the server

Streamable HTTP transport, JSON-RPC 2.0, one URL, no local process to run.

Endpoint:

https://denialpath.vercel.app/api/mcp

Config snippet for Claude Desktop, Claude Code, Cursor or any client that reads an mcpServers map. Every tool works with no Authorizationheader at the anonymous rate; a key raises the throttle to your plan's quota.

mcp config

{
  "mcpServers": {
    "denialpath": {
      "url": "https://denialpath.vercel.app/api/mcp",
      "headers": {
        "Authorization": "Bearer <your-api-key>"
      }
    }
  }
}

Tools

What the server exposes

Six tools over the same engine the REST API and the free scrubber use. Each returns findings with their citation and a confidence flag; a status of no_data means not checked, never a pass.

check_claim

Scrub a claim's billed lines against NCCI PTP and MUE edits for its date of service. Same engine, same honesty rules, as /api/v1/scrub.

arguments { "dateOfService": "2026-05-12", "lines": [{ "code": "80053", "modifiers": [], "units": 1 }] }

explain_denial

Explain a CARC and any RARCs off a remittance: plain meaning, ranked corrective actions, and appeal worthiness.

arguments { "carc": "CO-45", "rarc": ["N4"] }

get_ncci_edits

Look up the PTP edit for a code pair on a date of service, with the modifier indicator and citation.

arguments { "code1": "80053", "code2": "80048" }

get_mue

Look up the medically unlikely edit for one code: the value, the adjudication indicator, and what it means.

arguments { "code": "80053" }

draft_appeal

Generate an appeal letter for a denial, with citations and a list of fields the caller must complete. Production quota only.

arguments { "carc": "45", "payerSlug": "medicare", "claimNumber": "CLM-2026-00042" }

get_timely_filing

Days elapsed and remaining to file a claim for a payer, given a date of service, where a public limit is published.

arguments { "payerSlug": "medicare", "dateOfService": "2026-05-12" }

check_claim

tools/call request

POST https://denialpath.vercel.app/api/mcp
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "check_claim",
    "arguments": {
      "dateOfService": "2026-07-18",
      "payerSlug": "medicare",
      "lines": [
        {
          "code": "10021",
          "modifiers": [],
          "units": 1
        },
        {
          "code": "11102",
          "modifiers": [],
          "units": 1
        }
      ]
    }
  }
}

response

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\n  \"data\": {\n    \"input\": {\n      \"dateOfService\": \"2026-07-18\",\n      \"payerSlug\": \"medicare\",\n      \"lines\": [\n        {\n          \"code\": \"10021\",\n          \"modifiers\": [],\n          \"units\": 1\n        },\n        {\n          \"code\": \"11102\",\n          \"modifiers\": [],\n          \"units\": 1\n        }\n      ]\n    },\n    \"editQuarter\": \"2026 Q3\",\n    \"findings\": [\n      {\n        \"kind\": \"ptp\",\n        \"status\": \"fail\",\n        \"lineIndexes\": [\n          0,\n          1\n        ],\n        \"codes\": [\n          \"10021\",\n          \"11102\"\n        ],\n        \"summary\": \"11102 is bundled into 10021 and will be denied as billed\",\n        \"rule\": \"PTP edit with modifier indicator 1. CMS rationale: Sequential procedure. A modifier may bypass this edit, but only when the services were genuinely separate.\",\n        \"remedy\": \"If the two services were distinct (different session, different site, different encounter), append the modifier that describes that distinction to the 11102 line. If they were not distinct, remove 11102.\",\n        \"resolvingModifiers\": [\n          \"59\",\n          \"XE\",\n          \"XS\",\n          \"XP\",\n          \"XU\",\n          \"25\",\n          \"24\",\n          \"57\",\n          \"91\",\n          \"LT\",\n          \"RT\",\n          \"78\",\n          \"79\",\n          \"58\"\n        ],\n        \"citation\": {\n          \"source\": \"CMS Medicare NCCI Procedure to Procedure Edits, Practitioner Services\",\n          \"url\": \"https://www.cms.gov/medicare/coding-billing/national-correct-coding-initiative-ncci-edits/medicare-ncci-procedure-procedure-ptp-edits\",\n          \"quarter\": \"2026 Q3\",\n          \"retrievedAt\": \"2026-07-18\",\n          \"confidence\": \"verified\"\n        }\n      },\n      {\n        \"kind\": \"mue\",\n        \"status\": \"pass\",\n        \"lineIndexes\": [\n          0\n        ],\n        \"codes\": [\n          \"10021\"\n        ],\n        \"summary\": \"10021: 1 unit is within the MUE of 1\",\n        \"rule\": \"MUE 1, adjudication indicator MAI 2. Date of service edit, absolute. Units above this limit are never payable on the same date of service. The edit follows from policy or from the code definition itself and cannot be overcome by documentation, a modifier or an appeal.\",\n        \"remedy\": \"\",\n        \"citation\": {\n          \"source\": \"CMS Medicare NCCI Medically Unlikely Edits, Practitioner Services\",\n          \"url\": \"https://www.cms.gov/medicare/coding-billing/national-correct-coding-initiative-ncci-edits/medicare-ncci-medically-unlikely-edits\",\n          \"quarter\": \"2026 Q3\",\n          \"retrievedAt\": \"2026-07-18\",\n          \"confidence\": \"verified\"\n        }\n      },\n      {\n        \"kind\": \"mue\",\n        \"status\": \"pass\",\n        \"lineIndexes\": [\n          1\n        ],\n        \"codes\": [\n          \"11102\"\n        ],\n        \"summary\": \"11102: 1 unit is within the MUE of 1\",\n        \"rule\": \"MUE 1, adjudication indicator MAI 2. Date of service edit, absolute. Units above this limit are never payable on the same date of service. The edit follows from policy or from the code definition itself and cannot be overcome by documentation, a modifier or an appeal.\",\n        \"remedy\": \"\",\n        \"citation\": {\n          \"source\": \"CMS Medicare NCCI Medically Unlikely Edits, Practitioner Services\",\n          \"url\": \"https://www.cms.gov/medicare/coding-billing/national-correct-coding-initiative-ncci-edits/medicare-ncci-medically-unlikely-edits\",\n          \"quarter\": \"2026 Q3\",\n          \"retrievedAt\": \"2026-07-18\",\n          \"confidence\": \"verified\"\n        }\n      }\n    ],\n    \"summary\": {\n      \"total\": 3,\n      \"failures\": 1,\n      \"bypassed\": 0,\n      \"noData\": 0,\n      \"clean\": false\n    },\n    \"coverage\": {\n      \"ptpPairsLoaded\": 40009,\n      \"mueCodesLoaded\": 15162,\n      \"note\": \"Checked against 40009 PTP pairs and 15162 MUE values curated from published CMS sources. This is a subset of the full CMS files. Codes marked no data were not checked and may still be subject to an edit.\"\n    }\n  },\n  \"request_id\": \"req_2f9c41a7b0e84d15\",\n  \"disclaimer\": \"DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing.\"\n}"
      }
    ]
  }
}

explain_denial

tools/call request

POST https://denialpath.vercel.app/api/mcp
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "explain_denial",
    "arguments": {
      "carc": "CO-16",
      "rarc": [
        "M51"
      ],
      "payerSlug": "medicare"
    }
  }
}

response

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\n  \"data\": {\n    \"found\": true,\n    \"group\": {\n      \"code\": \"CO\",\n      \"meaning\": \"Contractual Obligation. The provider is responsible and the amount cannot be billed to the patient.\"\n    },\n    \"carc\": {\n      \"code\": \"16\",\n      \"commonGroups\": [\n        \"CO\",\n        \"PI\"\n      ],\n      \"title\": \"Claim/service lacks information or has submission/billing error(s).\",\n      \"plainMeaning\": \"The claim is missing required information or has a data or billing error that prevents adjudication. Code 16 is a header level flag that must be paired with a remark code telling you exactly what field or documentation is missing. Without checking that remark code you cannot fix this denial.\",\n      \"whyItFires\": [\n        \"A required field on the claim was blank, invalid, or inconsistent, such as a missing NPI or invalid diagnosis pointer\",\n        \"The payer's system flagged a data mismatch between the 837 claim and its records\",\n        \"Supporting documentation required for this code type was not attached\"\n      ],\n      \"correctiveActions\": [\n        {\n          \"step\": \"Read the paired remark code first\",\n          \"detail\": \"Always check the accompanying RARC before doing anything else. Code 16 alone does not tell you what is wrong.\"\n        },\n        {\n          \"step\": \"Correct and resubmit\",\n          \"detail\": \"Fix the specific field or error identified by the remark code and resubmit as a corrected claim, not an appeal.\"\n        },\n        {\n          \"step\": \"Audit your claim scrubber rules\",\n          \"detail\": \"If this recurs across many claims, add a pre-submission edit check for the specific field that keeps failing.\"\n        }\n      ],\n      \"appealWorthiness\": \"low\",\n      \"appealNote\": \"Not an appeal candidate. This is a correctable data error, so fix and resubmit a corrected claim rather than filing a formal appeal.\",\n      \"relatedRarc\": [\n        \"M51\"\n      ],\n      \"sourceUrl\": \"https://x12.org/codes/claim-adjustment-reason-codes\",\n      \"confidence\": \"verified\"\n    },\n    \"rarc\": [\n      {\n        \"code\": \"M51\",\n        \"type\": \"informational\",\n        \"title\": \"Missing/incomplete/invalid procedure code(s)\",\n        \"plainMeaning\": \"The claim line is missing a procedure code, or the code submitted is not recognized as valid by the payer's claims editing system.\",\n        \"correctiveActions\": [\n          {\n            \"step\": \"Confirm the procedure code was transmitted\",\n            \"detail\": \"Check the claim file or clearinghouse report to confirm the CPT/HCPCS code actually left your system; a mapping or scrubber error can silently drop it.\"\n          },\n          {\n            \"step\": \"Correct and resubmit\",\n            \"detail\": \"Enter the correct, currently valid procedure code for the service performed and resubmit as a corrected claim rather than a duplicate.\"\n          }\n        ],\n        \"relatedCarc\": [\n          \"16\"\n        ],\n        \"sourceUrl\": \"https://x12.org/codes/remittance-advice-remark-codes\",\n        \"confidence\": \"verified\"\n      }\n    ],\n    \"unknownRarc\": [],\n    \"correctiveActions\": [\n      {\n        \"step\": \"Read the paired remark code first\",\n        \"detail\": \"Always check the accompanying RARC before doing anything else. Code 16 alone does not tell you what is wrong.\"\n      },\n      {\n        \"step\": \"Correct and resubmit\",\n        \"detail\": \"Fix the specific field or error identified by the remark code and resubmit as a corrected claim, not an appeal.\"\n      },\n      {\n        \"step\": \"Audit your claim scrubber rules\",\n        \"detail\": \"If this recurs across many claims, add a pre-submission edit check for the specific field that keeps failing.\"\n      },\n      {\n        \"step\": \"Confirm the procedure code was transmitted\",\n        \"detail\": \"Check the claim file or clearinghouse report to confirm the CPT/HCPCS code actually left your system; a mapping or scrubber error can silently drop it.\"\n      }\n    ],\n    \"appeal\": {\n      \"worthiness\": \"low\",\n      \"note\": \"Not an appeal candidate. This is a correctable data error, so fix and resubmit a corrected claim rather than filing a formal appeal.\",\n      \"payer\": {\n        \"payer\": \"Medicare (Original / Part B)\",\n        \"slug\": \"medicare\",\n        \"initialClaimLimitDays\": 365,\n        \"limitText\": \"12 months (1 calendar year) from the date of service\",\n        \"clockStartsFrom\": \"date of service\",\n        \"appealLimitDays\": 120,\n        \"notes\": \"Set by federal regulation at 42 CFR 424.44, not by contract, so this figure does not vary by Medicare Administrative Contractor. Claims denied for untimely filing carry no appeal rights for the timeliness issue itself; the 120-day figure is the standard redetermination (first-level appeal) deadline for a substantive denial, measured from the date of the initial determination.\",\n        \"sourceUrl\": \"https://www.medicare.gov/providers-services/claims-appeals-complaints/claims\",\n        \"confidence\": \"verified\"\n      },\n      \"deadlineDays\": 120\n    },\n    \"note\": \"\"\n  },\n  \"request_id\": \"req_2f9c41a7b0e84d15\",\n  \"disclaimer\": \"DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing.\"\n}"
      }
    ]
  }
}

get_ncci_edits

tools/call request

POST https://denialpath.vercel.app/api/mcp
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_ncci_edits",
    "arguments": {
      "code1": "10021",
      "code2": "11102",
      "dateOfService": "2026-07-18"
    }
  }
}

response

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\n  \"data\": {\n    \"column1\": \"10021\",\n    \"column2\": \"11102\",\n    \"modifierIndicator\": \"1\"\n  },\n  \"request_id\": \"req_2f9c41a7b0e84d15\",\n  \"disclaimer\": \"DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing.\"\n}"
      }
    ]
  }
}

get_mue

tools/call request

POST https://denialpath.vercel.app/api/mcp
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_mue",
    "arguments": {
      "code": "0001U"
    }
  }
}

response

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\n  \"data\": {\n    \"code\": \"0001U\",\n    \"mueValue\": 1,\n    \"mai\": \"2\"\n  },\n  \"request_id\": \"req_2f9c41a7b0e84d15\",\n  \"disclaimer\": \"DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing.\"\n}"
      }
    ]
  }
}

draft_appeal

tools/call request

POST https://denialpath.vercel.app/api/mcp
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "draft_appeal",
    "arguments": {
      "carc": "16",
      "payerSlug": "medicare",
      "claimNumber": "CLM-2026-00042"
    }
  }
}

response

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\n  \"data\": {\n    \"subject\": \"Request for reconsideration - claim CLM-2026-00042 - 16\",\n    \"body\": \"2026-07-18\\n\\nMedicare (Original / Part B)\\nAttn: Claims Review / Appeals Department\\n\\nRe: Request for reconsideration\\nClaim number: CLM-2026-00042\\nDate of service: 2026-07-18\\nProcedure code(s) at issue: 11102\\nProvider: Example Family Medicine\\n\\nTo whom it may concern,\\n\\nWe are writing to request reconsideration of the adjustment applied to the claim referenced above.\\n\\nThe remittance reports 16: Claim/service lacks information or has submission/billing error(s)..\\n\\nThe claim is missing required information or has a data or billing error that prevents adjudication. Code 16 is a header level flag that must be paired with a remark code telling you exactly what field or documentation is missing. Without checking that remark code you cannot fix this denial.\\n\\nThe remittance also carries M51: Missing/incomplete/invalid procedure code(s)\\n\\nBasis for reconsideration:\\n1. Read the paired remark code first. Always check the accompanying RARC before doing anything else. Code 16 alone does not tell you what is wrong.\\n2. Correct and resubmit. Fix the specific field or error identified by the remark code and resubmit as a corrected claim, not an appeal.\\n3. Audit your claim scrubber rules. If this recurs across many claims, add a pre-submission edit check for the specific field that keeps failing.\\n4. Confirm the procedure code was transmitted. Check the claim file or clearinghouse report to confirm the CPT/HCPCS code actually left your system; a mapping or scrubber error can silently drop it.\\n\\nThis request is submitted within the 120 day appeal window published by Medicare (Original / Part B).\\n\\nWe ask that the claim be reprocessed. Supporting documentation is enclosed. Please contact the billing office at the number on file if any further information would assist the review.\\n\\nSincerely,\\n\\n[TO BE COMPLETED BY PRACTICE]\\nExample Family Medicine\",\n    \"citations\": [\n      {\n        \"source\": \"X12 Claim Adjustment Reason Codes\",\n        \"url\": \"https://x12.org/codes/claim-adjustment-reason-codes\",\n        \"confidence\": \"verified\"\n      },\n      {\n        \"source\": \"X12 Remittance Advice Remark Code M51\",\n        \"url\": \"https://x12.org/codes/remittance-advice-remark-codes\",\n        \"confidence\": \"verified\"\n      },\n      {\n        \"source\": \"Medicare (Original / Part B) timely filing and appeal policy\",\n        \"url\": \"https://www.medicare.gov/providers-services/claims-appeals-complaints/claims\",\n        \"confidence\": \"verified\"\n      }\n    ],\n    \"placeholders\": [\n      \"Signature, name and title of the person sending the letter\"\n    ],\n    \"grounded\": true\n  },\n  \"request_id\": \"req_2f9c41a7b0e84d15\",\n  \"disclaimer\": \"DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing.\"\n}"
      }
    ]
  }
}

get_timely_filing

tools/call request

POST https://denialpath.vercel.app/api/mcp
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_timely_filing",
    "arguments": {
      "payerSlug": "medicare",
      "dateOfService": "2026-07-18"
    }
  }
}

response

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\n  \"data\": {\n    \"payer\": {\n      \"payer\": \"Medicare (Original / Part B)\",\n      \"slug\": \"medicare\",\n      \"initialClaimLimitDays\": 365,\n      \"limitText\": \"12 months (1 calendar year) from the date of service\",\n      \"clockStartsFrom\": \"date of service\",\n      \"appealLimitDays\": 120,\n      \"notes\": \"Set by federal regulation at 42 CFR 424.44, not by contract, so this figure does not vary by Medicare Administrative Contractor. Claims denied for untimely filing carry no appeal rights for the timeliness issue itself; the 120-day figure is the standard redetermination (first-level appeal) deadline for a substantive denial, measured from the date of the initial determination.\",\n      \"sourceUrl\": \"https://www.medicare.gov/providers-services/claims-appeals-complaints/claims\",\n      \"confidence\": \"verified\"\n    },\n    \"daysElapsed\": 0,\n    \"daysRemaining\": 365,\n    \"expired\": false\n  },\n  \"request_id\": \"req_2f9c41a7b0e84d15\",\n  \"disclaimer\": \"DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing.\"\n}"
      }
    ]
  }
}

Anonymous calls are rate-limited to 4/min and 20/day per IP, enough to try the server from an agent config, not enough to build on. A free test key raises every tool to 10/min against the real engine and never bills. Pass Authorization: Bearer <key> for production limits: 60/min and 1,000 calls/mo on Pro, up to 300/min and 10,000/mo on Scale. See pricing for the full table.

DenialPath provides billing and administrative guidance based on published CMS and X12 sources. It is not medical advice, not a coverage determination, and not a guarantee of payment. NCCI and MUE edits are republished quarterly and payer policies vary by contract. Always confirm against the payer's own current policy before submitting or appealing.

Point your agent at it

Every tool works keyless at the anonymous rate. A free test key raises the throttle against the real engine and never bills.