ironscout
Measured conclusion: Alive, not deep-tested. L2 outcome: not_attempted.
Read-only ammo pricing: offer search, caliber market snapshots, retailer directory. Descriptive.
| Author | jeb-scarbrough |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Alive, not deep-tested |
| L1 liveness | alive |
| L1 latency | 142 ms |
| Endpoint region | Global |
| Languages | EN |
| Last measured | 2026-10-26 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"ironscout": {
"url": "https://mcp.ironscout.ai/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (5)
search_offersread-onlySearch canonical ammunition products and their current per-retailer offers. Results are descriptive only — prices, availability, $/round, observation time, and provenance, with no verdicts, scores, or recommendations. Use each offer's `outUrl` for outbound links (do not rewrite it). `sort` is a mechanical ordering, never a judgement.
Parameters:
q— string — Free-text query over product name/brand/description.case— string — Case material, e.g. "Brass", "Steel".page— integersort— string — Mechanical ordering only. Defaults to pricePerRoundAsc.brand— stringgrain— integer — Bullet weight in grains.caliber— string — Canonical caliber, e.g. "9mm" or ".223/5.56".inStock— boolean — When true, only products with in-stock offers are returned.pageSize— integerroundCountMax— integerroundCountMin— integer
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
get_productread-onlyFetch a single canonical product by its `canonicalProductId`, with current per-retailer offers. Descriptive only. Returns an `error_v1` body with `NOT_FOUND` if the id is unknown.
Parameters:
canonicalProductId(required) — string — Canonical product id (CUID) from search results.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
get_market_snapshotread-onlyCaliber-level price distribution (median, p25, p75, min, max) over a rolling window. Purely descriptive statistics with methodology and sample counts; never a forecast or recommendation. Returns `error_v1` `NOT_FOUND` when no snapshot exists for the caliber/window. When `extremaSuppressedByPolicy` is `true`, `min`, `max` and both `segments.*.min` / `segments.*.max` are `null` BY POLICY rather than for lack of data: that caliber's published extremes are withheld pending revalidation. The median, quartiles, `p95`, segment medians and counts remain valid and complete — `p95` is a percentile over the whole window rather than a single observation, so it is not withheld. Do not infer or substitute a floor for those calibers, and do not treat `p95` as a stand-in for the withheld `max`. This is distinct from `dataStatus: "INSUFFICIENT_DATA"`, which means the sample was too thin to compute anything.
Parameters:
caliber(required) — string — Canonical caliber, e.g. "9mm".windowDays— Rolling window in days. 7 or 30; defaults to 30.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
list_calibersread-onlyEnumerate every canonical caliber IronScout recognizes, each flagged with whether a current market snapshot exists and its sample count. Calibers without a snapshot are still listed (with `hasSnapshot: false`).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
list_retailersread-onlyList currently eligible/visible retailers. Ineligible retailers are omitted entirely (fail-closed, ADR-005). Descriptive directory only.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.