Koskamo

VeteranHQ MCP

Provides 14 read-only tools for AI assistants to access VA disability ratings, compensation rates, 38 CFR regulations, and veterans benefits information without requiring an account for public tools.

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.

VeteranHQ MCP logo, by VeteranHQVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by VeteranHQ
MCP endpoint (Streamable HTTP)
https://api.veteranhq.app/mcp
Vendor documentation

What its tools do

14 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

14 of 14 have a description · 14 of 14 declare behavior hints · 14 of 14 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to veteranhq.app ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Calculate combined VA disability ratings
  • Search 38 CFR regulations and case law
  • Look up monthly compensation rates
  • Find secondary conditions and presumptive eligibility

Source and maintenance

Vendor evidenceRegistry 0.2.0

Protocol and capabilities

Server
veteranhq 0.1.0
MCP protocol negotiated in check
2025-11-25
Tools
14 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
5 advertised
Server-advertised capabilities
{
  "tools": {},
  "prompts": {}
}

Server-provided instructions

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

VeteranHQ answers questions about U.S. veterans' VA disability benefits. Numeric results (combined ratings, compensation amounts, projections, eligibility screens) are computed by VeteranHQ's production engines from 38 CFR, 10 USC and official VA rate tables: do not recompute, adjust, or second-guess a returned value from memory, and do not substitute your own arithmetic. Precision differs by tool, and each result says which it is. Some are exact table lookups; others are estimates that rest on stated assumptions. Repeat every assumption, estimate marker, confidence note and disclaimer a result carries in the same answer you give the veteran, and describe an estimate as an estimate, never as a decision. Only VA decides ratings, effective dates and payment amounts. This server provides educational information, not legal advice, and does not prepare or file claims. No veteran personal data is accessible through this server. VeteranHQ provides educational information about VA disability benefits through read-only tools; it does not provide legal advice or prepare or file claims. Available account tools depend on this connection's permissions and membership. Use returned calculations rather than substituting arithmetic from memory, and retain their assumptions, estimate markers, confidence notes, and limitations. Only VA determines ratings, effective dates, and payments. Results describe their stated sources and dates; unavailable records do not establish that no claim or evidence exists. VeteranHQ never asks for, accepts, stores, uses or repeats a password, a one-time code or any other login detail in a conversation; login details are typed only on official sites.

Tools

14 advertised

calculate_combined_rating — Calculate combined VA rating
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran has two or more VA disability rating percentages and wants the combined rating. It reports what 38 CFR 4.25 and 4.26 yield for the percentages supplied, not what VA has assigned, and it does not evaluate special monthly compensation. Applies the 38 CFR 4.25 Combined Ratings Table procedure: pairwise combination in severity order, whole-percent rounding after each step, then conversion to the nearest 10. Returns combinedRating as an object holding both figures under their own names: rounded is the rating after that conversion, raw is the Combined Ratings Table value before it. The arithmetic for each step comes back alongside them. The optional bilateral argument tags the ratings that affect both arms or both legs; when it is supplied and one pair has a compensable rating on each side, 38 CFR 4.26 applies to those ratings first: they combine with each other, 10 percent of that value is added rather than combined, and the result enters the 4.25 combination as one disability. Without that argument no bilateral factor is applied. The 38 CFR 4.26(d) comparison across eligible groupings is exhaustive here for up to 16 tagged compensable ratings; past that the response carries combinedRatingWithoutBilateralFactor in place of combinedRating, labelled as a figure the bilateral factor has not been applied to, with a note that VA and accredited representatives compute that factor. The result differs from adding the percentages and from a simple product.

