Skip to main content
Glama

Check Deploy Status

tfstatus
Read-only

MONITORING: Quick status check for Terraform deployments Check the current status of a Terraform deployment job. Use this tool to quickly check if a deployment is running, completed, or failed. Returns job status, job_id, and other metadata without streaming logs. Use tflogs to stream the actual deployment logs. REQUIRES: session_id from convoopen response (format: sess_v2_...). OPTIONAL: job_id to target a specific deployment (use tfruns to discover IDs).

LIVENESS: The response carries two distinct timestamps:

  • updated_at — last semantic change (only bumped when status / drift / version actually differ). Useful for sorting deployments; NOT a per-poll heartbeat.

  • last_refresh_at — last successful Oracle decode (stamped on every poll where reliable reached Oracle, even if nothing in the row changed). Use this to confirm reliable is still actively talking to Oracle for a long-running RUNNING job. Absent on rows that haven't been refreshed since the column was added. šŸ’” TIP: Examine workflow.usage prompt for more context on how to properly use these tools.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "session_id": "<session_id>"
    },
    "name": "tfstatus"
  }
}

Input Schema

NameRequiredDescriptionDefault
job_idNoOptional. Specific job ID to inspect. When omitted, returns the status of the latest job for the session.
session_idYesSession ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing.

Output Schema

