Skip to main content
Glama

blastcheck-mcp

An MCP server that gives coding agents (Claude Code, Claude Desktop, Cursor, and any other MCP client) the ability to assess Terraform plans with blastcheck: produce an Impact Manifest - a machine-readable change-safety assertion - and explain it in plain language.

Read-only and propose-only. No tool applies Terraform, mutates a cloud resource, or accepts a credential. This release performs no network I/O at all: everything runs offline against the plan file.

Quickstart

Requires Python 3.10+ and uv. No install step; the first run resolves everything:

uvx blastcheck-mcp

Claude Code

claude mcp add blastcheck -- uvx blastcheck-mcp

Claude Desktop

Add to claude_desktop_config.json (Settings > Developer > Edit Config):

{
  "mcpServers": {
    "blastcheck": {
      "command": "uvx",
      "args": ["blastcheck-mcp"]
    }
  }
}

Cursor

Add to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):

{
  "mcpServers": {
    "blastcheck": {
      "command": "uvx",
      "args": ["blastcheck-mcp"]
    }
  }
}

Related MCP server: Understand-Anything MCP Server

Using it

Ask your agent to check a plan:

terraform plan -out plan.tfplan
terraform show -json plan.tfplan > plan.json

Then: "run blastcheck on plan.json and explain what could go wrong." The agent will call impact_emit, get a manifest handle plus a verdict summary, and follow up with impact_explain for the full picture. (impact_emit also accepts the saved .tfplan directly and converts it.)

Tools

impact_emit

Runs blastcheck's plan-only analysis on a terraform show -json file (or a saved .tfplan) and returns:

  • manifest_handle - a short reference to the full Impact Manifest, written to a private temp file (0600, per-user 0700 directory, kept at most 24h). Pass it to impact_explain instead of shuttling the large document through model context.

  • summary - the verdict, per-severity counts, which changes drove it, and the plan-only note.

A plan-only run can never emit safe - it never verified live state, and blastcheck says so rather than guessing. That is the point of the format.

impact_explain

Turns a manifest into markdown a human can act on: the verdict and why, each change's noteworthy findings with their rationales, a "safe if ..." checklist of unmet preconditions, and exactly what could not be verified. Deterministic local code; accepts a manifest_handle, a manifest_path, or the manifest inline (exactly one).

Output is capped by a hard budget (BLASTCHECK_MCP_EXPLAIN_BUDGET env, default 32000 characters, about 8K tokens) so the tool can never consume a session's context in one call. Small plans render in full. Large plans get a compact view: dimensions identical across every change are stated once, changes with identical assessments are grouped with numeric indexes compressed to ranges (app[0..11]) - for_each string keys are never wildcarded, so which tenants or keys are affected stays visible - and blocking changes always keep their complete address list, dropping only per-change repetition. Whenever anything is grouped or cut, an explicit partial-view notice says so and shows the exact follow-up calls; all lists are lexically sorted before any cut, so the same plan always shows the same subset. Never a silent drop.

Drill-down filters (optional, combined with AND):

  • severity - e.g. ["blocking"] or ["blocking", "caution"]

  • module_prefix - address prefix, e.g. "module.tenants[\"contoso-prod\"]"

  • resource_type - exact type, e.g. "azurerm_managed_disk"

  • addresses - exact addresses, always rendered in full detail; the guaranteed path to any specific change

Compatibility

Verified against real clients and across MCP protocol eras (v0.1.0-rc1, mcp SDK 2.x, macOS, Python 3.13):

Check

Result

Protocol 2024-11-05 (oldest era)

negotiated, tools list + calls work

Protocol 2025-03-26

negotiated, tools list + calls work

Protocol 2025-06-18

negotiated, tools list + calls work

Unknown version offered

server answers with its latest, per spec

Claude Code 2.0.76 (stdio)

connects; both tools exercised end to end in four separate headless runs (see cold-install row for the published-package run). Investigated note: when driving headless claude -p sessions from INSIDE another Claude Code session (a nested test rig), intermittent multi-minute client startup stalls were observed; process inspection showed they occur before the MCP server process is even spawned, and the identical command succeeds on retry with no changes, so they are attributed to the nested test environment rather than this server. No stall has ever been observed outside that nested rig.

Cold install (uvx from PyPI, v0.1.0)