calculate_combined_rating input schema
{
  "type": "object",
  "required": [
    "ratings"
  ],
  "properties": {
    "ratings": {
      "type": "array",
      "items": {
        "type": "number",
        "maximum": 100,
        "minimum": 0
      },
      "maxItems": 20,
      "description": "Array of individual disability rating percentages (0-100), e.g., [70, 50]."
    },
    "bilateral": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "index",
          "extremity"
        ],
        "properties": {
          "index": {
            "type": "integer",
            "maximum": 19,
            "minimum": 0,
            "description": "Position in the ratings array of the rating this entry describes (0-based)."
          },
          "extremity": {
            "enum": [
              "left-arm",
              "right-arm",
              "left-leg",
              "right-leg"
            ],
            "type": "string",
            "description": "The extremity that rating affects."
          }
        },
        "additionalProperties": false
      },
      "maxItems": 20,
      "description": "Optional. Tags the ratings that affect a paired extremity, so 38 CFR 4.26 can be applied: those ratings are combined with each other first, 10 percent of that value is added (not combined), and the result enters the 4.25 combination as one disability. The factor needs a compensable rating on both sides of one pair (both arms or both legs); tag every rating that affects an arm or a leg and the tool applies the factor only where the regulation allows it. Tagging more than 16 compensable ratings is accepted and answered, but past that the 38 CFR 4.26(d) comparison across eligible groupings is not exhaustive here, so the result carries the 4.25 combination of every rating supplied under combinedRatingWithoutBilateralFactor instead of a combined rating, and says where the complete calculation comes from."
    }
  }
}
calculate_combined_rating annotations
{
  "title": "Calculate combined VA rating",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
compare_rating_criteria — Compare rating criteria
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran names a VA diagnostic code and wants the rating criteria for it. It is not a lookup of what a rating pays and it does not combine ratings. Returns the VASRD criteria on file for that code (a code, not a condition name) at every tier, highest percentage first, with the condition name, body system and 38 CFR reference. A code that 38 CFR 4.71a, 4.73 or 4.124a rates in two columns, one for the dominant arm (Major) and one for the non-dominant arm (Minor), returns the regulation's own table and an empty tiers list: schedule is that table as published, with schemaVersion, variant and provenance (the eCFR edition date and the SHA-256 of the source text), every row carrying both published percentages, and scheduleText renders it with its headings, footnotes and the notes whose stated scope includes the code. Notes in the same table whose applicability is not established are quoted in a separate labelled section; placement alone does not establish that they apply to this code. For a neuritis or neuralgia code rated on one of those nerve scales, schedule lists each maximum with its qualifying text and ratedOnScale is the scale. The response lists every row and every maximum without choosing one, and when that table cannot be read it carries a message and an eCFR link instead, even with no criteria on file. Other codes with no criteria on file return an empty result. Every response carries a source block: the 38 CFR reference, a link to the current rating schedule at the publisher, and a scheduleSnapshot whose retrievedAt is the date this text was read from eCFR. That date is null for the criteria on file, with a note saying it is not recorded, so the criteria are usable as the schedule on file and the current text governs where the two differ; for a table under schedule it is the date the snapshot was read.

compare_rating_criteria input schema
{
  "type": "object",
  "required": [
    "diagnosticCode"
  ],
  "properties": {
    "diagnosticCode": {
      "type": "string",
      "description": "VA diagnostic code (e.g., \"8100\" for migraines, \"5260\" for knee)."
    }
  }
}
compare_rating_criteria annotations
{
  "title": "Compare rating criteria",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
analyze_rating_gap — Analyze a rating gap
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran gives a condition name and the VA disability percentage currently assigned for it, and wants that percentage compared against the VASRD criteria. It describes what the criteria require; only VA decides a rating. Returns the tier that matches the current percentage, the next tier above it, and every higher tier on file for that condition, with the criteria each one requires. It reports when the condition is already at the highest documented tier, and when no criteria are on file for that condition name. documentedTiers lists the tier percentages on file for the condition, and currentPercentIsDocumentedTier says whether the percentage supplied is one of them: false means the figure does not correspond to a tier in the criteria on file, which happens when the rating came from a formula or a code this search did not resolve. For a veteran at zero percent, zeroPercentBasis is "documented" when a zero percent row for the code is on file and "unresolved" when the complete tier set could not be established, and zeroPercentUnderFourThirtyOne answers whether 38 CFR 4.31 is what assigns that zero: false where the schedule on file provides a zero percent evaluation or the rating is compensable, and null where the question is open. A null there is an unanswered question rather than a finding that 4.31 applies, because the rule turns on what the schedule provides for the code and this tool reads the criteria on file rather than the omissions in the schedule.

analyze_rating_gap input schema
{
  "type": "object",
  "required": [
    "conditionName",
    "currentPercent"
  ],
  "properties": {
    "conditionName": {
      "type": "string",
      "description": "Condition to analyze (e.g., \"PTSD\", \"Lumbar strain\")."
    },
    "currentPercent": {
      "type": "number",
      "description": "Current VA rating percentage for this condition (e.g., 30, 50, 70)."
    }
  }
}
analyze_rating_gap annotations
{
  "title": "Analyze a rating gap",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
calculate_rolling_window — Check a 12-month absence window
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran supplies dates of incapacitating episodes and the question involves the 38 CFR 4.71a formula VA uses to rate intervertebral disc syndrome on incapacitating episodes, diagnostic code 5243. The tier it reports is an estimate from the episodes supplied, and it does not decide FMLA entitlement or apply to conditions rated outside diagnostic code 5243. Totals the calendar duration of those episodes inside the 12 months ending on a reference date: the window opens the day after the same date one year earlier and closes on the reference date, with both ends counted, so an episode that began exactly 12 months before that date falls outside it by one day. That formula bands on total calendar duration in weeks, so weekend and holiday days inside an episode count, and only periods flagged as bed rest prescribed by a physician count toward a tier. Returns the window, a per-period breakdown, the tier the flagged episodes would support, and a separate employer-leave workday count that plays no part in that tier. Inside ivdsThresholdAnalysis, calendarDaysBelow60PercentThreshold and weeksBelow60PercentThreshold report how far the counted episodes fall below the 6-week duration that bands at 60 percent under that formula. They measure the reported history against a threshold in the regulation; they are not a target, since a veteran does not accumulate bed rest to reach a rating.

calculate_rolling_window input schema
{
  "type": "object",
  "required": [
    "absencePeriods"
  ],
  "properties": {
    "referenceDate": {
      "type": "string",
      "description": "The reference date for the 12-month rolling window (YYYY-MM-DD). Defaults to today. Typically the anticipated C&P exam date. Must be a real calendar date; an unparseable value is rejected."
    },
    "absencePeriods": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "startDate"
        ],
        "properties": {
          "endDate": {
            "type": "string",
            "description": "End date of the absence period in YYYY-MM-DD format. If omitted, assumed same as startDate (single day). Must be on or after startDate; a reversed range is rejected rather than counted."
          },
          "dayCount": {
            "type": "number",
            "description": "Total CALENDAR days absent in this period, weekends included, for a period reported as a count (for example \"20 days between March and December\") rather than as exact dates. If provided, startDate/endDate define the outer span and dayCount overrides the calendar days counted within it. A work-day total alone does not establish calendar duration: this value is a reported calendar-day total, not an estimate converted from work days."
          },
          "startDate": {
            "type": "string",
            "description": "Start date of the absence period in YYYY-MM-DD format."
          },
          "physicianPrescribedBedRest": {
            "type": "boolean",
            "description": "True only when a physician PRESCRIBED bed rest for this period and treated the veteran, which is what 38 CFR 4.71a Note (1) requires of an incapacitating episode. Optional; when omitted or false the period is reported as a plain absence and contributes NOTHING to the IVDS tier. A work absence, a sick day, or self-directed rest without a physician's prescription does not meet that definition."
          }
        }
      },
      "description": "Array of absence periods. Each must have at least a startDate."
    }
  }
}
calculate_rolling_window annotations
{
  "title": "Check a 12-month absence window",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_secondary_conditions — Find secondary conditions
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran names a VA service-connected condition and asks what other conditions can follow from it. It does not diagnose, establish that a particular veteran's condition is secondary, or supply the medical nexus opinion a secondary claim needs. Returns the records whose own primary condition is the one searched for, each with evidence strength, medical rationale, key studies, filing notes, diagnostic codes and the primary condition the record itself names. Other primaries the search terms reached are summarised under relatedPrimaries, with the matched term and a count, not returned as rows. Each row carries provenance: the 38 CFR 3.310 paragraph the link rests on, the rating schedule section and code, their eCFR URLs, and the date codes and percentages were checked against the schedule, which is a question of validity, not of whether a code fits a particular veteran. The key studies were drafted from published research and have not been verified citation by citation, which every row states in its provenance note. limit sets the records per response, default 5 and maximum 15, and offset skips records of the same result, default 0 and maximum 100000. Records are ordered by strength of evidence and then by their primary and secondary condition names, the same on every call. Past a budget of about 12 KB the last records are left out whole rather than shortened (at least one is kept) and responseTrimmedForSize is true. totalExactCount counts every record on file, count and exactCount those returned; hasMore says more follow and nextOffset fetches them, null when none do. relatedPrimaries is returned whole on every response. A totalExactCount of 0 means nothing is on file for that search term, not that no link exists. An offset past the last record returns no records, while totalExactCount still counts the records on file.

find_secondary_conditions input schema
{
  "type": "object",
  "required": [
    "primaryCondition"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 15,
      "minimum": 1,
      "description": "How many secondary-condition records one response carries, 1 to 15, default 5. A response is also held to a size budget of about 12 KB, so it can carry fewer records than the limit, whole ones only; responseTrimmedForSize is then true and nextOffset gives the offset of the first record it left out."
    },
    "offset": {
      "type": "integer",
      "maximum": 100000,
      "minimum": 0,
      "description": "How many records of the same result to skip before the first one returned, 0 to 100000, default 0. Records keep the same order on every call, so the nextOffset one response reports returns the records that follow it."
    },
    "primaryCondition": {
      "type": "string",
      "description": "Primary service-connected condition to search against (e.g., \"PTSD\", \"Lumbar strain\"). Partial matches supported."
    }
  }
}
find_secondary_conditions annotations
{
  "title": "Find secondary conditions",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
check_presumptive_eligibility — Check presumptive eligibility
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran asks whether VA treats a condition as presumptively service connected, or which conditions are presumptive for a given exposure or service era. Whether a particular veteran meets the service requirement depends on service records this tool does not read. Returns matching presumptive conditions with the service era, exposure type, required service, legal authority and evidence needed for each, and repeats that legal authority in a provenance block on every row, with the date the presumption took effect where one date is true of the whole row; that date can be null for a row that groups conditions added on different dates. At least one of condition, serviceEra or exposureType is required. Filters combine with AND: condition plus exposureType or serviceEra narrows to their intersection, and each filter needs at least one word of three or more characters or the query is refused. A condition description that names a qualifying circumstance, such as a diagnosis that has to come after the qualifying service, states a limit of the presumption rather than a detail beside it. An empty result means no entry satisfies that exact combination, not that the condition is non-presumptive.

check_presumptive_eligibility input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "condition": {
      "type": "string",
      "description": "Condition to check for presumptive status (e.g., \"Parkinson's disease\", \"Hypertension\")."
    },
    "serviceEra": {
      "type": "string",
      "description": "Service era or conflict (e.g., \"Vietnam\", \"Gulf War\", \"Post-9/11\") for era-specific presumptives."
    },
    "exposureType": {
      "type": "string",
      "description": "Known toxic/environmental exposure (e.g., \"Agent Orange\", \"burn pits\", \"Camp Lejeune water\")."
    }
  }
}
check_presumptive_eligibility annotations
{
  "title": "Check presumptive eligibility",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_legal_authority — Search case law and regulations
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran's question needs VA regulations, legal standards or case law by keyword, citation or diagnostic code. It does not read a claim, predict a decision or give legal advice. Returns 38 CFR rating criteria, verbatim doctrine (pinpoints, capture and effective dates, reviewed holdings) and Court of Appeals for Veterans Claims (CAVC) excerpts (docket, case name, relevance); precedential CAVC decisions bind the Board of Veterans' Appeals; memorandum decisions do not. citation is a section ("3.310", "38 U.S.C. 5107(b)"); unreadable ones match nothing; query is optional when citation is supplied. limit: per-source results, default 5, maximum 10; doctrine caps at four with the true total. status: "ok" (all answered, each selected match carried), "partial" (a match missing, a component unfinished), "no_match" (all answered, none matched), "unavailable" (a component silent: nothing reads as absence of authority); statusReason says why. A truncation object (any status): doctrinePropositionsTrimmed counts entries serving only their first propositions (each with its true total); textBounded, a criterion withheld whole (row: criteriaOmitted, withheld length); resultsDropped, uncarried matches per regulatory, caseLaw and doctrine; responseTrimmedForSize, shed for size. Dockets and case names come only from results; it says if the case-law corpus is empty. citationResolved: true on positive evidence, false only after a full corpus scan, else null (open); citationStatus: resolved, unresolved, unknown, unparsed or not_supplied. coverage: citationScanComplete, candidateScansComplete, incompleteCandidateScans (components whose scan window filled before all candidates were examined), truncatedComponents, doctrineMatchedOn (doctrine from citation, query or standing authorities), searchComplete; with totalsAreMeasuredCounts false, a zero speaks for this search only.

search_legal_authority input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "number",
      "description": "Max results (default 5, max 10)."
    },
    "query": {
      "type": "string",
      "description": "Search query (e.g., \"PTSD secondary to MST\", \"DC 8100 migraine 50 percent criteria\", \"CUE in combined rating calculation\"). Optional when citation is supplied; supply query, citation, or both."
    },
    "citation": {
      "type": "string",
      "description": "Exact citation to look up (e.g., \"3.310\", \"38 CFR 3.310(b)\", \"4.16\", \"38 U.S.C. 5107(b)\"). Sufficient on its own: a call with only a citation is answered as a citation lookup. A citation that cannot be read as a CFR or USC section matches nothing and is reported."
    },
    "diagnosticCode": {
      "type": "string",
      "description": "Filter by diagnostic code (e.g., \"8100\")."
    }
  }
}
search_legal_authority annotations
{
  "title": "Search case law and regulations",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
prepare_cp_exam — Prepare for a C&P exam
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran has a VA compensation and pension examination scheduled for a condition and wants to know what it involves. It does not schedule, reschedule or contact VA, and the examiner's findings and VA decide the rating. Returns the examination type and typical length, what the examiner does, the questions examiners commonly ask, the Disability Benefits Questionnaire sections that apply, and records worth bringing. It does not return advice about what to describe, emphasize or omit at the examination. For a condition with a guide on file it also returns the diagnostic code for that condition and where its rating criteria are published, which are what the examiner's findings are scored against; any other condition returns a general exam guide. Educational reference about the examination process.

prepare_cp_exam input schema
{
  "type": "object",
  "required": [
    "condition"
  ],
  "properties": {
    "condition": {
      "type": "string",
      "description": "Condition being examined (e.g., \"PTSD\", \"knee\", \"sleep apnea\", \"tinnitus\")."
    },
    "currentRating": {
      "type": "number",
      "description": "Current rating if already rated (for increase exams). Optional."
    }
  }
}
prepare_cp_exam annotations
{
  "title": "Prepare for a C&P exam",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
lookup_compensation_rate — Look up monthly compensation rate
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran wants the monthly VA disability compensation amount for a given rating percentage and dependent situation. It gives the published rate for that combination, not what a specific veteran is paid, and it is not a back-pay calculation for a past period. Returns the monthly and annual amounts from the VA compensation rate table in effect, with the rate year and effective date. The rating is read to the nearest 10 percent, and dependents change the amount only at 30 percent and above. Children are counted as children under 18; school-age children 18 to 23, dependent parents and aid and attendance are outside what it models.

lookup_compensation_rate input schema
{
  "type": "object",
  "required": [
    "rating"
  ],
  "properties": {
    "rating": {
      "type": "number",
      "description": "Disability rating percentage (0–100, rounded to nearest 10)."
    },
    "hasSpouse": {
      "type": "boolean",
      "description": "Whether veteran has a spouse. Affects rates at 30%+. Defaults to false."
    },
    "childrenCount": {
      "type": "number",
      "description": "Dependent children under 18. Affects rates at 30%+. Defaults to 0."
    }
  }
}
lookup_compensation_rate annotations
{
  "title": "Look up monthly compensation rate",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
compute_retroactive_pay — Estimate retroactive back pay
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran gives an effective date and a VA rating increase and asks what the retroactive amount would be. It does not set an effective date and it does not report an amount VA has authorized. Returns an estimate of the difference in monthly compensation for each month of the period, with a per-month breakdown, the assumptions behind it, and its own disclaimer. Under 38 CFR 3.31 payment starts on the first day of the month FOLLOWING the month the award became effective, with no exception when the effective date is itself the first of a month, and the period runs through the month of adjudication, which is counted in full. VA rate tables take effect on December 1, so a payment year runs from December 1 through November 30 and December of one year is paid at the next payment year rates. Each month of the breakdown reports the payment year it was paid from (rateYear), that table effective date (rateTableEffectiveDate) and where the table came from (rateSource), and the tables the period drew on are listed once each in rateTables; a published table carries the VA page it was transcribed from, and a reconstructed table carries none, because it is derived rather than transcribed. Monthly rates for payment years 2000 onward are read from VA published rate tables; earlier years are reconstructed from the current published table back-adjusted by the SSA cost-of-living chain, and the result states which of the two the requested period used. A month past the newest published table is served from the newest one available, and the result then reports totalIsExact false with incompleteReason naming those months. The total is an estimate either way, because dependent status is taken as constant across the period. It handles an increase only: the new rating has to be higher than the previous one, and effective dates before 1990 are refused.

compute_retroactive_pay input schema
{
  "type": "object",
  "required": [
    "effectiveDate",
    "fromRating",
    "toRating",
    "hasSpouse",
    "dependentCount"
  ],
  "properties": {
    "isTdiu": {
      "type": "boolean",
      "description": "Whether the new rating includes TDIU (treats as 100% for $)."
    },
    "toRating": {
      "type": "number",
      "description": "New VA rating percentage (0-100)."
    },
    "hasSpouse": {
      "type": "boolean",
      "description": "Whether the veteran was married during the period."
    },
    "fromRating": {
      "type": "number",
      "description": "Previous VA rating percentage (0-100)."
    },
    "effectiveDate": {
      "type": "string",
      "description": "ISO date YYYY-MM-DD of rating change effective date."
    },
    "dependentCount": {
      "type": "number",
      "description": "Number of dependent children under 18."
    },
    "adjudicationDate": {
      "type": "string",
      "description": "ISO date the rating decision was issued. Defaults to today."
    }
  }
}
compute_retroactive_pay annotations
{
  "title": "Estimate retroactive back pay",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_claim_help — Find free and accredited claim help
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran asks who can help with a VA disability claim, or describes a crisis. VeteranHQ does not prepare or file claims or forms, and only VA decides a claim. need crisis puts the full Veterans Crisis Line first and alone returns crisis content; urgent true tops routeNow with the first action, crisis routing unchanged. Results list accredited Veterans Service Organizations (free), attorneys and claims agents (fees only for representation provided after VA’s notice of an initial decision, 38 CFR 14.636(c), 38 U.S.C. 5904(c)(1)), VA’s accreditation search and representative finder, VA phone numbers, documents to bring, form links, and the veterans agency for a two-letter state code (none on file: stateAgency null, coverage.stateResolved false). It names no individual, firm or private directory and reads no account data. askedFor (the veteran’s words) does not change or withhold the routing: a request to act as the veteran’s attorney, agent or representative before VA, to supply words for a veteran or a clinician to use (statements or nexus letters, new, rewritten, polished, tightened or cleaned up), to choose a decision review lane for the veteran, or to prepare or file a claim returns status ok, the same findings and a boundary. Its kind names the primary boundary crossed; kinds lists every boundary the request crossed, in the fixed precedence representation_request, then words_for_testimony, then review_lane_choice, then preparation_request. Its opening, rule and route state, one sentence per kind in kinds, what VeteranHQ does not do, the accreditation and fee rules and where the work belongs, and lead message after any crisis line. sources holds each reference once by stable id (citation, VA page or form slug, or product-boundary, no url), cited by sourceIds; a line’s passage is line.quote or its entry’s quote; state agency pages stay on the line.

find_claim_help input schema
{
  "type": "object",
  "required": [
    "need"
  ],
  "properties": {
    "need": {
      "enum": [
        "file_first_claim",
        "pending_claim",
        "decision_received",
        "increase",
        "secondary",
        "exam",
        "representation",
        "records",
        "crisis",
        "general"
      ],
      "type": "string",
      "description": "What the veteran is trying to do. Use general when the veteran has not said, and crisis when they describe a mental health emergency."
    },
    "state": {
      "type": "string",
      "description": "Two-letter US state or territory code, for example CA, TX or PR. Adds that state veterans agency to the answer. Omit it when the veteran has not said where they live."
    },
    "urgent": {
      "type": "boolean",
      "description": "True when the request is time sensitive, for example a letter, an exam notice or a date the veteran is worried about. It puts their first action at the top of the answer. It does NOT change the crisis routing: use need crisis when the veteran describes a mental health emergency."
    },
    "askedFor": {
      "type": "string",
      "description": "What the veteran asked for, in their own words, when they are available. It changes nothing about the routing and does not withhold it. A request that this tool act as the veteran's representative, attorney or agent before VA, to prepare or file a claim, to choose a decision review lane for the veteran, or to supply words for a veteran or a clinician to use returns the same answer with a boundary object added, naming what VeteranHQ does not do, the accreditation and fee rules and where the work belongs; its kinds array lists every one of those classes the request crossed, in the precedence representation_request, words_for_testimony, review_lane_choice, preparation_request, and kind is the first of them. Ordinary requests for help are answered with no boundary object."
    }
  }
}
find_claim_help annotations
{
  "title": "Find free and accredited claim help",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_guides — Search the VeteranHQ guides
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran asks about a VA topic VeteranHQ has written a guide on. It searches only the VeteranHQ guide library and reads no account data, so the answer is the same for every caller with the same inputs. Returns the guides whose text matches the query, highest scoring first, each carrying the guide slug, title, summary and public URL, and no body text. The ordering is lexical and deterministic, computed from where each word of the query appears: a match in the guide title scores above one in the summary, a summary match above one in a section heading, and a heading match above one in the body, with an added score when every word of the query appears somewhere and a further one when the whole query appears in a title. Guides tied on score are ordered by slug, so the same query returns the same list in the same order on every call. No model runs and no network call is made. The limit parameter caps how many guides come back, from 1 to 10, default 5. An empty results array means no guide in this library contains any word of the query, which is a fact about the library and not about VA rules or about what VA holds. Reading one is a second call: pass a returned slug to get_guide.

search_guides input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 10,
      "minimum": 1,
      "description": "How many guides to return, 1 to 10. Default 5."
    },
    "query": {
      "type": "string",
      "description": "What the veteran is asking about, in keywords or a short phrase, for example \"C&P exam\" or \"how do I get my military medical records\"."
    }
  }
}
search_guides annotations
{
  "title": "Search the VeteranHQ guides",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_guide — Read a VeteranHQ guide
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran needs what a VeteranHQ guide on a VA topic says, given a slug from search_guides. A guide states the rules as VeteranHQ read them from the cited sources on the date it reports, and only VA decides a claim. Returns the slug, title and summary, the date the facts in it were last verified against its sources, the public URL of the guide on veteranhq.app, the body split into the sections the guide itself defines, each with a heading and its text, and the sources the guide cites, each with a title and a URL. A slug this library does not hold returns a tool error carrying GUIDE_NOT_FOUND, whose message says to call search_guides and use a slug from its results. A guide longer than one result can carry returns the sections that fit, plus omittedSections counting the sections left out and a note stating that count and the guide URL. A single section larger than the whole budget is served shortened at a paragraph or sentence boundary, with truncatedSection naming its heading and the note repeating it, so a section that was cut is distinguishable from one served whole. Those three fields are absent when the whole guide is returned, so a shortened answer is distinguishable from a complete one. It reads no account data, so the answer is the same for every caller with the same inputs.

get_guide input schema
{
  "type": "object",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "description": "The guide to read, as returned in the slug field by search_guides."
    }
  }
}
get_guide annotations
{
  "title": "Read a VeteranHQ guide",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_veteran_benefits — Find veterans benefits to check
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when a veteran asks what VA benefits they may qualify for. It returns programs to check, not an eligibility decision: only VA decides who qualifies for a VA benefit, and the agency that runs any other program listed decides for that one. The inputs are the veteran's circumstances as fixed choices, every one optional: service status, combined VA rating or no rating, whether compensation is paid, marriage and whether the spouse is on the award, SMC, TDIU, permanent and total or temporary 100% status, family and TRICARE, VA health care enrollment, a recent paid trip to VA care, a VA home loan, and an honorable discharge. It asks for no names, Social Security numbers, VA file numbers or narrative, and has no field for any. An answer that does not apply given earlier answers is ignored, and nextQuestion names the next question that does. Each program carries why it matched, the steps, its source URL and application URL, and for a spouse not yet on an award an estimated monthly increase when the answers allow one. It covers selected federal programs, not every benefit, and does not screen state or local programs. It reads no account data and stores nothing.

find_veteran_benefits input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "smc": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether VA pays special monthly compensation (SMC)."
    },
    "loan": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether the veteran is buying or refinancing a home with a VA loan."
    },
    "tdiu": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether VA pays at the 100 percent rate through individual unemployability (TDIU)."
    },
    "trip": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether the veteran paid to travel to VA or VA-approved care in the past 30 days."
    },
    "family": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether the veteran has a spouse or dependent child."
    },
    "rating": {
      "enum": [
        "no_rating",
        "0",
        "10",
        "20",
        "30",
        "40",
        "50",
        "60",
        "70",
        "80",
        "90",
        "100"
      ],
      "type": "string",
      "description": "Combined VA disability rating on the latest VA decision, in percent, or no_rating when VA has assigned none. A 0 rating is different from no_rating."
    },
    "spouse": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether the veteran is married."
    },
    "vaCare": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether the veteran is enrolled in VA health care."
    },
    "service": {
      "enum": [
        "veteran",
        "serving"
      ],
      "type": "string",
      "description": "Whether the person has left military service (veteran) or is still serving (serving)."
    },
    "skipped": {
      "type": "array",
      "items": {
        "enum": [
          "service",
          "rating",
          "compensation",
          "spouse",
          "spouseOnAward",
          "awardAlone",
          "smc",
          "tdiu",
          "permanentTotal",
          "temporaryTotal",
          "family",
          "tricare",
          "vaCare",
          "trip",
          "loan",
          "honorable"
        ],
        "type": "string"
      },
      "maxItems": 16,
      "description": "Question ids the veteran chose not to answer. An id listed here cannot also carry an answer."
    },
    "tricare": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether the family member who needs health coverage is eligible for TRICARE."
    },
    "honorable": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether the veteran was honorably discharged."
    },
    "awardAlone": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether the current award pays the Veteran alone rate, with no dependents."
    },
    "compensation": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether VA disability compensation is being paid."
    },
    "spouseOnAward": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether the spouse is already included in the VA award as a dependent."
    },
    "permanentTotal": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether a VA decision describes the disability as permanent and total."
    },
    "temporaryTotal": {
      "enum": [
        "yes",
        "no"
      ],
      "type": "string",
      "description": "Whether a 100 percent rating is temporary, for hospital care or recovery."
    }
  },
  "additionalProperties": false
}
find_veteran_benefits annotations
{
  "title": "Find veterans benefits to check",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

5 advertised

review_evidence_gaps — Review evidence and open questions

Advertised by the server during the last successful anonymous check.

Walk through what the records state, what is disputed, and what is unresolved, without choosing a filing strategy or listing what to assemble.

No arguments advertised.

explain_rating_decision — Explain a VA decision letter

Advertised by the server during the last successful anonymous check.

Read one identified VA decision back in plain language: the issues, the favorable findings, the stated reasons, and the evidence it says it considered.

No arguments advertised.

prepare_cp_exam — Prepare for a C&P exam

Advertised by the server during the last successful anonymous check.

Explain what a VA compensation and pension examination is for, which records matter, and how to give an accurate account, without supplying answers or measurements.

No arguments advertised.

whats_changed — Compare two versions of a record

Advertised by the server during the last successful anonymous check.

Compare two explicitly identified revisions or dates and report what differs, or say plainly that a change cannot be established without a baseline.

No arguments advertised.

get_started_va_claims_101 — Get started with VA disability claims

Advertised by the server during the last successful anonymous check.

Orientation for a veteran new to VA disability claims: brief triage, how the process is shaped, and how to reach free accredited help.

No arguments advertised.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

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
462 ms
95th percentile latency
462 ms

Maintenance history

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

  • · probe · passed · 462 ms · metadata changed · 14 tool(s), 5 prompt(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 veteranhq-mcp https://api.veteranhq.app/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 veteranhq-mcp --url https://api.veteranhq.app/mcp

Cursor

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

Cline

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

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start veteranhq-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "veteranhq-mcp": {
      "type": "http",
      "url": "https://api.veteranhq.app/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 veteranhq-mcp https://api.veteranhq.app/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://api.veteranhq.app/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": {
    "veteranhq-mcp": {
      "serverUrl": "https://api.veteranhq.app/mcp"
    }
  }
}

Let your agent find its tools

Find servers like VeteranHQ 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 VeteranHQ 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