
Любой, кто просил 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-бакет. Модель без доступа к реестру с высокой вероятностью выдаст старый стиль:
``` resource "aws_s3_bucket" "example" { bucket = "my-tf-test-bucket" 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" "example" { bucket = "my-tf-test-bucket" }
resource "aws_s3_bucket_versioning" "example" { bucket = aws_s3_bucket.example.id versioning_configuration { status = "Enabled" } }
resource "aws_s3_bucket_public_access_block" "example" { bucket = aws_s3_bucket.example.id
block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } ```
Разница не в том, что модель «поумнела». Она перестала угадывать и обратилась за фактами. Для редких провайдеров и свежих мажорных версий, где обучающих данных мало, эффект наиболее заметен.
Стенд за пять минут
Сервер работает в Docker-контейнере и поддерживает два транспорта: stdio (локально) и streamable-http (удалённо). Для публичного реестра токен не требуется вообще.
Локальный запуск под stdio:
``` docker run \ --rm \ -i \ ghcr.io/hashicorp/terraform-mcp-server:latest \ --toolsets registry ```
Подключение в хост (пример для конфигов на базе MCP — Claude Desktop, Cursor, VS Code agent mode):
``` { "mcpServers": { "terraform": { "command": "docker", "args": ["run", "--rm", "-i", "ghcr.io/hashicorp/terraform-mcp-server:latest", "--toolsets", "registry"] } } } ```
Всё — дальше модель сама находит и вызывает нужные tools, когда вы запрашиваете HCL.
HCP Terraform и Enterprise: приватный registry в контексте модели
Публичный реестр — это удобно, но настоящая ценность для команд кроется в приватной части. Подключив `TFE_TOKEN` и `TFE_ADDRESS`, вы передаёте в контекст модели свой приватный registry: внутренние модули с их документацией, провайдеры, организации и workspace.
В режиме 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_SESSION` — 5:10). Локально же достаточно stdio или 127.0.0.1.
Отдельно про наблюдаемость: в режиме streamable-http сервер умеет отдавать OTel-метрики (`OTEL_METRICS_ENABLED`) — объём вызовов tools, задержки, ошибки. Для прод-развёртывания это не опция, а гигиена.
Подводные камни
* **Контекст разрастается.** Документация крупных провайдеров вроде 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 — и на каких правах?