電通総研 テックブログ

電通総研が運営する技術ブログ

Terraform MCP Server を使ってみた

はじめに

こんにちは、クロスイノベーション本部エンジニアリングテクノロジーセンターの徳山です。

この記事は、2025年5月20日に公開されたばかりの Terraform MCP ServerGitHub Copilot in VS Code ( 以降、Copilotと記載 ) で使用してみた体験談です。Terraform MCP Server の導入前のコード生成状況から導入内容、導入後のコード生成結果までを紹介します。

Terraform MCP Server は、 LLM (大規模言語モデル) の AIエージェントへ Terraform のプロバイダーとモジュールの検出やプロバイダーのリソース詳細情報取得などの機能を提供するMCPサーバです。

Terraform MCP Server の導入前の Copilot は、Terraform の AzureRM には存在しない架空のプロパティを提案してきていましたが、導入後はシャキッと AzureRM にもとづくコードを提案してくれるようになりました。

1. Terraform MCP Server 導入前

Copilotへの依頼内容

Copilot に今回依頼する内容は、こちらの azurerm_logic_app_workflow のサンプルコードへワークフロー定義を追加してもらいたいというものです。

  • サンプルコード
    sample

Copilot へ依頼した結果 ( Terraform MCP Serverがないとき )

Copilot へ依頼すると以下のコードが提案されましたが、definition というプロパティは terraform の AzureRM に存在しないためにコード上でエラーになっています。

  • 提案されたコード
    before_copilot

  • エラー内容
    unexpected_error

2. Terraform MCP Server を導入

Terraform MCP Serverは、先日2025年5月20日にHashicopから公開されたMCPサーバです。
今回は Building the Docker Image locally にしたがって Docker Image で導入しました。
導入手順の make docker-buildの後、VS Codemcp.json へ以下のとおり記載し、MCPサーバが停止していれば起動します。

Copilot Chat を開いて Agentモードで Tools を確認した結果は以下のとおりで、Terraform MCP Serverが利用できる状態であることを確認できます。

  • Agent Tools (一覧の下の方がTerraform MCP Server)
    agent_tools

3. Terraform MCP Server 導入後

azurerm_logic_app_workflow のサンプルコードへのワークフロー定義の追加を再度依頼しましたが、導入後でも導入前と同等のコードを再び提案してくるため、少しプロンプトを工夫して Copilot に AzureRM を参照してもらうようにしました。
依頼した際に Copilot が resolveProviderDocIDgetProviderDocs の使用許可を求めてきてくれたら許可し、それで terraform の AzureRM を参照してくれるようになりました。
当記事の作成にあたって何度かプロンプトを試した中では、「terraformの公式情報を参照して」や「AzureRMの情報を参照して」などと具体的な条件を Copilot へ示すと話が早いように思います。

  • 導入後に依頼1 : 別の Tools をまだ使用して期待とは異なる回答
    after_prompt

  • 導入後の依頼2 : Terraform MCP Server の resolveProviderDocIDgetProviderDocsを使用し始めてコード生成
    after_code

  • 実際に生成されたコード ( Terraform MCP Server があるとき )

resource "azurerm_logic_app_workflow" "daily_trigger" {
  name                = "daily-trigger-workflow"
  location            = azurerm_resource_group.eode_datapf.location
  resource_group_name = azurerm_resource_group.eode_datapf.name

  workflow_schema = "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"

  workflow_parameters = jsonencode({
    "definition" = {
      "triggers" = {
        "Recurrence" = {
          "type" = "Recurrence"
          "recurrence" = {
            "frequency" = "Day"
            "interval"  = 1
            "startTime" = "2025-05-22T01:00:00Z"
          }
        }
      }
      "actions" = {
        "Trigger_Container_App_Job" = {
          "type" = "Http"
          "inputs" = {
            "method" = "POST"
            "uri"    = azurerm_container_app_job.generate_tpcds_refresh_data.manual_trigger_url
            "headers" = {
              "Content-Type" = "application/json"
            }
          }
        }
      }
      "contentVersion" = "1.0.0.0"
    }
  })
}

上記の生成されたコードでは、コード上のエラーは発生していません。
このまま terraform apply するとエラーになってしまう内容ではありますが、存在しないプロパティを生成してくることはひとまずなくなりました。

さいごに

Terraform MCP Server を導入することで GitHub Copilot の生成内容の精度向上を体験できました。
導入後も導入前と同様に definition という間違ったプロパティを提案することがあるのですが、これは GitHub Copilot for Azure の Tools を使用してAzureの公式ドキュメントを参照している影響と推察しています。
根拠は、Copilot の稼働時に @azure get code gen best practices という GitHub Copilot for Azure の Tools を利用しているログが確認できることと、 Azure公式情報のこちらのページ のとおり Azure Logic Apps のワークフロー定義には definition が存在しているためです。

当然のことではありますが、目的や用途に応じて MCPサーバや Agent の Tools を適切に選別して切り替えることが重要であるとあらためて感じました。

私たちは一緒に働いてくれる仲間を募集しています!

電通総研 キャリア採用サイト

執筆:@shikarashika、レビュー:@nakamura.toshihiro
Shodoで執筆されました