Любой, кто просил ChatGPT или Claude накидать конфиг Terraform, знает этот жанр: модель уверенно пишет HCL, который был актуален год назад. acl = "private" прямо внутри aws_s3_bucket, аргументы, которые провайдер депрекейтнул ещё в четвёртой мажорной версии, ссылки на ресурсы, переименованные пару релизов назад. Причина простая — у модели знания на момент обучения, а реестр провайдеров живёт своей жизнью и меняется каждую неделю.

11 июня 2026 HashiCorp (теперь уже под крылом IBM) перевела в GA свой ответ на эту боль — Terraform MCP Server 1.0. Это официальный MCP-сервер, который даёт AI-ассистенту прямой доступ к Terraform Registry: актуальная документация провайдеров, модули, политики — в момент запроса, а не из training data.

Разберём, что он реально умеет, как поднять стенд за пять минут и где категорически нельзя пускать агента к инфраструктуре без поводка.

Зачем вообще прокладка между LLM и реестром

MCP (Model Context Protocol) — открытый стандарт от Anthropic, по которому модель ходит во внешние инструменты. Тут теории достаточно: есть хост (Claude Desktop, Cursor, VS Code), есть MCP-клиент внутри него, и есть сервер, который отдаёт инструменты. Всё.

Важно другое — что именно сервер кладёт модели в контекст. Terraform MCP Server не «применяет Terraform за вас». Он отдаёт модели набор tools, которыми та сама пользуется, когда вы просите написать или поправить конфиг:

  • search_providers — найти провайдера в реестре;

  • get_provider_details — вытащить актуальную документацию по ресурсам и аргументам;

  • get_latest_provider_version — проверить свежую версию;

  • search_modules / get_module_details — модули с их inputs/outputs и примерами;

  • поиск Sentinel-политик для governance и compliance.

Инструменты сгруппированы в три toolset’а — registry, registry-private и terraform — и включаются/отключаются флагом --toolsets. Это удобно: для локальной разработки достаточно публичного registry, а terraform (операции над workspace в HCP/TFE) можно вообще не поднимать.

Без MCP против с MCP

Самый честный способ показать ценность — один и тот же промпт на свежий ресурс.

Классический пример — S3-бакет. Модель без доступа к реестру с большой вероятностью выдаст старый стиль:

# то, что напишет LLM по памяти — стиль, депрекейтнутый в AWS provider v4
resource "aws_s3_bucket" "data" {
  bucket = "my-data"
  acl    = "private"
  versioning {
    enabled = true
  }
}

Тут двойная беда. Во-первых, acl и versioning внутри aws_s3_bucket депрекейтнуты и вынесены в отдельные ресурсы ещё в четвёртой версии провайдера. Во-вторых, и это любят забывать: с 2023 года S3 по умолчанию отключает ACL (Bucket Owner Enforced), приватность — это и так дефолт, а отдельный aws_s3_bucket_acl с private на свежем бакете просто упадёт.

Модель, сходив через MCP в search_providers и get_provider_details за актуальной документацией, ACL для приватного бакета не пишет вообще. Корректный современный конфиг — без ACL-ресурса, с вынесенным версионированием и явным блоком публичного доступа:

resource "aws_s3_bucket" "data" {
  bucket = "my-data"
}

resource "aws_s3_bucket_versioning" "data" {
  bucket = aws_s3_bucket.data.id
  versioning_configuration {
    status = "Enabled"
  }
}

resource "aws_s3_bucket_public_access_block" "data" {
  bucket                  = aws_s3_bucket.data.id
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

Разница не в том, что модель «поумнела». Она перестала угадывать и сходила за фактами. Для редких провайдеров и свежих мажорных версий, где обучающих данных мало, эффект заметнее всего.

Стенд за пять минут

Сервер ездит в Docker-контейнере и поддерживает два транспорта: stdio (локально) и streamable-http (удалённо). Для публичного реестра токен не нужен вообще.

Локальный запуск под stdio:

docker run -i --rm hashicorp/terraform-mcp-server

Подключение в хост (пример для конфигов на базе MCP — Claude Desktop, Cursor, VS Code agent mode):

{
  "mcpServers": {
    "terraform": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "hashicorp/terraform-mcp-server"]
    }
  }
}

