HashiCorp TerraformプラグインのMissing environment variablesエラーを消してみた

HashiCorp TerraformプラグインのMissing environment variablesエラーを消してみた

2026.07.27

HashiCorp公式のマーケットプレイスhashicorp/agent-skillsが配布するterraform-code-generationプラグインを有効にすると、/pluginErrorsタブに次のエラーが出ることがあります。

terraform-code-generation (project)
  Invalid MCP server config for "terraform": Missing environment variables: TFE_TOKEN, TFE_ADDRESS
  Check MCP server configuration in .mcp.json or manifest

terraform-module-generation (project)
  Invalid MCP server config for "terraform": Missing environment variables: TFE_TOKEN, TFE_ADDRESS

一見、terraformのMCPサーバーが起動していないように見えます。

ですが/mcpで確認するとplugin:terraform-code-generation:terraform✓ connectedになっていて、ツールも使える状態でした。

このエラーは実害のない表示です。ただし、チームで共有する設定にこの表示が残ると、使っているメンバーには壊れているように見えてしまいます。この記事では、原因と表示を消す方法を書きます。

なおこの設定は、以前書いたHashiCorpのTerraformプラグインをチームに配布する記事で使ったものです。

エラーの原因

terraform-code-generationプラグインの.claude-plugin/plugin.jsonには、Docker経由でTerraform用のMCPサーバー(hashicorp/terraform-mcp-server)を起動する定義があります。

このMCPサーバーには、HCP Terraform/Terraform Enterpriseのワークスペース操作系ツールも含まれています。エラーの原因となった${TFE_TOKEN}${TFE_ADDRESS}は、この機能を利用するために必要な値です。

terraform/code-generation/.claude-plugin/plugin.json(抜粋)
"mcpServers": {
  "terraform": {
    "command": "docker",
    "args": ["run", "-i", "--rm", "-e", "TFE_TOKEN", "-e", "TFE_ADDRESS", "hashicorp/terraform-mcp-server"],
    "env": {
      "TFE_TOKEN": "${TFE_TOKEN}",
      "TFE_ADDRESS": "${TFE_ADDRESS}"
    }
  }
}

hashicorp/terraform-mcp-serverのREADMEを見ると、TFE_TOKENのデフォルトは""TFE_ADDRESSも"Optional"扱いで、どちらも未設定で動く仕様です。未設定の場合はTerraform Registry検索などregistry系ツールのみ使え、HCP Terraformのワークスペース操作系ツールは使えません。

このチェックが働く原因は、plugin.json側がdocker runの引数に-e TFE_TOKEN/-e TFE_ADDRESSを含め、env${TFE_TOKEN}/${TFE_ADDRESS}という参照を書いていることです。

project scopeで手動作成した.mcp.jsonに同じ参照を置いてclaude mcp listを実行すると、同じ文言の警告がMCP config diagnostics欄に出ますが、terraformはやはりConnectedになります。

違うのは、プラグイン提供のMCPサーバーの場合、この警告が/pluginErrorsタブに常駐する点です。

ZREw9VopHIq53X15Twums_md_—_blog.png

.mcp.jsonで上書きしようとして失敗

Claude CodeのMCPサーバーは、同名のサーバーが複数スコープにある場合、最も優先度が高いスコープの定義に一本化されます。

優先順位は公式ドキュメントに明記されていて、Local > Project > User > Plugin-provided servers > claude.ai connectorsの順です。

同ドキュメントには「Local/Project/Userの3スコープは名前で重複判定するが、プラグインとconnectorはエンドポイント(URLやcommand)で重複判定する」ともあります。

そこで、project rootに.mcp.jsonを置き、terraformという同名サーバーをTFEなしで定義し、Errorsタブの表示を消そうとしました。

.mcp.json(1回目・失敗)
{
  "mcpServers": {
    "terraform": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "hashicorp/terraform-mcp-server"]
    }
  }
}

結果、重複除去されず、terraformのMCPサーバーが2個(project自前の分とプラグイン内蔵の分)に増えただけでした。

