blastcheck-mcp
Assesses Terraform plan files with blastcheck, producing an Impact Manifest that summarizes change safety, per-change findings, and preconditions in natural language.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@blastcheck-mcpRun blastcheck on plan.json and explain what could go wrong."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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-mcpClaude Code
claude mcp add blastcheck -- uvx blastcheck-mcpClaude 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.jsonThen: "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 |
Cold install (uvx from PyPI, v0.1.0) | verified on a clean shell outside the repo with no local venv: |
Interactive session | the standing registration for interactive use points at the published |
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/pytestThe 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 toolsimpact_emitARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_explainARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| manifest | No | ||
| severity | No | ||
| addresses | No | ||
| manifest_path | No | ||
| module_prefix | No | ||
| resource_type | No | ||
| manifest_handle | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
2 tool updates
v0.1.0- First observed
impact_emit - First observed
impact_explain
TDQS
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.
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.
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.
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
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
API governance for AI agents. Detects breaking changes, scores blast radius, blocks unsafe calls.
Security reviews for coding agents: diffs checked against your org policy and live infrastructure.
Code intelligence platform for AI agents. 20 tools for architecture, security & impact analysis.
Plan Salesforce deploys, open pull requests and trigger pipelines from your AI client.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides AI coding agents with dependency analysis, impact detection, and build verification tools.-
- AlicenseAqualityBmaintenanceBridges codebase structural analysis, architectural rules, and CI/CD validation with MCP clients, enabling LLMs to check blast radius and prevent breaking changes.1576MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to scan code for security and quality issues and receive machine-readable reports with suggested fixes and verification criteria.722MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI coding agents to query a repository's committed understanding layer—its structure, dependencies, and blast radius—without any setup. Provides tools like sb_blast, sb_impact, and sb_map for exploring impact and key files.3MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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