hashicorp/terraform-mcp-服务器
简介
核心亮点
- 实时对接 Registry API,确保资源定义最新
- 自动化分析模块依赖,降低 IaC 配置复杂度
- 将 AI 助手转化为专业的 Terraform 辅助编程工具
- 消除文档查阅冗余,实现对话式基础设施管理
完整文档
<img src="public/images/Terraform-LogoMark_onDark.svg" width="30" align="left" style="margin-right: 12px;"/> Terraform MCP Server
Terraform MCP Server 是一个 Model Context Protocol (MCP) 服务器,它与 Terraform Registry 和 HCP Terraform API 无缝集成,为基础设施即代码 (IaC) 开发提供先进的自动化和交互能力。
Table of Contents<table width="100%">
<tr> <th width="33%" align="left">快速入门</th> <th width="34%" align="left">客户端集成</th> <th width="33%" align="left">构建与运行</th> </tr> <tr> <td width="33%" valign="top"> <a href="#features">Features</a><br> <a href="#prerequisites">Prerequisites</a><br> <a href="#command-line-options">Command Line Options</a><br> <a href="#instructions">Instructions</a> </td> <td width="34%" valign="top"> <a href="#installation">Installation</a><br> <a href="#usage-with-visual-studio-code">Visual Studio Code</a><br> <a href="#usage-with-cursor">Cursor</a><br> <a href="#usage-with-claude-desktop--amazon-q-developer--kiro-cli">Claude Desktop, Amazon Q Developer, and Kiro CLI</a><br> <a href="#usage-with-claude-code">Claude Code</a><br> <a href="#usage-with-codex-cli">Codex CLI</a><br> <a href="#usage-with-gemini-extensions">Gemini extensions</a><br> <a href="#usage-with-bob-ide--shell">Bob IDE and Shell</a> </td> <td width="33%" valign="top"> <a href="#install-from-source">从源码安装</a><br> <a href="#building-the-docker-image-locally">本地构建 Docker Image</a><br> <a href="#transport-support">Transport 支持</a><br> <a href="#1-stdio-transport-default">Stdio Transport</a><br> <a href="#2-streamablehttp-transport">StreamableHTTP Transport</a> </td> </tr> </table><table width="100%"> <tr> <th width="33%" align="left">Server 能力</th> <th width="34%" align="left">部署与安全</th> <th width="33%" align="left">帮助与贡献</th> </tr> <tr> <td width="33%" valign="top"> <a href="#available-tools">可用 Tools</a><br> <a href="#available-resources">可用 Resources</a><br> <a href="#available-metrics">可用 Metrics</a><br> <a href="#tool-filtering">Tool 过滤</a> </td> <td width="34%" valign="top"> <a href="#session-modes">Session 模式</a><br> <a href="#token-passthrough-for-centralized-deployments">集中式部署的 Token 透传</a><br> <a href="#client-ip-forwarding">Client IP 转发</a><br> <a href="#trust-model">信任模型</a><br> <a href="#trusted-hops">信任跳数</a><br> <a href="#limitations">限制</a><br> <a href="#migrating-from-earlier-versions">从早期版本迁移</a><br> <a href="#supported-headers">支持的 Headers</a><br> <a href="#security-considerations">安全注意事项</a><br> <a href="#centralized-deployment-example">集中式部署示例</a> </td> <td width="33%" valign="top"> <a href="#troubleshooting">故障排除</a><br> <a href="#corporate-proxy--tls-inspection-zscaler-etc">企业代理与 TLS 检查</a><br> <a href="#development">开发</a><br> <a href="#contributing">贡献</a><br> <a href="#license">许可证</a><br> <a href="#security">安全</a><br> <a href="#support">支持</a> </td> </tr> </table>## 功能特性- 双传输协议支持:支持 Stdio 和 StreamableHTTP 传输协议,且端点可配置
- Terraform Registry 集成:直接集成公共 Terraform Registry API,支持 providers、modules 和 policies
- HCP Terraform & Terraform Enterprise 支持:完整的 workspace 管理、organization/project 列表以及私有 registry 访问
- Workspace 操作:支持创建、更新、删除 workspaces,并支持 variables、tags 和 run 管理
- 用于监控工具使用情况的 OTel 指标:集成 open telemetry meters,用于在 Streamable HTTP 模式下追踪工具调用量、延迟和失败率。启用此功能时,还会公开默认的 http server 指标
> 安全注意事项: 根据查询内容,MCP server 可能会向 MCP client 和 LLM 暴露某些 Terraform 数据。请勿将 MCP server 与不可信的 MCP clients 或 LLMs 配合使用。
> 法律注意事项: 您对第三方 MCP Client/LLM 的使用仅受该 MCP/LLM 使用条款的约束,IBM 对此类第三方工具的性能不承担责任。IBM 明确否认对第三方 MCP Clients/LLMs 的任何及所有保证和责任,并且可能无法提供支持以解决由第三方工具引起的问题。> 注意: MCP server 提供的输出和建议是动态生成的,可能会根据查询、模型以及连接的 MCP client 而有所不同。用户在实施前应仔细审查所有输出/建议,以确保其符合组织的安全性最佳实践、成本效益目标和合规性要求。
Prerequisites
1. 确保已安装并运行 Docker,以便在容器化环境中使用 server。
1. 安装支持 Model Context Protocol (MCP) 的 AI assistant。
Command Line Options
Environment Variables:| Variable | Description | Default |
|----------|-------------|---------|
| TFE_ADDRESS | 设置用于 API 调用的 Terraform Enterprise/HCP Terraform 地址。必须包含协议(例如 https://app.terraform.io)。在 streamable-http 模式下,这是设置地址的唯一方式;客户端无法通过 header 或查询参数提供。 | Optional |
| TFE_TOKEN | Terraform Enterprise API token | "" (empty) |
| TF_MCP_SHARED_SECRET | 发送到 HCP Terraform / TFE 请求中 X-Tf-Mcp-Secret header 的共享密钥,用于识别源自托管 MCP 部署的请求。应仅在 TLS 上使用。 | "" (empty) |
| TFE_SKIP_TLS_VERIFY | 跳过 HCP Terraform 或 Terraform Enterprise 的 TLS 验证 | false |
| LOG_LEVEL | 日志级别:trace, debug, info, warn, error, fatal, panic(覆盖 --log-level 标志) | info |
| LOG_FORMAT | 日志格式:text 或 json(覆盖 --log-format 标志)| text |
| TRANSPORT_MODE | 设置为 streamable-http 以启用 HTTP 传输(仍支持旧版 http 值) | stdio |
| TRANSPORT_HOST | HTTP 服务器绑定的主机 | 127.0.0.1 |
| TRANSPORT_PORT | HTTP 服务器端口 | 8080 |
| MCP_ENDPOINT | HTTP 服务器端点路径 | /mcp |
| MCP_REDIRECT_ROOT_URL | 将对 / 的请求重定向到的 URL | "" |
| MCP_KEEP_ALIVE | SSE 连接的 keep-alive 间隔(例如 30s, 1m)。设置为 0 以禁用 | 0 |
| MCP_SESSION_MODE | 会话模式:stateful 或 stateless | stateful |
| MCP_ALLOWED_ORIGINS | 允许 CORS 的源列表,以逗号分隔 | "" (empty) |
| MCP_CORS_MODE | CORS 模式:strict, development, 或 disabled | strict |
| MCP_TLS_CERT_FILE | TLS 证书文件路径,非 localhost 部署必填(例如 /path/to/cert.pem) | "" (empty) |
| MCP_TLS_KEY_FILE | TLS 密钥文件路径,非 localhost 部署必填(例如 /path/to/key.pem)| "" (empty) |
| MCP_RATE_LIMIT_GLOBAL | 全局速率限制(格式:rps:burst) | 10:20 |
| MCP_RATE_LIMIT_SESSION | 单会话速率限制(格式:rps:burst) | 5:10 |
| MCP_ORGANIZATION_ALLOWLIST | 允许访问 HTTP 服务器的 HCP Terraform 组织名称 CSV 列表 | "" (empty) |
| MCP_FORWARD_CLIENT_IP | 通过 X-Forwarded-For 将客户端 IP 转发给 HCP Terraform / TFE。设置为 true 以启用 | false |
| MCP_REMOTE_IP_METHOD | 启用转发时获取客户端 IP 的方式:RemoteAddr(仅限直接连接)、X-Real-IP 或 X-Forwarded-For | RemoteAddr |
| MCP_XFF_TRUSTED_HOPS | 从 X-Forwarded-For 链右侧起计算的信任代理跳数。仅在 MCP_REMOTE_IP_METHOD=X-Forwarded-For 时使用 | 0 |
| ENABLE_TF_OPERATIONS | 启用需要显式批准的工具 | false |
| OTEL_METRICS_ENABLED | 使用 otel 启用工具和服务器指标 | false |
| OTEL_METRICS_SERVICE_VERSION | 发送指标的 terraform-mcp-server 版本,用于设置指标属性。它还有助于跟踪不同部署之间的指标 | latest |
| OTEL_METRICS_SERVICE_NAME | 标识指标的来源(例如 "terraform-mcp-server") | terraform-mcp-server |
| OTEL_METRICS_EXPORT_INTERVAL | 控制指标刷新的频率 | 2 |
| OTEL_METRICS_ENDPOINT | OTel Collector 或后端的 URL | localhost:4318 |
| INSTANA_ENABLED | 为 streamable-http 服务器启用 Instana 仪表化(指标和 HTTP 请求追踪)。需要服务器可访问的 Instana agent。 | false |
| INSTANA_SERVICE_NAME | 如果启用了 Instana 仪表化,则为 MCP 服务器使用的服务名称 | terraform-mcp-server |
# Stdio mode
terraform-mcp-server stdio [--log-file /path/to/log] [--log-level info] [--log-format text] [--toolsets <toolsets>] [--tools <tools>]
StreamableHTTP mode
terraform-mcp-server streamable-http [--transport-port 8080] [--transport-host 127.0.0.1] [--mcp-endpoint /mcp] [--organization-allowlist <orgs-csv>] [--log-file /path/to/log] [--log-level info] [--log-format text] [--toolsets <toolsets>] [--tools <tools>]MCP server 的默认指令位于 cmd/terraform-mcp-server/instructions.md。如果这些指令不符合您组织的 Terraform 实践,或者 MCP server 产生的响应不准确,请将其替换为您自己的指令并重新构建容器或二进制文件。相关指令示例位于 instructions/example-mcp-instructions.md。
AGENTS.md 实质上充当编码 agent 的 README:一个专门且可预测的位置,用于提供上下文和指令,以帮助 AI 编码 agent 在您的项目上工作。一个 AGENTS.md 文件可适用于不同的编码 agent。相关指令示例位于 instructions/example-AGENTS.md,若要使用它,请将名为 AGENTS.md 的文件提交到您的 Terraform 配置所在的目录。
安装
在 Visual Studio Code 中使用
将以下 JSON 代码块添加到 VS Code 的用户设置 (JSON) 文件中。您可以通过按下 Ctrl + Shift + P 并输入 Preferences: Open User Settings (JSON) 来完成此操作。
关于在 VS Code 的 agent mode 文档 中了解更多关于使用 MCP server 工具的信息。
<table>
<tr><th>Version 0.3.0+ 或更高版本</th><th>Version 0.2.3 或更低版本</th></tr>
<tr valign=top>
<td>
{
"mcp": {
"servers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e", "TFE_TOKEN=${input:tfe_token}",
"-e", "TFE_ADDRESS=${input:tfe_address}",
"hashicorp/terraform-mcp-server:1.2.0"
]
}
},
"inputs": [
{
"type": "promptString",
"id": "tfe_token",
"description": "Terraform API Token",
"password": true
},
{
"type": "promptString",
"id": "tfe_address",
"description": "Terraform Address",
"password": false
}
]
}
}<td>
{
"mcp": {
"servers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"hashicorp/terraform-mcp-server:0.2.3"
]
}
}
}
}</tr>
</table>
可选地,您可以将类似的示例(即不含 mcp 密钥)添加到工作区中名为 .vscode/mcp.json 的文件中。这将允许您与他人共享配置。
<table>
<tr><th>Version 0.3.0+ 或更高版本</th><th>Version 0.2.3 或更低版本</th></tr>
<tr valign=top>
<td>
{
"servers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e", "TFE_TOKEN=${input:tfe_token}",
"-e", "TFE_ADDRESS=${input:tfe_address}",
"hashicorp/terraform-mcp-server:1.2.0"
]
}
},
"inputs": [
{
"type": "promptString",
"id": "tfe_token",
"description": "Terraform API Token",
"password": true
},
{
"type": "promptString",
"id": "tfe_address",
"description": "Terraform Address",
"password": false
}
]
}<td>
{
"servers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"hashicorp/terraform-mcp-server:0.2.3"
]
}
}
}</tr>
</table>
<img alt="Install in VS Code (docker)" src="https://img.shields.io/badge/VS_Code-VS_Code?style=flat-square&label=Install%20Terraform%20MCP&color=0098FF">
<img alt="Install in VS Code Insiders (docker)" src="https://img.shields.io/badge/VS_Code_Insiders-VS_Code_Insiders?style=flat-square&label=Install%20Terraform%20MCP&color=24bfa5">
在 Cursor 中使用
将以下内容添加到您的 Cursor 配置 (~/.cursor/mcp.json) 或通过 Settings → Cursor Settings → MCP 添加:
<table>
<tr><th>Version 0.3.0+ 或更高版本</th><th>Version 0.2.3 或更低版本</th></tr>
<tr valign=top>
<td>
{
"mcpServers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e", "TFE_ADDRESS=<<PASTE_TFE_ADDRESS_HERE>>",
"-e", "TFE_TOKEN=<<PASTE_TFE_TOKEN_HERE>>",
"hashicorp/terraform-mcp-server:1.2.0"
]
}
}
}<td>
{
"servers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"hashicorp/terraform-mcp-server:0.2.3"
]
}
}
}</tr>
</table>
<a href="cursor://anysphere.cursor-deeplink/mcp/install?name=terraform&config=eyJjb21tYW5kIjoiZG9ja2VyIiwiYXJncyI6WyJydW4iLCItaSIsIi0tcm0iLCJoYXNoaWNvcnAvdGVycmFmb3JtLW1jcC1zZXJ2ZXIiXX0%3D">
<img alt="Add terraform MCP server to Cursor" src="https://cursor.com/deeplink/mcp-install-dark.png" height="32" />
</a>
在 Claude Desktop / Amazon Q Developer / Kiro CLI 中的用法
关于在 Claude Desktop 中使用 MCP server 工具的更多信息,请参阅 用户文档。关于在 Amazon Q Developer 和 Kiro CLI 中使用 MCP server 的更多信息,请阅读相关文档。
<table>
<tr><th>Version 0.3.0+ 或更高版本</th><th>Version 0.2.3 或更低版本</th></tr>
<tr valign=top>
<td>
{
"mcpServers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e", "TFE_ADDRESS=<<PASTE_TFE_ADDRESS_HERE>>",
"-e", "TFE_TOKEN=<<PASTE_TFE_TOKEN_HERE>>",
"hashicorp/terraform-mcp-server:1.2.0"
]
}
}
}<td>
{
"mcpServers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"hashicorp/terraform-mcp-server:0.2.3"
]
}
}
}</tr>
</table>
在 Claude Code 中使用
关于在 Claude Code 中使用和添加 MCP server 工具的更多信息,请参阅 user documentation
- 本地 (
stdio) Transport- 远程 (shclaude mcp add terraform -s user -t stdio -- docker run -i --rm hashicorp/terraform-mcp-serverstreamable-http) 传输层### 在 Codex CLI 中使用sh# Run server (example) docker run -p 8080:8080 --rm -e TRANSPORT_MODE=streamable-http -e TRANSPORT_HOST=0.0.0.0 hashicorp/terraform-mcp-serverAdd to Claude Code
claude mcp add --transport http terraform http://localhost:8080/mcp关于在 Codex CLI 中使用和添加 MCP server 工具的更多信息,请参阅 user documentation。
> 注意: 对于需要身份验证的 HCP Terraform 或 Terraform Enterprise 工具,请在 Docker 命令中添加
TFE_ADDRESS和TFE_TOKEN。- 本地 (
stdio) 传输- 远程 (shcodex mcp add terraform -- docker run -i --rm hashicorp/terraform-mcp-serverstreamable-http) 传输层### 与 Gemini 扩展配合使用sh# Run server (example) docker run --rm -p 127.0.0.1:8080:8080 -e TRANSPORT_MODE=streamable-http -e TRANSPORT_HOST=0.0.0.0 hashicorp/terraform-mcp-serverAdd to Codex
codex mcp add terraform --url http://localhost:8080/mcp为了安全起见,请避免硬编码凭据,请创建或更新
~/.gemini/.env(其中 ~ 为您的主目录或项目目录)以存储 HCP Terraform 或 Terraform Enterprise 凭据安装扩展并运行 Geminicode# ~/.gemini/.env
TFE_ADDRESS=your_tfe_address_here
TFE_TOKEN=your_tfe_token_here### 在 Bob IDE / Shell 中使用codegemini extensions install https://github.com/hashicorp/terraform-mcp-server
gemini关于在 Bob IDE 或 Shell 中使用和添加 MCP servers 工具的更多信息,请参阅 Using MCP in Bob。
<table>
<tr><th>Version 0.3.0+ 或更高版本</th><th>Version 0.2.3 或更低版本</th></tr>
<tr valign=top>
<td></td>json{
"mcpServers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e", "TFE_ADDRESS=<<PASTE_TFE_ADDRESS_HERE>>",
"-e", "TFE_TOKEN=<<PASTE_TFE_TOKEN_HERE>>",
"hashicorp/terraform-mcp-server:1.2.0"
],
"disabled": false
}
}
}
<td></td>json{
"mcpServers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"hashicorp/terraform-mcp-server:0.2.3"
],
"disabled": false
}
}
}
</tr>
</table>从源码安装
使用最新的 release 版本:
使用consolego install github.com/hashicorp/terraform-mcp-server/cmd/terraform-mcp-server@latestmain分支:<table>consolego install github.com/hashicorp/terraform-mcp-server/cmd/terraform-mcp-server@main
<tr><th>Version 0.3.0+ 或更高版本</th><th>Version 0.2.3 或更低版本</th></tr>
<tr valign=top>
<td></td>json{
"mcp": {
"servers": {
"terraform": {
"type": "stdio",
"command": "/path/to/terraform-mcp-server",
"env": {
"TFE_TOKEN": "<<TFE_TOKEN_HERE>>"
},
}
}
}
}
<td></td>json{
"mcp": {
"servers": {
"terraform": {
"type": "stdio",
"command": "/path/to/terraform-mcp-server"
}
}
}
}
</tr>
</table>在本地构建 Docker 镜像
在运行服务器之前,您需要先在本地构建 Docker 镜像:
1. Clone 仓库:
2. 构建 Docker 镜像:bashgit clone https://github.com/hashicorp/terraform-mcp-server.git
cd terraform-mcp-server3. 这将创建一个本地 Docker 镜像,您可以在接下来的配置中使用它。bashmake docker-build> 注意: 在 Docker 中运行时,应设置bash# Run in stdio mode
docker run -i --rm terraform-mcp-server:devRun in streamable-http mode
docker run -p 8080:8080 --rm -e TRANSPORT_MODE=streamable-http -e TRANSPORT_HOST=0.0.0.0 terraform-mcp-server:devFilter tools (optional)
docker run -i --rm terraform-mcp-server:dev --toolsets=registry,terraform docker run -i --rm terraform-mcp-server:dev --tools=search_providers,get_provider_detailsTRANSPORT_HOST=0.0.0.0以允许来自容器外部的连接。4. (可选) 在 http 模式下测试连接
5. 您可以按照以下方式在 AI assistant 上使用它:bash# Test the connection
curl http://localhost:8080/health## 可用工具json{
"mcpServers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"terraform-mcp-server:dev"
]
}
}
}可用资源
可用指标
共收集两类指标。
首先,通过使用otelhttp.NewHandler(...)包装 HTTP mux 来添加标准 HTTP server 指标。这些指标包括:1. http.server.request.body.size
2. http.server.response.body.size
3. http.server.request.duration其次,MCP server 使用 MCP hooks (
BeforeCallTool/AfterCallTool) 记录围绕工具执行的自定义工具指标。这些指标包括:1. mcp_tool_calls_total
2. mcp_tool_errors_total
3. mcp_tool_duration_seconds工具过滤
使用
--toolsets(组)或--tools(单个)来控制可用工具:可用 toolsets:bash# Enable tool groups (default: registry)
terraform-mcp-server --toolsets=registry,terraformEnable specific tools only
terraform-mcp-server --tools=search_providers,get_provider_details,list_workspacesregistry、registry-private、terraform、all、default。具体工具名称请参阅pkg/toolsets/mapping.go。这两个 flag 不能同时使用。Transport 支持
Terraform MCP Server 支持多种传输协议:
1. Stdio Transport (默认)
使用 JSON-RPC 消息的标准输入/输出通信。适用于本地开发和与 MCP 客户端的直接集成。2. StreamableHTTP Transport
基于现代 HTTP 的传输方式,同时支持直接 HTTP 请求和 Server-Sent Events (SSE) 流。这是远程/分布式部署的推荐传输方式。特性:
- Endpoint:
http://{hostname}:8080/mcp
- Health Check:
http://{hostname}:8080/health
- 环境配置: 设置
TRANSPORT_MODE=http或TRANSPORT_PORT=8080以启用
- 组织白名单: 将
MCP_ORGANIZATION_ALLOWLIST或--organization-allowlist设置为允许的 HCP Terraform 组织名称的 CSV 列表
Session 模式
在使用 StreamableHTTP transport 时,Terraform MCP Server 支持两种 session 模式:
- Stateful Mode (默认):在请求之间维持 session 状态,支持上下文感知操作。
- Stateless Mode:每个请求独立处理,不维持 session 状态,适用于高可用部署或使用负载均衡器的场景。
要启用 stateless mode,请设置环境变量:
## 集中式部署的 Token 透传bashexport MCP_SESSION_MODE=stateless当为多个用户以集中方式(StreamableHTTP 模式)运行 MCP server 时,每个用户可以通过 HTTP header 传递自己的 Terraform token 以执行 RBAC 强制执行。这使得单个 server 实例能够为具有不同权限的多个用户提供服务。
当配置了
MCP_ORGANIZATION_ALLOWLIST或--organization-allowlist时,该白名单必须是 HCP Terraform organization 名称的 CSV 列表。server 要求提供Authorization: Bearer <token>,除非该 token 能够访问 CSV 白名单中的至少一个 organization,否则将拒绝请求。如果请求中同时包含TFE_TOKENheader,则 bearer token 具有优先权,以确保由白名单验证的 token 也是用于 Terraform API 请求的 token。Organization 名称的匹配不区分大小写。如果配置的 CSV 值解析出的 organization 名称数量为零,server 将以 malformed organization allowlist 错误退出。客户端 IP 转发
当 MCP server 在代理或负载均衡器之后集中运行时,您可以通过
X-Forwarded-Forheader 将原始客户端 IP 转发给 HCP Terraform / TFE。此功能默认关闭,必须通过MCP_FORWARD_CLIENT_IP=true启用。启用后,server 将根据
MCP_REMOTE_IP_METHOD获取客户端 IP:| Method | Behavior |
|--------|----------|
|RemoteAddr(默认) | 仅使用直接 TCP 连接的地址。忽略X-Forwarded-For和X-Real-IP。 |
|X-Real-IP| 如果X-Real-IP头部是有效的 IP 则使用它,否则回退到RemoteAddr。 |
|X-Forwarded-For| 使用X-Forwarded-For链,从右侧选择距离MCP_XFF_TRUSTED_HOPS位置的条目。如果值缺失或无效,则回退到RemoteAddr。 |Trust model
X-Forwarded-For和X-Real-IP由客户端和中间代理设置,因此除非服务器前有可信代理对其进行覆盖,否则它们可能会被伪造。因此,默认值为RemoteAddr,它仅信任与服务器直接连接的对端。仅当服务器位于由你控制且会设置这些头部的代理之后时,才启用X-Real-IP或X-Forwarded-For。Trusted hops
使用
X-Forwarded-For时,MCP_XFF_TRUSTED_HOPS是指在服务器和互联网之间你所运行的代理数量。跳数(Hops)从链的右侧开始计算,因为每个代理都会附加它接收请求的地址,且最右侧的条目由最靠近服务器的代理设置。服务器会跳过相应数量的可信条目,并取其左侧的下一个条目。例如,当MCP_XFF_TRUSTED_HOPS=1且 header 为200.1.2.3, 10.1.1.10时,服务器选择200.1.2.3。当MCP_XFF_TRUSTED_HOPS=2且为108.0.0.1, 200.1.2.3, 10.1.1.10, 192.168.0.1时,它选择200.1.2.3。如果跳数(hop count)大于条目数,或者选中的条目不是有效的 IP,服务器将回退到RemoteAddr。跳数设置过低会信任客户端提供的值;设置过高则会信任您自身基础设施中更深层的地址。请将其设置为您运行的代理的确切数量。
Limitations
- 服务器仅读取请求中的第一个
X-Forwarded-Forheader。请求携带多个X-Forwarded-Forheader 是合法的,但 Go 标准库仅返回第一个,且服务器不会将它们合并。如果您的代理链产生多个 header,请将其配置为产生单个合并的X-Forwarded-Forheader。
- 同时支持 IPv4 和 IPv6 地址。非有效 IP 的值将被拒绝,服务器将回退到
RemoteAddr。
Migrating from earlier versions在没有配置的情况下,早期版本在
X-Forwarded-For标头存在时会使用其最左侧的值。由于最左侧的值最容易被伪造,因此这种方式并不安全。现在的默认值是RemoteAddr。如果您在代理后面运行服务器,并依赖于X-Forwarded-For转发至 HCP Terraform / TFE,请设置MCP_REMOTE_IP_METHOD=X-Forwarded-For并将MCP_XFF_TRUSTED_HOPS设置为您运行的代理数量。支持的标头
| 标头 | 描述 |
|--------|-------------|
|TFE_TOKEN| Terraform API token |
|Authorization: Bearer <token>| 使用标准 Bearer 认证的替代方法 |
|TFE_SKIP_TLS_VERIFY| 跳过请求的 TLS 验证 |示例:curl
### 安全注意事项bash# Using TFE_TOKEN header curl -X POST http://localhost:8080/mcp \ -H "Content-Type: application/json" \ -H "TFE_TOKEN: your-user-token" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize",...}'Using Authorization Bearer header
curl -X POST http://localhost:8080/mcp \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your-user-token" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize",...}'- 客户端无法设置
TFE_ADDRESS。在streamable-http模式下,Terraform 地址仅来源于服务器端的TFE_ADDRESS环境变量(或默认值)。尝试通过 HTTP header 或查询参数设置TFE_ADDRESS的请求将被拒绝并返回 403。这可以防止客户端将请求及其Authorizationtoken 重定向到恶意服务器。
- 托管部署标识:设置
TF_MCP_SHARED_SECRET会在每次 HCP Terraform / TFE 请求中将该值作为X-Tf-Mcp-Secretheader 发送,使后端能够识别来自已知托管部署的请求(例如用于应用 IP allowlists)。由于这是一个在 header 中发送的静态密钥,请仅在 TLS 上使用,并将该值视为凭据。
- 切勿在查询参数中传递 token —— 服务器将以 400 错误拒绝此类请求。
- 在进行集中部署时,请始终使用 TLS (
MCP_TLS_CERT_FILE/MCP_TLS_KEY_FILE) 以保护传输中的 token。
- 配置
MCP_ALLOWED_ORIGINS以限制可连接的客户端。
集中部署示例
用户随后通过 header 传递个人 token 进行连接,从而实现针对每个用户的 RBAC 强制执行。bash# Start server centrally (no token set server-side) docker run -p 8080:8080 \ -e TRANSPORT_MODE=streamable-http \ -e TRANSPORT_HOST=0.0.0.0 \ -e TFE_ADDRESS=https://tfe.company.com \ -e MCP_TLS_CERT_FILE=/certs/server.pem \ -e MCP_TLS_KEY_FILE=/certs/server-key.pem \ -e MCP_ALLOWED_ORIGINS=https://ide.company.com \ -e MCP_ORGANIZATION_ALLOWLIST=team-alpha,team-beta \ -v /path/to/certs:/certs \ hashicorp/terraform-mcp-server:1.2.0故障排查
企业代理 / TLS 检查 (Zscaler 等)
如果您处于执行 TLS 检查的企业代理(如 Zscaler Internet Access)之后,可能会看到证书错误:
解决方案:将公司 CA 证书挂载到容器中:codetls: failed to verify certificate: x509: certificate signed by unknown authority对于 MCP 客户端配置:bashdocker run -i --rm \
-v /path/to/corporate-ca.pem:/etc/ssl/certs/corporate-ca.pem \
-e SSL_CERT_FILE=/etc/ssl/certs/corporate-ca.pem \
hashicorp/terraform-mcp-server:1.2.0替代方案:直接运行二进制文件json{
"mcpServers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-v", "/path/to/corporate-ca.pem:/etc/ssl/certs/corporate-ca.pem",
"-e", "SSL_CERT_FILE=/etc/ssl/certs/corporate-ca.pem",
"-e", "TFE_TOKEN=<>",
"hashicorp/terraform-mcp-server:1.2.0"
]
}
}
}如果你的环境不允许使用 Docker,你可以直接安装并运行 server 二进制文件,它将使用系统的证书存储:
## 开发bashgo install github.com/hashicorp/terraform-mcp-server/cmd/terraform-mcp-server@latest
terraform-mcp-server stdio前置条件
- Go (具体版本请查看 go.mod 文件)
- Docker (可选,用于容器构建)
可用 Make 命令
| 命令 | 描述 |
|---------|-------------|
|make build| 构建二进制文件 |
|make test| 运行所有测试 |
|make test-e2e| 运行端到端测试 |
|make docker-build| 构建 Docker 镜像 |
|make run-http| 在本地运行 HTTP 服务器 |
|make docker-run-http| 在 Docker 中运行 HTTP 服务器 |
|make test-http| 测试 HTTP 健康检查端点 |
|make clean| 删除构建产物 |
|make help| 显示所有可用命令 |贡献
1. Fork 本仓库
2. 创建你的特性分支
3. 进行修改
4. 运行测试
5. 提交 pull request许可证
本项目基于 MPL-2.0 开源许可证。完整条款请参阅 LICENSE 文件。
安全性
如遇安全问题,请联系 [email protected] 或遵循我们的 security policy。
支持
如需报告 Bug 或提出功能请求,请在 GitHub 上提交 issue。
一般性问题和讨论请发起 GitHub Discussion。
- Endpoint:
- 本地 (