Terry-Form MCP

Execute Terraform commands locally in a secure, containerized environment. Features LSP integration for intelligent Terraform development.

Terry-Form MCP

AI-powered Terraform execution through the Model Context Protocol.

Release License: MIT Docker Python

Terry-Form MCP is a containerized Model Context Protocol server that gives AI assistants like Claude safe, structured access to Terraform. It exposes 25 MCP tools spanning Terraform execution, LSP intelligence, GitHub integration, and Terraform Cloud connectivity — all running inside Docker with destructive operations blocked by design.

Documentation Site


Dashboard

Terry-Form MCP Dashboard

The built-in web dashboard provides real-time server health monitoring, tool category overview, and integration status at a glance. Live status auto-refreshes every 5 seconds.

Configuration UI

Server Configuration

A tabbed configuration interface lets you manage server settings, integrations, cloud provider credentials, and rate limits — all without touching config files. Built with the HAT stack (HTMX + Alpine.js + Tailwind CSS).

GitHub IntegrationCloud ProvidersRate Limits
GitHubCloud ProvidersRate Limits

Tool Catalog

Tool Catalog

The interactive tool catalog at /tools lists all 25 MCP tools with search, category filtering, and expandable parameter details. Also available as a raw JSON endpoint at /api/tools and as a static tools.json file.


Quick Start

Prerequisites

  • Docker installed and running
  • Python >= 3.10 (for local development)

1. Build

scripts/build.sh      # Linux/macOS
scripts\build.bat     # Windows
# or directly:
docker build -t terry-form-mcp .

2. Run as MCP Server

docker run -it --rm \
  -v "$(pwd)":/mnt/workspace \
  terry-form-mcp

3. Verify the Image

scripts/verify.sh   # Runs 8 checks: Docker, image size, Terraform, terraform-ls, Python, files, tools, startup

MCP Client Configuration

Add Terry-Form to any MCP-compatible client:

{
  "mcpServers": {
    "terry": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-v", "/path/to/your/workspace:/mnt/workspace",
        "terry-form-mcp"
      ]
    }
  }
}
Platform-specific examples

Claude Desktop (Windows)

{
  "mcpServers": {
    "terry": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-v", "C:\\Users\\YourUsername\\terraform-projects:/mnt/workspace",
        "terry-form-mcp"
      ]
    }
  }
}

Claude Desktop (macOS)

{
  "mcpServers": {
    "terry": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-v", "/Users/YourUsername/terraform-projects:/mnt/workspace",
        "terry-form-mcp"
      ]
    }
  }
}

VSCode (uses workspace variable)

{
  "mcp.servers": {
    "terry": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-v", "${workspaceFolder}:/mnt/workspace",
        "terry-form-mcp"
      ]
    }
  }
}

Tools (25)

CategoryToolsCount
Core Terraformterry, terry_version, terry_environment_check, terry_workspace_list4
LSP Intelligenceterraform_validate_lsp, terraform_hover, terraform_complete, terraform_format_lsp, terraform_lsp_status5
Diagnosticsterry_lsp_debug, terry_workspace_info, terry_lsp_init, terry_file_check, terry_workspace_setup, terry_analyze6
Securityterry_security_scan, terry_recommendations2
GitHubgithub_clone_repo, github_list_terraform_files, github_get_terraform_config, github_prepare_workspace4
Terraform Cloudtf_cloud_list_workspaces, tf_cloud_get_workspace, tf_cloud_list_runs, tf_cloud_get_state_outputs4

Core Terraform

# Initialize and validate a project
terry(path="infrastructure/aws", actions=["init", "validate"])

# Plan with variables
terry(path="environments/prod", actions=["plan"], vars={"instance_count": "3", "region": "us-east-1"})

Only init, validate, fmt, and plan are permitted. apply and destroy are blocked.

LSP Intelligence

# Code completions
terraform_complete(file_path="main.tf", line=10, character=0)

# Hover documentation
terraform_hover(file_path="main.tf", line=15, character=12)

# Detailed validation with error locations
terraform_validate_lsp(file_path="main.tf")

# Format a file
terraform_format_lsp(file_path="main.tf")

Powered by terraform-ls v0.38.5 — provides context-aware completions, inline documentation, and diagnostics with precise source locations.

GitHub Integration

