こんにちは、ネットワールド技術担当の山下です。
TerraformのコードをAIに書いてもらったら、古いバージョンとかで怒られた経験ってありませんか?
- `terraform apply` したら `Required argument` エラー……引数名が変わってた
- コピーしたサンプルに `acl = "private"` が残ってた(もう非推奨)
- provider version と module の組み合わせが合わなくて、直す時間のほうが長くなった
「コード生成は速いのに、デバッグに時間がかかる」というのが正直なところで、これってAI学習データが古いとかが原因の要素なんですよね、、
というわけで今回は、この問題の解決に期待できる Terraform MCP Server を Claude Code で試してみました
Terraform MCP Server って何?
一言でいうと、「AIが Terraform Registry の最新情報をリアルタイムで参照できるようにする仕組み」です。
MCP(Model Context Protocol)は、AIが外部ツールやデータソースに接続するためのプロトコル。「AIにUSB-Cで外部知識を外付けする」みたいなイメージです

画像出典: https://norahsakal.com/blog/mcp-vs-api-model-context-protocol-explained/
Terraform文脈だと、AIが以下の情報をリアルタイムで取得できるようになります。
- 最新の provider バージョン
- module の inputs / outputs / 利用例
- Sentinel ポリシー情報
「学習済みデータだけで書く」から「最新ドキュメントを見ながら書く」状態になるのが最大のポイントです。
Terraform MCP Server は HashiCorp が公式に提供しています(現在ベータ版)
Terraform MCP Server とは
- リアルタイムな正確性
古くなった学習データに頼らず、最新のプロバイダードキュメントを参照してコードを生成- Terraform Registry との統合
プロバイダー・モジュール・ポリシーの公開 API と直接連携- HCP Terraform / Terraform Enterprise のサポート
プライベートレジストリやワークスペース管理にも対応- AIによる強化
より正確で実用的な Terraform 構成の生成が可能に
「学習済みデータだけで書く」から「最新ドキュメントを見ながら書く」ような状態になるのが最大のポイントです。

セットアップ
では、早速やっていきましょう! 意外と簡単です。
前提
- Claude Code がインストール済み
- Docker が起動している
Step 1: Terraform MCP Server を追加
プロジェクトルートに `.mcp.json` を作成して、以下を記述します。
```json
{
"mcpServers": {
"terraform": {
"command": "docker",
"args": ["run", "-i", "--rm", "hashicorp/terraform-mcp-server"]
}
}
}
```
※全プロジェクト共通で使いたい場合は、`~/.claude.json` に同じ内容を追記すればOKです。
Step 2: 接続確認
Claude Code を起動して、`/mcp` と入力します。MCP サーバーの一覧と接続状態が確認できます。
```
Project MCPs (/path/to/project/.mcp.json)
> terraform · ✓ connected
```
いい感じです! 続けてこう聞いてみましょう。
```
MCPで使えるTerraformのツールを教えて
```
`search_modules` や `get_latest_provider_version` などのツール一覧が返ってきたら取り急ぎ準備完了です。