原因は、MCPサーバーの重複判定がcommand/argsだけでなくenvの中身まで完全一致していないと同一サーバーとみなされないことでした。CHANGELOGを見ると、v2.1.71で「プラグイン提供MCPサーバーの重複除去はcommand/URLの一致で行う」機能が入り、その後v2.1.152でenvも重複除去の対象になりました。

そこでargsを完全一致させ、envだけデフォルト値付きの構文にしてみました。

.mcp.json(2回目・失敗)
{
  "mcpServers": {
    "terraform": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "TFE_TOKEN", "-e", "TFE_ADDRESS", "hashicorp/terraform-mcp-server"],
      "env": {
        "TFE_TOKEN": "${TFE_TOKEN:-}",
        "TFE_ADDRESS": "${TFE_ADDRESS:-}"
      }
    }
  }
}

${VAR:-default}VARが未設定ならdefaultを使う構文で、${TFE_TOKEN:-}は未設定でも空文字に展開されます。argsをプラグイン側と完全一致させつつ、変数未定義のエラーを避ける狙いでした。

envの文字列("${TFE_TOKEN:-}""${TFE_TOKEN}")が一致しないため、これも重複除去されず失敗しました。

ここで詰まりました。envをプラグイン側と完全に一致させれば重複除去は効きますが、それでは元のエラー表示に戻ってしまいます。

settings.jsonのenvキーで表示を消す

.mcp.jsonでの上書きを諦め、.claude/settings.jsonのトップレベルにあるenvキーでTFE_TOKENTFE_ADDRESSを空文字として定義しました。

.claude/settings.json
{
  "env": {
    "TFE_TOKEN": "",
    "TFE_ADDRESS": ""
  },
  "extraKnownMarketplaces": { "...": "..." },
  "enabledPlugins": { "...": "..." }
}

envキーは公式ドキュメントで「Environment variables applied to every session and to subprocesses Claude Code spawns from it」(すべてのセッション、およびClaude Codeがそこから起動するサブプロセスに適用される環境変数)と説明されています。

空文字を設定した場合も「Subprocesses still inherit the empty value」(サブプロセスは空文字でもその値を引き継ぐ)とあり、project scopeでも設定できます。

プラグインが参照する${TFE_TOKEN}というプレースホルダーに対応する値を、Claude Code自身の環境変数として設定する仕組みです。

.mcp.json側の重複除去とは無関係に解決できます。

各ユーザーがシェルでexportする必要がなく、リポジトリにコミットした設定だけで、チーム全員に配布できます。

やってみた

Claude Code(v2.1.218)で実際にやってみました。

.claude/settings.jsonにenvを設定した状態で/pluginを見ると、ErrorsタブからMissing environment variablesのエントリは消えていました。

ただしErrorsタブは完全に0件にはならず、次の別メッセージが1件残っています。

terraform-module-generation
  MCP server "terraform" skipped — same command/URL as server provided by plugin "terraform-code-generation"
  Disable plugin "terraform-code-generation" if you want this plugin's version instead

ZREw9VopHIq53X15Twums_md_—_blog.png

これは、terraform-code-generationterraform-module-generationの2プラグインが同一のterraform MCPサーバー定義(同じcommand/URL)を持っているために働く、プラグイン間の重複除去によるものです。

terraformのMCPサーバー自体は1本だけconnectedになっていて、実害はありません。

✳_Claude_Code_—_blog.png

おわりに

env設定で消せるのはMissing environment variablesの表示だけで、プラグイン同士のcommand/URL重複によるスキップ表示は別物として残ります。

テンプレートを配布するときは、この違いを一言添えておくと親切そうです。


Claudeならクラスメソッドにお任せください

クラスメソッドは、Anthropic社とリセラー契約を締結しています。各種製品ガイドから、業種別の活用法、フェーズごとのお悩み解決などサービス支援ページにまとめております。まずはご覧いただき、お気軽にご相談ください。

サービス詳細を見る

この記事をシェアする

AI白書

関連記事