verified on a clean shell outside the repo with no local venv: uvx blastcheck-mcp resolved the published package (30 packages) and started; claude mcp add blastcheck -- uvx blastcheck-mcp then claude mcp list reported Connected; one end-to-end run through Claude Code called impact_emit and impact_explain (with a severity filter) and returned the correct verdict and blocking address.

Interactive session

the standing registration for interactive use points at the published uvx blastcheck-mcp and reports Connected from the same client binary interactive sessions use. All tool-call verification so far is headless (the automated rig cannot drive a GUI session); no failure mode specific to interactive use is known or expected.

Claude Desktop

config block above is the documented uvx form; not yet exercised on this machine

Cursor

config block above is the documented uvx form; not yet exercised (Cursor not installed on the test machine)

Large-plan compression

verified against a synthetic 288-change fixture ONLY (nested modules, for_each string keys, count indexes; 372KB full render compressed to a 12.5KB overview). NOT yet verified against a large real-world plan - if real changes fingerprint less uniformly, overviews will be larger; the hard output budget still caps them and the partial-view notice still applies.

Errors

Failures come back as CODE: one clear sentence - for example FILE_NOT_FOUND: no such file: plan.json or MANIFEST_UNSUPPORTED_VERSION: ... - never a stack trace.

Data boundary

This release sends nothing anywhere: no telemetry, no API calls, no network I/O. Raw plan JSON never leaves the machine.

A future release adds an optional CloudRift tier (live cost, dependency and tenant enrichment; see docs/remote-tier.md). Its boundary is already implemented and tested in this codebase, before any network code exists: if a manifest is ever scored remotely, what leaves the machine is an identity-only projection - per change: address, resource type, name, Terraform provider address, and actions; plus the manifest's schema_version, generated_at, producer name/version, and source type. Evidence, rationales, verdicts, attribute values (ports, CIDRs, sizes), and the plan itself are stripped by an explicit allowlist, so a future manifest field is excluded by default rather than leaked by default. That tier will require an explicit CLOUDRIFT_API_TOKEN; without one, the server registers the local tools only.

Environment variables

Variable

Effect

BLASTCHECK_MCP_EXPLAIN_BUDGET

Hard cap, in characters, on impact_explain output (default 32000, floor 4000). Over the cap, a compact grouped view with an explicit partial-view notice is returned instead - never a silent cut.

CLOUDRIFT_API_TOKEN

Reserved for the future remote tier. If set today, the server notes on stderr that the remote tier is not in this release and runs the local tools only. Credentials are NEVER accepted as tool arguments.

Development

python3 -m venv .venv
.venv/bin/pip install -e ".[test]"
.venv/bin/pytest

The suite is fully offline. tests/test_project.py holds the data-boundary tests; treat a failure there as a stop-ship.

Relationship to blastcheck and the spec

blastcheck-mcp is a thin MCP layer over the blastcheck library (pinned >=0.7,<0.8) and implements a consumer of the Impact Manifest specification (schema major version 0). The manifest schema is read from blastcheck's own vendored copy, so there is no second copy to drift.

License

Apache-2.0. See LICENSE.

Available Tools

2 tools
impact_emitA
Read-only

Produce an Impact Manifest (a machine-readable change-safety assertion) from a Terraform plan, using blastcheck.

plan_path may point at terraform show -json output or at a saved .tfplan file (converted automatically). The analysis is offline and plan-only: nothing is sent anywhere, no cloud credentials are used, and a plan-only manifest can never claim safe - it says what it verified and what it could not.

Returns a manifest_handle (pass it to impact_explain) plus a short summary. The full manifest is written to a private temp file rather than returned inline, because it is large.

ParametersJSON Schema
NameRequiredDescriptionDefault
plan_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool readOnly and non-destructive. The description goes further and adds materially useful behavioral detail: the analysis is offline and plan-only, no cloud credentials are used, a plan-only manifest can never claim 'safe', and the full manifest is written to a private temp file rather than returned inline due to size. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but every sentence earns its place: purpose, parameter format, safety/behavioral caveats, and return value are each covered in a clean, front-loaded structure. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one parameter, safety annotations, an output schema, and a single sibling, the description covers everything needed: what it produces, what input it accepts, key limitations, the handle-based return contract, and the follow-up tool. Nothing important is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides no description for plan_path (0% coverage), so the description carries the full burden. It does this excellently by specifying that plan_path may point at 'terraform show -json' output or a saved .tfplan file, and that conversion is automatic. This is exactly the semantic information an agent needs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Produce an Impact Manifest... from a Terraform plan, using blastcheck.' It clearly states what the tool creates and from what input, and distinguishes it from the obvious sibling impact_explain by noting the returned handle is meant to be passed there.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use impact_emit: when you need to generate a plan-only Impact Manifest from a Terraform plan. It explicitly routes the downstream step to impact_explain via the manifest_handle. It does not spell out 'when not to use' or formal alternatives, but the relationship to impact_explain is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