NameRequiredDescriptionDefault
foundNoFalse when the session has no job yet.
hintsNoGuidance for the calling agent: what to do next and which tools relate to this result.
job_idNoID of the job reported on.
statusNoJob status, for example 'pending', 'running', 'succeeded' or 'failed'.
job_keyNoJob type key (for example 'apply', 'destroy', 'plan', 'drift').
created_atNoJob creation time (RFC 3339).
session_idNoSession ID this status belongs to.
updated_atNoTime of the job's last status change (RFC 3339).
version_idNoID of the stack version the job ran.
plan_summaryNoSummary of the Terraform plan, for plan and drift jobs.
draft_versionNoDraft stack version number, when a draft exists.
last_event_idNoLog cursor. Pass it to tflogs to fetch only newer entries.
drift_detectedNoTrue when a drift check found differences from the deployed state.
version_numberNoNumber of the stack version the job ran.
version_statusNoStatus of that stack version.
current_versionNoLatest committed stack version number.
last_refresh_atNoTime the backend last polled the deploy runner for this job (RFC 3339).
presets_versionNoTerraform presets version the runner used.
drift_actionableNoTrue when the drift would make Terraform apply changes; false when it is refresh-only noise.
template_versionNoInfrastructure template version the runner used.
has_pending_changesNoTrue when the draft stack differs from the deployed version.
drift_classificationNoPer-resource drift verdicts, when the drift check could classify them.
custom_presets_versionNoTerraform presets version InsideOut composed the stack with.
custom_template_versionNoInfrastructure template version InsideOut composed the stack with.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "created_at": {
      +      "description": "Job creation time (RFC 3339).",
      +      "type": "string"
      +    },
      +    "current_version": {
      +      "description": "Latest committed stack version number.",
      +      "type": "integer"
      +    },
      +    "custom_presets_version": {
      +      "description": "Terraform presets version InsideOut composed the stack with.",
      +      "type": "string"
      +    },
      +    "custom_template_version": {
      +      "description": "Infrastructure template version InsideOut composed the stack with.",
      +      "type": "string"
      +    },
      +    "draft_version": {
      +      "description": "Draft stack version number, when a draft exists.",
      +      "type": [
      +        "null",
      +        "integer"
      +      ]
      +    },
      +    "drift_actionable": {
      +      "description": "True when the drift would make Terraform apply changes; false when it is refresh-only noise.",
      +      "type": [
      +        "null",
      +        "boolean"
      +      ]
      +    },
      +    "drift_classification": {
      +      "description": "Per-resource drift verdicts, when the drift check could classify them.",
      +      "properties": {
      +        "resources": {
      +          "description": "One verdict per drifted resource.",
      +          "items": {
      +            "description": "One drifted resource.",
      +            "properties": {
      +              "action": {
      +                "description": "Terraform actions the drift would cause.",
      +                "items": {
      +                  "description": "One action.",
      +                  "type": "string"
      +                },
      +                "type": [
      +                  "null",
      +                  "array"
      +                ]
      +              },
      +              "address": {
      +                "description": "Terraform resource address.",
      +                "type": "string"
      +              },
      +              "class": {
      +                "description": "Drift class assigned to the resource.",
      +                "type": "string"
      +              },
      +              "name": {
      +                "description": "Terraform resource name.",
      +                "type": "string"
      +              },
      +              "reason": {
      +                "description": "Why the resource got that class.",
      +                "type": "string"
      +              },
      +              "type": {
      +                "description": "Terraform resource type.",
      +                "type": "string"
      +              }
      +            },
      +            "type": [
      +              "null",
      +              "object"
      +            ]
      +          },
      +          "type": [
      +            "null",
      +            "array"
      +          ]
      +        },
      +        "summary": {
      +          "description": "Summary of the drift verdicts.",
      +          "type": "string"
      +        }
      +      },
      +      "type": [
      +        "null",
      +        "object"
      +      ]
      +    },
      +    "drift_detected": {
      +      "description": "True when a drift check found differences from the deployed state.",
      +      "type": "boolean"
      +    },
      +    "found": {
      +      "description": "False when the session has no job yet.",
      +      "type": "boolean"
      +    },
      +    "has_pending_changes": {
      +      "description": "True when the draft stack differs from the deployed version.",
      +      "type": "boolean"
      +    },
      +    "hints": {
      +      "description": "Guidance for the calling agent: what to do next and which tools relate to this result.",
      +      "properties": {
      +        "next_actions": {
      +          "description": "Suggested next steps, in order, often as ready-to-run tool calls.",
      +          "items": {
      +            "description": "One suggested next step.",
      +            "type": "string"
      +          },
      +          "type": [
      +            "null",
      +            "array"
      +          ]
      +        },
      +        "related_tools": {
      +          "description": "Names of tools that are useful after this result.",
      +          "items": {
      +            "description": "A tool name.",
      +            "type": "string"
      +          },
      +          "type": [
      +            "null",
      +            "array"
      +          ]
      +        }
      +      },
      +      "type": [
      +        "null",
      +        "object"
      +      ]
      +    },
      +    "job_id": {
      +      "description": "ID of the job reported on.",
      +      "type": "string"
      +    },
      +    "job_key": {
      +      "description": "Job type key (for example 'apply', 'destroy', 'plan', 'drift').",
      +      "type": "string"
      +    },
      +    "last_event_id": {
      +      "description": "Log cursor. Pass it to tflogs to fetch only newer entries.",
      +      "type": "string"
      +    },
      +    "last_refresh_at": {
      +      "description": "Time the backend last polled the deploy runner for this job (RFC 3339).",
      +      "type": "string"
      +    },
      +    "plan_summary": {
      +      "description": "Summary of the Terraform plan, for plan and drift jobs.",
      +      "properties": {
      +        "add": {
      +          "description": "Resources to create.",
      +          "type": "integer"
      +        },
      +        "change": {
      +          "description": "Resources to update in place.",
      +          "type": "integer"
      +        },
      +        "destroy": {
      +          "description": "Resources to destroy.",
      +          "type": "integer"
      +        },
      +        "expected_tag_changes_only": {
      +          "description": "True when every change is an import or an InsideOut tag update.",
      +          "type": [
      +            "null",
      +            "boolean"
      +          ]
      +        },
      +        "has_changes": {
      +          "description": "True when the plan changes anything.",
      +          "type": "boolean"
      +        },
      +        "import": {
      +          "description": "Resources to import.",
      +          "type": "integer"
      +        },
      +        "resource_changes": {
      +          "description": "Per-resource changes.",
      +          "items": {
      +            "description": "One resource change.",
      +            "properties": {
      +              "action": {
      +                "description": "Change action: 'create', 'update', 'delete' or 'replace'.",
      +                "type": "string"
      +              },
      +              "address": {
      +                "description": "Terraform resource address.",
      +                "type": "string"
      +              }
      +            },
      +            "type": [
      +              "null",
      +              "object"
      +            ]
      +          },
      +          "type": [
      +            "null",
      +            "array"
      +          ]
      +        },
      +        "stage_errors": {
      +          "description": "Errors reported by plan stages.",
      +          "items": {
      +            "description": "One stage error.",
      +            "type": "string"
      +          },
      +          "type": [
      +            "null",
      +            "array"
      +          ]
      +        },
      +        "validation_issues": {
      +          "description": "First-import plan gate violations, each with code, field, reason and value.",
      +          "items": {
      +            "additionalProperties": {
      +              "type": "string"
      +            },
      +            "description": "One violation.",
      +            "type": [
      +              "null",
      +              "object"
      +            ]
      +          },
      +          "type": [
      +            "null",
      +            "array"
      +          ]
      +        }
      +      },
      +      "type": [
      +        "null",
      +        "object"
      +      ]
      +    },
      +    "presets_version": {
      +      "description": "Terraform presets version the runner used.",
      +      "type": "string"
      +    },
      +    "session_id": {
      +      "description": "Session ID this status belongs to.",
      +      "type": "string"
      +    },
      +    "status": {
      +      "description": "Job status, for example 'pending', 'running', 'succeeded' or 'failed'.",
      +      "type": "string"
      +    },
      +    "template_version": {
      +      "description": "Infrastructure template version the runner used.",
      +      "type": "string"
      +    },
      +    "updated_at": {
      +      "description": "Time of the job's last status change (RFC 3339).",
      +      "type": "string"
      +    },
      +    "version_id": {
      +      "description": "ID of the stack version the job ran.",
      +      "type": "string"
      +    },
      +    "version_number": {
      +      "description": "Number of the stack version the job ran.",
      +      "type": "integer"
      +    },
      +    "version_status": {
      +      "description": "Status of that stack version.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  2. Changed3 schema fields changed
    • addedInput schema / properties / job_id / description
      Added value: +"Optional. Specific job ID to inspect. When omitted, returns the status of the latest job for the session."
    • addedInput schema / properties / session_id / description
      Added value: +"Session ID from convoopen — pass back EXACTLY as returned, including the ?token=... suffix (format: sess_v2_*?token=*). The suffix is part of the session credential; never strip it when summarizing."
    • addedInput schema / properties / session_id / pattern
      Added value: +"^sess_v2_[0-9A-Za-z]+\\?token=[0-9a-f]+$"
  3. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the readOnly/openWorld annotations by disclosing the liveness model: updated_at only bumps on semantic change while last_refresh_at stamps every successful Oracle poll, which is exactly what an agent needs to distinguish a stalled job from a stale row. It also states that no logs are streamed and what identifiers the response carries.

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

Conciseness4/5

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

The lead line and the tflogs hand-off are front-loaded and earn their place, and the liveness bullets carry real information. The trailing 'workflow.usage prompt' tip is vague filler, and the REQUIRES/OPTIONAL block duplicates the schema.

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

Completeness4/5

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

An output schema exists, so return values need not be spelled out, yet the description covers auth, sibling alternatives, and the timestamp semantics that matter for polling. The only loose end is the ambiguous pointer to the workflow.usage prompt, which gives no concrete action.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already documents both parameters, including the sess_v2_*?token=* format warning. The description mostly restates those REQUIRES/OPTIONAL lines; the only genuinely new fact is that job IDs can be discovered via tfruns.

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?

States a specific verb and resource — 'check the current status of a Terraform deployment job' — and immediately narrows the scope ('without streaming logs'). It is distinguishable from tflogs and tfruns, which are named in the text.

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

Usage Guidelines5/5

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

Explicit routing: use tflogs to stream the actual deployment logs, use tfruns to discover job IDs. It also states the precondition (session_id from convoopen) and when job_id is optional, so an agent knows exactly when this tool is and is not the right call.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources