HashiCorp TerraformプラグインのMissing environment variablesエラーを消してみた
HashiCorp公式のマーケットプレイスhashicorp/agent-skillsが配布するterraform-code-generationプラグインを有効にすると、/pluginのErrorsタブに次のエラーが出ることがあります。
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}は、この機能を利用するために必要な値です。
"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サーバーの場合、この警告が/pluginのErrorsタブに常駐する点です。

.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タブの表示を消そうとしました。
{
"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だけデフォルト値付きの構文にしてみました。
{
"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_TOKENとTFE_ADDRESSを空文字として定義しました。
{
"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

これは、terraform-code-generationとterraform-module-generationの2プラグインが同一のterraform MCPサーバー定義(同じcommand/URL)を持っているために働く、プラグイン間の重複除去によるものです。
terraformのMCPサーバー自体は1本だけconnectedになっていて、実害はありません。

おわりに
env設定で消せるのはMissing environment variablesの表示だけで、プラグイン同士のcommand/URL重複によるスキップ表示は別物として残ります。
テンプレートを配布するときは、この違いを一言添えておくと親切そうです。