# Clone a repo and prepare it for Terraform operations
github_clone_repo(owner="myorg", repo="infrastructure")
github_prepare_workspace(owner="myorg", repo="infrastructure", config_path="environments/prod")

Security Scanning

# Scan for hardcoded credentials, missing encryption, overly permissive policies
terry_security_scan(path="my-project")

# Get actionable improvement recommendations
terry_recommendations(path="my-project")

Architecture

┌─────────────┐     MCP Protocol     ┌──────────────────────────────────────┐
│ AI Assistant │ ◄──────────────────► │  Terry-Form MCP Server               │
│ (Claude)     │                      │                                      │
└─────────────┘                      │  ┌─────────────┐  ┌──────────────┐  │
                                     │  │ Terraform    │  │ terraform-ls │  │
                                     │  │ CLI 1.12     │  │ LSP 0.38.5   │  │
                                     │  └──────┬───────┘  └──────┬───────┘  │
                                     │         │                 │          │
                                     │         ▼                 ▼          │
                                     │  ┌──────────────────────────────┐   │
                                     │  │   /mnt/workspace (isolated)   │   │
                                     │  └──────────────────────────────┘   │
                                     └──────────────────────────────────────┘
                                              Docker Container

Key Components

FilePurpose
src/server_enhanced_with_lsp.pyMain FastMCP server — registers all 25 tools
src/terry-form-mcp.pyCore Terraform subprocess execution
src/terraform_lsp_client.pyAsync LSP client wrapping terraform-ls
src/mcp_request_validator.pyInput sanitization, path traversal prevention, rate limiting
src/github_repo_handler.pyClone repos and extract Terraform files
src/github_app_auth.pyGitHub App JWT/OAuth authentication
src/frontend/HAT stack web UI (dashboard + configuration)

Frontend Stack

The built-in web UI uses the HAT stack:

  • HTMX 2.0 — partial page updates without full reloads
  • Alpine.js 3.14 — lightweight client-side reactivity for tabs and toasts
  • Tailwind CSS — dark-mode-first utility styling

Accessible at the server root when running with streamable-http or sse transport.


Security Model

Terry-Form implements defense-in-depth with four layers:

LayerProtection
Container IsolationAll execution in ephemeral Docker containers. No host access.
Operation AllowlistOnly init, validate, fmt, plan. No apply/destroy.
Workspace IsolationAll file operations restricted to /mnt/workspace. Path traversal blocked.
Input ValidationJSON schema enforcement, variable sanitization, rate limiting per category.

Forced environment variables: TF_IN_AUTOMATION=true, TF_INPUT=false, CHECKPOINT_DISABLE=true.


Running with the Web UI

To use the dashboard and configuration UI, run with HTTP transport:

# Local
MCP_TRANSPORT=streamable-http HOST=0.0.0.0 PORT=8000 python3 src/server_enhanced_with_lsp.py

# Docker
docker run -it --rm \
  -p 8000:8000 \
  -v "$(pwd)":/mnt/workspace \
  -e MCP_TRANSPORT=streamable-http \
  terry-form-mcp

Then open http://localhost:8000 in your browser.

Configuration Tabs

TabWhat it configures
ServerTransport mode, host, port, API key
GitHubApp ID, installation ID, private key path, webhook secret
Terraform CloudAPI token
Cloud ProvidersAWS, GCP, and Azure credentials
Rate LimitsPer-category request limits (applied immediately)
Terraform OptionsLog level, operation timeout

Container Details

Built on hashicorp/terraform:1.12 (Alpine-based, ~150MB). Includes:

  • Terraform CLI 1.12
  • terraform-ls v0.38.5 for LSP support
  • Python 3.12 with FastMCP 3.0+
  • Runs as non-root user terraform (UID 1001)

Development

# Install dependencies
pip install -r requirements.txt

# Run locally
python3 src/server_enhanced_with_lsp.py

# Code quality
black .       # Format (88-char line limit)
flake8 .      # Lint
mypy src/*.py # Type check

Limitations

  • No state modificationapply and destroy are intentionally blocked
  • String variables only — complex variable types not supported via CLI passthrough
  • LSP cold start — first LSP operation takes 1-2 seconds for initialization
  • Local execution — designed for development workflows, not production CI/CD

License

MIT

Похожие серверы