Всё — дальше модель сама находит и вызывает нужные tools, когда вы просите HCL.

HCP Terraform и Enterprise: приватный registry в контексте модели

Публичный реестр — это приятно, но настоящая ценность для команд в приватной части. Подключив TFE_TOKEN и TFE_ADDRESS, вы пробрасываете в контекст модели свой приватный registry: внутренние модули с их документацией, провайдеры, организации и workspace.

docker run -i --rm \
  -e TFE_ADDRESS=https://app.terraform.io \
  -e TFE_TOKEN=*** \
  hashicorp/terraform-mcp-server

В режиме HCP/TFE доступны операции над workspace, переменными, тегами и run’ами. И вот тут принципиальный момент: деструктивные операции по умолчанию выключены. Apply, destroy, auto-approve и часть run-операций спрятаны за флагом ENABLE_TF_OPERATIONS — по дефолту он false, и это правильный дефолт. Но не обманывайтесь: что агент в принципе может читать и менять, определяется правами самого TFE_TOKEN, а не только этим флагом. Так что least privilege на токене — не опция.

Безопасность: где поводок обязателен

HashiCorp в документации честно перечисляет модель угроз, и её стоит прочитать до того, как подключать сервер к боевому токену. Помимо обычных галлюцинаций, там: prompt injection, tool poisoning, rug pull (инструмент меняет поведение после доверия) и tool shadowing. То есть это не «безопасно by design», а инструмент, который надо ограничивать.

Практический чеклист, если не хочется однажды объяснять, почему агент снёс staging:

  • Минимальные права токена. TFE_TOKEN должен видеть ровно то, что нужно ассистенту, и ничего сверх. Никакого «дам админский, потом разберусь».

  • ENABLE_TF_OPERATIONS=false, пока вы осознанно не решите иначе. Деструктивные операции — отдельный разговор и отдельный токен.

  • Не светить приватный registry в общий агент. Внутренние модули — это карта вашей инфраструктуры.

  • Никогда TFE_SKIP_TLS_VERIFY=true в проде.

  • Remote — только streamable-http с обвязкой: TLS (MCP_TLS_CERT_FILE / MCP_TLS_KEY_FILE), строгий CORS, IP allowlist, встроенные rate limit’ы (MCP_RATE_LIMIT_GLOBAL по умолчанию 10:20, MCP_RATE_LIMIT_SESSION5:10). Локально же хватает stdio или 127.0.0.1.

Отдельно про наблюдаемость: в streamable-http режиме сервер умеет отдавать OTel-метрики (OTEL_METRICS_ENABLED) — объём вызовов tools, latency, ошибки. Для прод-разворота это не опция, а гигиена.

Подводные камни

  • Контекст пухнет. Документация жирных провайдеров вроде AWS — это много токенов. Агент, который активно ходит в реестр, ест контекст и деньги быстрее, чем кажется.

  • Rate limit самого Registry. Зациклившийся в поиске агент упрётся в лимиты API реестра.

  • Привязка к экосистеме HashiCorp. Сервер официально заточен под Terraform Registry и HCP/TFE. OpenTofu как поддерживаемый сценарий не заявлен — хотя provider/module-документация из реестра по-прежнему полезна и для HCL-совместимых конфигов.

Итог

Terraform MCP Server не «отдаёт инфраструктуру ИИ» и не «лечит галлюцинации» — так формулировать неправильно. Он делает одну важную вещь: убирает устаревание контекста, чтобы модель писала HCL по актуальной схеме провайдера, а не по памяти годичной давности. Code review при этом никто не отменял.

Для девопса это редкий случай, когда AI-инструмент попадает ровно в рабочий процесс, а не в демо. Поднять стенд — пять минут и один docker run. Главное — держать агента на коротком поводке: минимальные права, выключенные по умолчанию деструктивные операции и threat model, прочитанная заранее, а не после инцидента.

А вы бы пустили агента в свой приватный registry — и на каких правах?