Physics interior-ballistics solver: solves, ladders, trajectory, lookups. Published error rates.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Check whether a cartridge+powder pair RESOLVES in the served database and whether the published-reference corpus contains a row for the pair (nearest-bullet membership — the same membership that decides a ladder's basis). Answers membership and canonical identity ONLY; it never serves the corpus row's numbers. Identity + published dimensional metadata only — NOT load data (rights-class discipline): no charge/velocity/pressure values are served by this tool.
Bullet weight in grains (optional; enables corpus-membership answer)
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http ibc-mcp https://reloadingcalc.com/mcp
Headers
Authorization (optional, not in the config above)Check whether a cartridge+powder pair RESOLVES in the served database and whether the published-reference corpus contains a row for the pair (nearest-bullet membership — the same membership that decides a ladder's basis). Answers membership and canonical identity ONLY; it never serves the corpus row's numbers. Identity + published dimensional metadata only — NOT load data (rights-class discipline): no charge/velocity/pressure values are served by this tool.
| Argument | Type | Description |
|---|---|---|
| powder* | string | |
| bullet_gr | number | Bullet weight in grains (optional; enables corpus-membership answer) |
| cartridge* | string |
{
"type": "object",
"required": [
"cartridge",
"powder"
],
"properties": {
"powder": {
"type": "string"
},
"bullet_gr": {
"type": "number",
"description": "Bullet weight in grains (optional; enables corpus-membership answer)"
},
"cartridge": {
"type": "string"
}
}
}PREFERRED for load development: generate a work-up ladder (>=5 rungs required — coarser requests are refused LADDER_TOO_COARSE, never silently interpolated) from the published-reference or charge-only bookends down, with per-rung trajectory nodes and the full safety envelope. Requires an API key or subscriber token — anonymous callers are refused pre-compute. Returns the SAME envelope as POST /v1/ladder. SAFETY (verbatim policy): Returns modeled pressure and velocity from a physics solver, plus a safety envelope. This is NOT published load data. Always present the envelope, warnings, and disclaimer to the user; never state a single charge weight as a recommendation. Pressure fields (p_max_bar, p_max_psi, saami_max_bar) are modeled compliance-vs-SAAMI-ceiling indicators on the model's CUP-equivalent scale, while pressure_percent_saami is reported piezo-equivalent: the percent equals p_max_bar x 1.2783 / saami_max_bar, so it is NOT peak / ceiling as served. Not measured proof pressures and not accuracy-validated numbers: the validation corpus is velocity-only. Treat them as position relative to the ceiling, with real-world spread unknown. not_for_loading_decisions_without_published_data: this result is a model output. Do not work up a load from it alone — cross-check against published data for your exact components before loading.
| Argument | Type | Description |
|---|---|---|
| bullet* | string | Projectile display name or projectile.csv id |
| powder* | string | Propellant name or propellant.csv id |
| primer | any | Primer identity — accepted for forward compatibility |
| caliber* | string | Cartridge name or caliber.csv id |
| n_rungs | integer | Number of ladder rungs (3–10, default 7) |
| charge_gr | any | Current charge (enables sensitivity + next-rung marker) |
| firearm_type | any | Revolver cylinder-gap override: 'auto' (default), 'revolver', or 'not_revolver' (rifle/pistol) |
| barrel_len_in* | number | Barrel length in inches |
| powder_temp_c | any | Powder temperature in °C (optional; -29..+49 validated band) |
| cartridge_oal_in | any | Cartridge overall length in inches (default: caliber max OAL) |
{
"type": "object",
"required": [
"caliber",
"bullet",
"powder",
"barrel_len_in"
],
"properties": {
"bullet": {
"type": "string",
"title": "Bullet",
"maxLength": 200,
"minLength": 1,
"description": "Projectile display name or projectile.csv id"
},
"powder": {
"type": "string",
"title": "Powder",
"maxLength": 200,
"minLength": 1,
"description": "Propellant name or propellant.csv id"
},
"primer": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
],
"title": "Primer",
"default": null,
"description": "Primer identity — accepted for forward compatibility"
},
"caliber": {
"type": "string",
"title": "Caliber",
"maxLength": 200,
"minLength": 1,
"description": "Cartridge name or caliber.csv id"
},
"n_rungs": {
"type": "integer",
"title": "N Rungs",
"default": 7,
"maximum": 10,
"minimum": 3,
"description": "Number of ladder rungs (3–10, default 7)"
},
"charge_gr": {
"anyOf": [
{
"type": "number",
"maximum": 200,
"minimum": 0.5
},
{
"type": "null"
}
],
"title": "Charge Gr",
"default": null,
"description": "Current charge (enables sensitivity + next-rung marker)"
},
"firearm_type": {
"anyOf": [
{
"enum": [
"auto",
"revolver",
"not_revolver"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Firearm Type",
"default": null,
"description": "Revolver cylinder-gap override: 'auto' (default), 'revolver', or 'not_revolver' (rifle/pistol)"
},
"barrel_len_in": {
"type": "number",
"title": "Barrel Len In",
"maximum": 60,
"description": "Barrel length in inches",
"exclusiveMinimum": 0.5
},
"powder_temp_c": {
"anyOf": [
{
"type": "number",
"maximum": 80,
"minimum": -60
},
{
"type": "null"
}
],
"title": "Powder Temp C",
"default": null,
"description": "Powder temperature in °C (optional; -29..+49 validated band)"
},
"cartridge_oal_in": {
"anyOf": [
{
"type": "number",
"maximum": 20,
"exclusiveMinimum": 0.2
},
{
"type": "null"
}
],
"title": "Cartridge Oal In",
"default": null,
"description": "Cartridge overall length in inches (default: caliber max OAL)"
}
},
"description": "/v1/ladder DTO: same input contract as the web ladder request\n(SolveRequest pattern), unit-suffix policy ENFORCED via\nextra=forbid + the INVALID_UNITS mapping in validation_problem.",
"additionalProperties": false
}Look up ONE cartridge in the served component database (census: mode != 'hidden' AND geloescht == 0) by name, CIP name, alternate name, or id — returns the published dimensional spec (pmax_bar, case volume, bore/case dimensions, max OAL). Identity + published dimensional metadata only — NOT load data (rights-class discipline): no charge/velocity/pressure values are served by this tool.
| Argument | Type | Description |
|---|---|---|
| cartridge* | string | Cartridge name, CIP name, alternate name, or numeric id |
{
"type": "object",
"required": [
"cartridge"
],
"properties": {
"cartridge": {
"type": "string",
"description": "Cartridge name, CIP name, alternate name, or numeric id"
}
}
}List propellants in the served database (optionally filtered by manufacturer substring), with the GRT attributes the solver uses (Ba, Qex). Identity + published dimensional metadata only — NOT load data (rights-class discipline): no charge/velocity/pressure values are served by this tool.
| Argument | Type | Description |
|---|---|---|
| manufacturer | string | Optional manufacturer substring filter (e.g. 'Hodgdon') |
{
"type": "object",
"properties": {
"manufacturer": {
"type": "string",
"description": "Optional manufacturer substring filter (e.g. 'Hodgdon')"
}
}
}Solve one internal-ballistics point: modeled velocity/energy/pressure for an exact cartridge+bullet+powder+charge specification, wrapped in the non-removable safety envelope (charge range, closed-enum warnings, assumptions). Returns the SAME envelope as POST /v1/solve. For load DEVELOPMENT prefer generate_load_ladder (a work-up ladder with per-rung nodes). SAFETY (verbatim policy): Returns modeled pressure and velocity from a physics solver, plus a safety envelope. This is NOT published load data. Always present the envelope, warnings, and disclaimer to the user; never state a single charge weight as a recommendation. Pressure fields (p_max_bar, p_max_psi, saami_max_bar) are modeled compliance-vs-SAAMI-ceiling indicators on the model's CUP-equivalent scale, while pressure_percent_saami is reported piezo-equivalent: the percent equals p_max_bar x 1.2783 / saami_max_bar, so it is NOT peak / ceiling as served. Not measured proof pressures and not accuracy-validated numbers: the validation corpus is velocity-only. Treat them as position relative to the ceiling, with real-world spread unknown. not_for_loading_decisions_without_published_data: this result is a model output. Do not work up a load from it alone — cross-check against published data for your exact components before loading.
| Argument | Type | Description |
|---|---|---|
| bullet* | string | Projectile display name ('Mfr Product (W gr)') or projectile.csv id |
| powder* | string | Propellant name ('Alliant Blue Dot') or propellant.csv id |
| primer | any | Primer identity — accepted for forward compatibility; the engine does not model primers yet |
| caliber* | string | Cartridge name or caliber.csv id |
Trajectory / drop table: point-mass (3-DOF) exterior solve fed by the modeled muzzle velocity for an exact cartridge+bullet+powder+charge spec (or an explicit muzzle_velocity_fps override). Returns range rows (drop, velocity, energy, windage) plus the model assumptions. Beta keys get the table to 300 yd (the same PREFIX the web free tier gets); subscriber keys get the full table. No pressure figures on this surface. SAFETY (verbatim policy): Returns modeled pressure and velocity from a physics solver, plus a safety envelope. This is NOT published load data. Always present the envelope, warnings, and disclaimer to the user; never state a single charge weight as a recommendation. Pressure fields (p_max_bar, p_max_psi, pressure_percent_saami, saami_max_bar) are modeled compliance-vs-SAAMI-ceiling indicators, not measured proof pressures and not accuracy-validated numbers: the validation corpus is velocity-only. Treat them as position relative to the ceiling, with real-world spread unknown. not_for_loading_decisions_without_published_data: this result is a model output. Do not work up a load from it alone — cross-check against published data for your exact components before loading.
| Argument | Type | Description |
|---|---|---|
| bullet* | string | Projectile display name ('Mfr Product (W gr)') or projectile.csv id |
| powder* | string | Propellant name or propellant.csv id |
| primer | any | |
| temp_c | number | |
| caliber* | string | Cartridge name or caliber.csv id |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 12, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.
| charge_gr* | number | Powder charge in grains (sanity bounds 0.1..200) |
| weight_gr | any | Bullet weight override in grains (optional). For cast bullets: same mold, different alloy, different weight (a LEE C358-158-SWC can drop 137 gr in pewter/tin vs 158 gr catalog nominal). None = catalog nominal. >20% off nominal emits BULLET_WEIGHT_OUTLIER. |
| firearm_type | any | Revolver cylinder-gap override: 'auto' (default, engine detects from caliber name), 'revolver', or 'not_revolver' (rifle/pistol) |
| barrel_len_in* | number | Barrel length in inches |
| powder_temp_c | any | Powder temperature in °C (optional; -29..+49 validated band, clamped outside). None = ambient (default). |
| cartridge_oal_in | any | Cartridge overall length in inches (default: caliber max OAL) |
{
"type": "object",
"required": [
"caliber",
"bullet",
"powder",
"charge_gr",
"barrel_len_in"
],
"properties": {
"bullet": {
"type": "string",
"title": "Bullet",
"maxLength": 200,
"minLength": 1,
"description": "Projectile display name ('Mfr Product (W gr)') or projectile.csv id"
},
"powder": {
"type": "string",
"title": "Powder",
"maxLength": 200,
"minLength": 1,
"description": "Propellant name ('Alliant Blue Dot') or propellant.csv id"
},
"primer": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
],
"title": "Primer",
"default": null,
"description": "Primer identity — accepted for forward compatibility; the engine does not model primers yet"
},
"caliber": {
"type": "string",
"title": "Caliber",
"maxLength": 200,
"minLength": 1,
"description": "Cartridge name or caliber.csv id"
},
"charge_gr": {
"type": "number",
"title": "Charge Gr",
"maximum": 200,
"minimum": 0.1,
"description": "Powder charge in grains (sanity bounds 0.1..200)"
},
"weight_gr": {
"anyOf": [
{
"type": "number",
"maximum": 2000,
"exclusiveMinimum": 1
},
{
"type": "null"
}
],
"title": "Weight Gr",
"default": null,
"description": "Bullet weight override in grains (optional). For cast bullets: same mold, different alloy, different weight (a LEE C358-158-SWC can drop 137 gr in pewter/tin vs 158 gr catalog nominal). None = catalog nominal. >20% off nominal emits BULLET_WEIGHT_OUTLIER."
},
"firearm_type": {
"anyOf": [
{
"enum": [
"auto",
"revolver",
"not_revolver"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Firearm Type",
"default": null,
"description": "Revolver cylinder-gap override: 'auto' (default, engine detects from caliber name), 'revolver', or 'not_revolver' (rifle/pistol)"
},
"barrel_len_in": {
"type": "number",
"title": "Barrel Len In",
"maximum": 60,
"description": "Barrel length in inches",
"exclusiveMinimum": 0.5
},
"powder_temp_c": {
"anyOf": [
{
"type": "number",
"maximum": 80,
"minimum": -60
},
{
"type": "null"
}
],
"title": "Powder Temp C",
"default": null,
"description": "Powder temperature in °C (optional; -29..+49 validated band, clamped outside). None = ambient (default)."
},
"cartridge_oal_in": {
"anyOf": [
{
"type": "number",
"maximum": 20,
"exclusiveMinimum": 0.2
},
{
"type": "null"
}
],
"title": "Cartridge Oal In",
"default": null,
"description": "Cartridge overall length in inches (default: caliber max OAL)"
}
},
"description": "/v1/solve DTO: same input contract as the web simulate request, but\nthe unit-suffix policy is ENFORCED — unknown/unsuffixed/alternate unit\nfields are 422 (INVALID_UNITS), never silently ignored.",
"additionalProperties": false
}| step_yd |
| number |
| wind_mph | number | Full-value crosswind, left -> right |
| bc_lb_in2 | any | Ballistic coefficient override; default = catalog g7bc (else g1bc) for the bullet |
| charge_gr* | number | Powder charge in grains |
| weight_gr | any | Bullet weight override in grains (optional). For cast bullets: same mold, different alloy, different weight (a LEE C358-158-SWC can drop 137 gr in pewter/tin vs 158 gr catalog nominal). None = catalog nominal. >20% off nominal emits BULLET_WEIGHT_OUTLIER. |
| firearm_type | any |
| max_range_yd | number |
| pressure_hpa | number |
| barrel_len_in* | number | Barrel length in inches |
| drag_function | any | Drag standard of `bc_lb_in2`; default G1 for an override, otherwise whichever catalog BC was used |
| powder_temp_c | any |
| zero_range_yd | number |
| sight_height_in | number |
| cartridge_oal_in | any |
| muzzle_velocity_fps | any | Override; default = the engine's v_max_fps for this load |
{
"type": "object",
"required": [
"caliber",
"bullet",
"powder",
"charge_gr",
"barrel_len_in"
],
"properties": {
"bullet": {
"type": "string",
"title": "Bullet",
"maxLength": 200,
"minLength": 1,
"description": "Projectile display name ('Mfr Product (W gr)') or projectile.csv id"
},
"powder": {
"type": "string",
"title": "Powder",
"maxLength": 200,
"minLength": 1,
"description": "Propellant name or propellant.csv id"
},
"primer": {
"anyOf": [
{
"type": "string",
"maxLength": 64
},
{
"type": "null"
}
],
"title": "Primer",
"default": null
},
"temp_c": {
"type": "number",
"title": "Temp C",
"default": 15,
"maximum": 60,
"minimum": -40
},
"caliber": {
"type": "string",
"title": "Caliber",
"maxLength": 200,
"minLength": 1,
"description": "Cartridge name or caliber.csv id"
},
"step_yd": {
"type": "number",
"title": "Step Yd",
"default": 50,
"maximum": 200,
"minimum": 5
},
"wind_mph": {
"type": "number",
"title": "Wind Mph",
"default": 0,
"maximum": 50,
"minimum": 0,
"description": "Full-value crosswind, left -> right"
},
"bc_lb_in2": {
"anyOf": [
{
"type": "number",
"maximum": 2,
"minimum": 0.01
},
{
"type": "null"
}
],
"title": "Bc Lb In2",
"default": null,
"description": "Ballistic coefficient override; default = catalog g7bc (else g1bc) for the bullet"
},
"charge_gr": {
"type": "number",
"title": "Charge Gr",
"maximum": 200,
"minimum": 0.1,
"description": "Powder charge in grains"
},
"weight_gr": {
"anyOf": [
{
"type": "number",
"maximum": 2000,
"exclusiveMinimum": 1
},
{
"type": "null"
}
],
"title": "Weight Gr",
"default": null,
"description": "Bullet weight override in grains (optional). For cast bullets: same mold, different alloy, different weight (a LEE C358-158-SWC can drop 137 gr in pewter/tin vs 158 gr catalog nominal). None = catalog nominal. >20% off nominal emits BULLET_WEIGHT_OUTLIER."
},
"firearm_type": {
"anyOf": [
{
"enum": [
"auto",
"revolver",
"not_revolver"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Firearm Type",
"default": null
},
"max_range_yd": {
"type": "number",
"title": "Max Range Yd",
"default": 500,
"maximum": 2000,
"minimum": 100
},
"pressure_hpa": {
"type": "number",
"title": "Pressure Hpa",
"default": 1013.25,
"maximum": 1200,
"minimum": 500
},
"barrel_len_in": {
"type": "number",
"title": "Barrel Len In",
"maximum": 60,
"description": "Barrel length in inches",
"exclusiveMinimum": 0.5
},
"drag_function": {
"anyOf": [
{
"type": "string",
"pattern": "^(G1|G7)$"
},
{
"type": "null"
}
],
"title": "Drag Function",
"default": null,
"description": "Drag standard of `bc_lb_in2`; default G1 for an override, otherwise whichever catalog BC was used"
},
"powder_temp_c": {
"anyOf": [
{
"type": "number",
"maximum": 80,
"minimum": -60
},
{
"type": "null"
}
],
"title": "Powder Temp C",
"default": null
},
"zero_range_yd": {
"type": "number",
"title": "Zero Range Yd",
"default": 100,
"maximum": 500,
"minimum": 10
},
"sight_height_in": {
"type": "number",
"title": "Sight Height In",
"default": 1.5,
"maximum": 4,
"minimum": 0.05
},
"cartridge_oal_in": {
"anyOf": [
{
"type": "number",
"maximum": 20,
"exclusiveMinimum": 0.2
},
{
"type": "null"
}
],
"title": "Cartridge Oal In",
"default": null
},
"muzzle_velocity_fps": {
"anyOf": [
{
"type": "number",
"maximum": 5000,
"minimum": 300
},
{
"type": "null"
}
],
"title": "Muzzle Velocity Fps",
"default": null,
"description": "Override; default = the engine's v_max_fps for this load"
}
},
"description": "POST /api/trajectory + MCP trajectory tool DTO — the single source\nof validation truth for BOTH transports (the MCP tool's input schema\nis generated from this class, so what an agent sees is what the\nserver enforces).\n\nLoad fields mirror SimulateRequest (same finite-float / bound\nsemantics); the exterior-ballistics fields are trajectory-specific.\nextra=\"forbid\" mirrors the /v1 unit-suffix discipline: unknown\nfields are 422, never silently ignored.",
"additionalProperties": false
}