※Terraform MCP Serverで利用可能なツール一覧/詳細は、以下の公式ドキュメントをご参照ください
S3 モジュールを生成してみる
せっかくなので、AWS S3 バケット用のモジュールをAIに作ってもらいましょう
依頼文
```
コミュニティのTerraformモジュールを使ってS3モジュールを作成してください。
```
Claude Code が裏でやっていること
依頼すると、MCP 経由で、今回はこんな順番にツールが呼ばれたようです。
1. get_latest_module_version と search_modules を並列で実行し、S3 モジュールの最新バージョンと候補を確認
2. 候補の中からダウンロード数が最多(189M)の terraform-aws-modules/s3-bucket を Claude が選択
3. get_module_details で完全なドキュメント(input / output / example / provider 互換バージョン)を取得
4. 取得した情報をもとに S3 の Terraform コードを生成
「なんとなく書く」ではなく「公式情報を引いてから書く」状態になっています。
Terraform MCP Serverを利用して生成されたコード
```hcl
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 6.37"
}
}
}
module "s3_bucket" {
source = "terraform-aws-modules/s3-bucket/aws"
version = "5.11.0"
bucket = var.bucket_name
bucket_prefix = var.bucket_prefix
force_destroy = var.force_destroy
# Public access block
block_public_acls = var.block_public_access
block_public_policy = var.block_public_access
ignore_public_acls = var.block_public_access
restrict_public_buckets = var.block_public_access
# Versioning
versioning = var.versioning_enabled ? { enabled = true } : {}
# Server-side encryption
server_side_encryption_configuration = var.server_side_encryption_enabled ? {
rule = {
apply_server_side_encryption_by_default = {
sse_algorithm = var.kms_master_key_id != null ? "aws:kms" : "AES256"
kms_master_key_id = var.kms_master_key_id
}
bucket_key_enabled = var.kms_master_key_id != null
}
} : {}
# Enforce HTTPS
attach_deny_insecure_transport_policy = var.attach_deny_insecure_transport_policy
# Lifecycle
lifecycle_rule = var.lifecycle_rules
# Logging
logging = var.logging
# CORS
cors_rule = var.cors_rules
tags = var.tags
}
```
バージョンも最新でいい感じですね!
ちなみに MCP なしだと、以下な感じになりましたね、、
```hcl
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 5.0"
}
}
}
module "s3_bucket" {
source = "terraform-aws-modules/s3-bucket/aws"
version = "~> 4.0"
bucket = var.bucket_name
# Versioning
versioning = {
enabled = var.versioning_enabled
}
# Server-side encryption
server_side_encryption_configuration = {
rule = {
apply_server_side_encryption_by_default = {
sse_algorithm = "AES256"
}
}
}
# Block public access
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
# Lifecycle rules
lifecycle_rule = var.lifecycle_rules
tags = var.tags
}
```
MCPなしだと、ぱっとみ、バージョンが古かったりしてますね、、
取り急ぎ、Claude Codeに分析させてみました
MCPあり/なしコードを比べてみると
| 項目 | MCP あり | MCP なし |
|---|---|---|
| AWS Provider バージョン | `>= 6.37`(最新) | `>= 5.0`(古い) |
| S3 モジュールバージョン | `5.11.0`(最新固定) | `~> 4.0`(1世代前) |
| パブリックアクセスブロック | 変数で柔軟に制御 | `true` ハードコード |
| 暗号化 | KMS / AES256 を動的切替 | AES256 固定のみ |
| HTTPS 強制ポリシー | あり | なし |
| ログ・CORS | あり | なし |バージョンの差もさることながら、設計思想の違いも大きいようです。MCP なし版は「とりあえず動くコード」に近く、`block_public_acls = true` のようにベタ書きで柔軟性がありません。一方 MCP あり版は、モジュールの実際の仕様を把握した上で変数化・条件分岐が組まれており、環境ごとの使い回しを想定した構造になっています。
生成AIベースなので、毎回そうなるかは、もっと検証必要かもしれませんが、、取り急ぎ、MCPのほうがいい感じと思われます!
まとめ
試してみての感想をまとめると、こんな感じです。
- MCPセットアップはすぐ終わる ── 思ったよりずっと簡単(json書くだけ)
- 生成コードの初期品質が上がった ── バージョン整合・セキュリティ設定が最初から入ってくる(一回のプロンプト入力でいい仕上がりのコード生成が期待できる)
- デバッグの手戻りが減る ── 「古い書き方だった」系のエラーが起きにくくなる(エラー復旧で、何度もプロンプト入力指示する手間が減る)
Terraform MCP Server の本質は、AI に「最新の正しい情報を渡す仕組み」です。
AI が参照する情報の鮮度を上げることで、生成コードの品質が底上げされます。

生成AIで Terraform コードを書いている方々には、ぜひぜひ Terraform MCP Server の利用をオススメしていきたいです。
今後もブログでいろいろと発信していければと思います。最後までお読みいただき、ありがとうございました!
注意事項
- Terraform MCP Server は現在ベータ版です。本番環境での利用は慎重に判断してください。
- AIが生成したコードは必ず人間がレビューしてください。権限設計・ネットワーク制御・タグ規約などは生成に任せず、最終確認してください。
参考リンク
- [Terraform MCP Server(HashiCorp Docs)](https://developer.hashicorp.com/terraform/mcp-server)
- [Terraform MCP Server(GitHub)](https://github.com/hashicorp/terraform-mcp-server)
- [Terraform Registry](https://registry.terraform.io/)