impact_explainA
Read-only

Explain an Impact Manifest in plain language.

Provide exactly one of: manifest_handle (from impact_emit), manifest_path (a manifest JSON file on disk), or manifest (the document inline). Returns markdown covering the verdict and why, each change's noteworthy findings, a "safe if ..." checklist of unmet preconditions, and what could not be verified.

Output is capped by a hard budget (BLASTCHECK_MCP_EXPLAIN_BUDGET env, default 32000 characters). Large plans get a compact grouped view with an explicit partial-view notice - never a silent cut. Drill down with the optional filters, which combine with AND: severity (e.g. ["blocking"]), module_prefix (address prefix), resource_type (exact, e.g. "azurerm_managed_disk"), and addresses (exact addresses, always rendered in full detail - the guaranteed path to any specific change). All lists are lexically sorted before any cut, so the same plan always shows the same subset.

Purely local and deterministic; nothing is sent anywhere.

ParametersJSON Schema
NameRequiredDescriptionDefault
manifestNo
severityNo
addressesNo
manifest_pathNo
module_prefixNo
resource_typeNo
manifest_handleNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/destructive annotations, the description discloses substantial behavior: a hard character budget with an env-var override, compact grouped rendering with an explicit partial-view notice ('never a silent cut'), AND-combined filters, addresses always rendered in full detail, and lexical sorting for deterministic output. These are exactly the non-obvious traits that would otherwise surprise an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Despite its length, every sentence earns its place: purpose, input modes, output format, budget behavior, filter semantics, and determinism. The most decision-relevant info (what it does, what to provide) is front-loaded, and no sentence repeats the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 optional parameters, an output schema, and meaningful failure/edge behavior (budget overruns, partial views), the description is complete. An agent can correctly select an input mode, choose filters, and predict the response shape without opening the schema or chasing external docs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden — and it delivers. All 7 parameters get meaningful semantics: manifest_handle's provenance, manifest_path's on-disk nature, manifest as inline document, severity with an example value, module_prefix as address prefix, resource_type with an exact-match caveat and example, and addresses as the guaranteed full-detail path. It fully compensates for the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb-plus-resource statement ('Explain an Impact Manifest in plain language') and then details the output contents (verdict, findings, safe-if checklist, unverifiable items), making the tool's job unmistakable. The explain/emit verb pair cleanly distinguishes it from the only sibling, impact_emit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on the three mutually exclusive input modes (manifest_handle 'from impact_emit', manifest_path on disk, manifest inline) and how the optional filters narrow the view. It stops short of an explicit when-not-to-use statement relative to impact_emit, but the pointer that manifest_handle comes 'from impact_emit' effectively orients the agent to the sibling's role.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 2 tool updatesv0.1.0
    • First observedimpact_emit
    • First observedimpact_explain

TDQS

A4.7/5.0
Disambiguation5/5

The two tools have clearly distinct roles: impact_emit produces a manifest from a Terraform plan, while impact_explain consumes an existing manifest and explains it. There is no overlap or possible misselection between them.

Naming Consistency5/5

Both tools follow the same predictable prefix-plus-verb pattern: impact_emit and impact_explain. The naming is consistent and immediately signals the shared domain and the action each tool performs.

Tool Count3/5

Two tools is on the thin side by the general rubric, but the server has a very narrow purpose: emit and explain impact manifests. The pair is reasonable for that scope, though it barely crosses the 'feels thin' boundary.

Completeness5/5

For the stated domain, the lifecycle is complete: impact_emit generates a manifest from a plan, and impact_explain supports all reasonable input paths (handle, file, or inline) and offers filtering for drill-down. There are no obvious missing operations for this focused workflow.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/prococonsulting/blastcheck-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server