关于 Terraform MCP Server
Terraform MCP Server 将 MCP 客户端连接到 Terraform Registry、HCP Terraform API,服务于基础设施即代码工作,并支持注册表查询与工作区管理。
主要功能
- 01查询 Terraform Registry 中的提供程序、模块和策略
- 02访问 HCP Terraform 与 Terraform Enterprise
- 03管理工作区与运行
- 04支持 Stdio 和 StreamableHTTP 传输
- 05可选的工具使用指标
适用场景
- 01查询 Terraform 提供程序、模块和策略
- 02查看组织、项目及私有注册表条目
- 03创建或更新工作区并管理运行
MCP 相关
这是一个 MCP 服务,向 MCP 客户端提供 Terraform Registry、HCP Terraform 和 Terraform Enterprise 操作。支持 Stdio 和 StreamableHTTP 传输。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Terraform MCP 服务
Terraform MCP 服务是一款 模型上下文协议(MCP)服务,可与 Terraform Registry 和 HCP Terraform API 无缝集成,为基础设施即代码(IaC)开发提供高级自动化和交互能力。
目录
| 服务能力 | 部署与安全 | 帮助与贡献 |
|---|---|---|
|
可用工具 可用资源 可用指标 工具筛选 |
会话模式 集中式部署的令牌透传 客户端 IP 转发 信任模型 可信跃点 限制 从早期版本迁移 支持的标头 安全注意事项 集中式部署示例 |
故障排除 企业代理和 TLS 检查 开发 贡献 许可证 安全 支持 |
- 双传输方式支持:同时支持 Stdio 和 StreamableHTTP 传输方式,并可配置端点
- Terraform Registry 集成:直接集成公共 Terraform Registry API,支持提供商、模块和策略
- HCP Terraform 和 Terraform Enterprise 支持:全面支持工作区管理、组织和项目列表,以及私有注册表访问
- 工作区操作:创建、更新和删除工作区,并支持变量、标签和运行管理
- 用于监控工具使用情况的 OTel 指标:在 Streamable HTTP 模式下,集成 OpenTelemetry 计量器以跟踪工具调用量、延迟和失败情况。启用此功能后还会公开默认的 HTTP 服务指标
**安全说明:**根据查询内容,MCP 服务可能会向 MCP 客户端和大模型公开某些 Terraform 数据。请勿将 MCP 服务用于不可信的 MCP 客户端或大模型。
**法律说明:**您对第三方 MCP 客户端/大模型的使用完全受该 MCP 客户端/大模型的使用条款约束,IBM 不对这类第三方工具的性能负责。IBM 明确否认对第三方 MCP 客户端/大模型作出的任何及所有保证,并且可能无法为解决由第三方工具导致的问题提供支持。
**注意:**MCP 服务提供的输出和建议是动态生成的,可能会因查询、模型和所连接的 MCP 客户端而异。用户应在实施前仔细审查所有输出/建议,确保其符合所在组织的安全最佳实践、成本效益目标和合规要求。
前提条件
- 确保已安装并运行 Docker,以便在容器化环境中使用该服务。
- 安装支持模型上下文协议(MCP)的 AI 助手。
命令行选项
环境变量:
| 变量 | 描述 | 默认值 |
|---|---|---|
TFE_ADDRESS | 设置用于 API 调用的 Terraform Enterprise/HCP Terraform 地址。必须包含协议(例如,https://app.terraform.io)。在 streamable-http 模式下,这是设置地址的唯一方式;客户端无法通过标头或查询参数提供地址。 | 可选 |
TFE_TOKEN | Terraform Enterprise API 令牌 | ""(空) |
TF_MCP_SHARED_SECRET | 在向 HCP Terraform / TFE 发送的请求中,通过 X-Tf-Mcp-Secret 标头传递的共享密钥,用于识别来自托管 MCP 部署的请求。仅应通过 TLS 使用。 | ""(空) |
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 连接的保活间隔(例如,30s、1m)。设为 0 可禁用 | 0 |
MCP_SESSION_MODE | 会话模式:stateful 或 stateless | stateful |
MCP_ALLOWED_ORIGINS | 以逗号分隔的 CORS 允许来源列表 | ""(空) |
MCP_CORS_MODE | CORS 模式:strict、development 或 disabled | strict |
MCP_TLS_CERT_FILE | TLS 证书文件路径;非 localhost 部署时必需(例如,/path/to/cert.pem) | ""(空) |
MCP_TLS_KEY_FILE | TLS 密钥文件路径;非 localhost 部署时必需(例如,/path/to/key.pem) | ""(空) |
MCP_RATE_LIMIT_GLOBAL | 全局速率限制(格式:rps:burst) | 10:20 |
MCP_RATE_LIMIT_SESSION | 每个会话的速率限制(格式:rps:burst) | 5:10 |
MCP_ORGANIZATION_ALLOWLIST | 允许访问 HTTP 服务的 HCP Terraform 组织名称 CSV 列表 | ""(空) |
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 服务的默认说明位于 cmd/terraform-mcp-server/instructions.md。如果这些说明不适合贵组织的 Terraform 实践,或者 MCP 服务生成的响应不准确,请替换为自己的说明并重新构建容器或二进制文件。instructions/example-mcp-instructions.md 中提供了此类说明的示例。
AGENTS.md 的作用本质上类似于面向编码 Agent 的 README:它为项目提供一个专门且固定的位置,用于提供上下文和说明,帮助 AI 编码 Agent 开展工作。同一个 AGENTS.md 文件可供不同的编码 Agent 使用。instructions/example-AGENTS.md 中提供了此类说明的示例。要使用它,请在 Terraform 配置所在目录中提交一个名为 AGENTS.md 的文件。
安装
在 Visual Studio Code 中使用
将以下 JSON 代码块添加到 VS Code 的用户设置(JSON)文件中。你可以按 Ctrl + Shift + P,然后输入 Preferences: Open User Settings (JSON) 来执行此操作。
有关在 VS Code 中使用 MCP 服务工具的更多信息,请参阅Agent 模式文档。
| 本地 | 远程 |
|---|---|
|
|
你也可以选择将类似的示例(即不带 mcp 键)添加到工作区中名为 .vscode/mcp.json 的文件里。这样就可以与他人共享配置。
| 本地 | 远程 |
|---|---|
|
|
在 Cursor 中使用
将以下内容添加到 Cursor 配置(~/.cursor/mcp.json)中,或通过“设置”→“Cursor 设置”→“MCP”添加:
| 本地 | 远程 |
|---|---|
|
|
在 Claude Desktop / Amazon Q Developer / Kiro CLI 中使用
有关在 Claude Desktop 中使用 MCP 服务工具的更多信息,请参阅用户文档。有关在 Amazon Q Developer 和 Kiro CLI 中使用 MCP 服务的更多信息,请参阅相关文档。
| 本地 | 远程 |
|---|---|
|
|
注意: Claude Desktop 不支持通过配置文件配置远程 MCP 服务,请改用自定义连接器。
在 Claude Code 中使用
有关在 Claude Code 中使用和添加 MCP 服务工具的更多信息,请参阅用户文档
| 本地 | 远程 |
|---|---|
|
|
有关在 Codex CLI 中使用和添加 MCP 服务工具的更多信息,请参阅用户文档。
注意: 对于需要身份验证的 HCP Terraform 或 Terraform Enterprise 工具,请将
TFE_ADDRESS和TFE_TOKEN添加到 Docker 命令中。
| 本地 | 远程 |
|---|---|
|
|
与 Gemini 扩展搭配使用
出于安全考虑,请勿将凭据硬编码。请创建或更新 ~/.gemini/.env(其中 ~ 表示你的主目录或项目目录),以存储 HCP Terraform 或 Terraform Enterprise 凭据
# ~/.gemini/.env
TFE_ADDRESS=your_tfe_address_here
TFE_TOKEN=your_tfe_token_here
安装扩展并运行 Gemini
gemini extensions install https://github.com/hashicorp/terraform-mcp-server
gemini
与 Bob IDE / Shell 搭配使用
有关在 Bob IDE 或 Shell 中使用和添加 MCP 服务工具的更多信息,请参阅在 Bob 中使用 MCP。
| 本地 | 远程 |
|---|---|
|
|
与 OpenCode 搭配使用
有关在 OpenCode 中使用和添加 MCP 服务的更多信息,请参阅用户文档。将服务添加到项目的 opencode.json 或全局配置文件 ~/.config/opencode/opencode.json 中。
| 本地 | 远程 |
|---|---|
|
|
Kubernetes(Helm)
可在 helm/terraform-mcp-server 下找到用于在 Kubernetes 上部署服务的 Helm chart。
从源代码安装
使用最新发布版本:
go install github.com/hashicorp/terraform-mcp-server/cmd/terraform-mcp-server@latest
使用 main 分支:
go install github.com/hashicorp/terraform-mcp-server/cmd/terraform-mcp-server@main
| 本地 | 远程 |
|---|---|
|
|
在本地构建 Docker 镜像
使用服务之前,需要在本地构建 Docker 镜像:
- 克隆代码库:
git clone https://github.com/hashicorp/terraform-mcp-server.git
cd terraform-mcp-server
- 构建 Docker 镜像:
make docker-build
- 这将创建一个本地 Docker 镜像,你可以在以下配置中使用它。
# Run in stdio mode
docker run -i --rm terraform-mcp-server:dev
# Run 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:dev
# Filter tools (optional)
docker run -i --rm terraform-mcp-server:dev --toolsets=registry,terraform
docker run -i --rm terraform-mcp-server:dev --tools=search_provider_docs,get_provider_details
注意: 在 Docker 中运行时,应设置
TRANSPORT_HOST=0.0.0.0,以允许来自容器外部的连接。
- (可选)在 http 模式下测试连接
# Test the connection
curl http://localhost:8080/health
- 你可以在 AI 助手中按如下方式使用它:
{
"mcpServers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"terraform-mcp-server:dev"
]
}
}
}
可用工具
可用资源
可用指标
会收集两类指标。 首先,将 HTTP mux 包装在 otelhttp.NewHandler(...) 中,以添加标准 HTTP 服务指标。这会生成:
- http.server.request.body.size
- http.server.response.body.size
- http.server.request.duration
其次,MCP 服务会使用 MCP 钩子(BeforeCallTool / AfterCallTool)记录工具执行相关的自定义指标。这些指标包括:
- mcp_tool_calls_total
- mcp_tool_errors_total
- mcp_tool_duration_seconds
工具筛选
使用 --toolsets(工具组)或 --tools(单个工具)控制可用工具:
# Enable tool groups (default: registry)
terraform-mcp-server --toolsets=registry,terraform
# Enable specific tools only
terraform-mcp-server --tools=search_provider_docs,get_provider_details,list_workspaces
可用工具组:registry、registry-private、terraform、all、default。单个工具名称请参阅 pkg/toolsets/mapping.go。这两个标志不能同时使用。
传输支持
Terraform MCP 服务支持多种传输协议:
1. Stdio 传输(默认)
使用 JSON-RPC 消息通过标准输入/输出进行通信。适用于本地开发以及与 MCP 客户端直接集成。
2. StreamableHTTP 传输
基于现代 HTTP 的传输方式,支持直接发送 HTTP 请求和使用服务器发送事件(SSE)流。这是远程/分布式部署的推荐传输方式。
功能:
- 端点:
http://{hostname}:8080/mcp - 健康检查:
http://{hostname}:8080/health - 环境配置:设置
TRANSPORT_MODE=http或TRANSPORT_PORT=8080以启用 - 组织允许列表:将
MCP_ORGANIZATION_ALLOWLIST或--organization-allowlist设置为包含允许的 HCP Terraform 组织名称的 CSV 列表
会话模式
Terraform MCP Server 使用 StreamableHTTP 传输时支持两种会话模式:
- 有状态模式(默认):在请求之间保留会话状态,支持感知上下文的操作。
- 无状态模式:独立处理每个请求,不保留会话状态,适用于高可用部署或使用负载均衡器的场景。
要启用无状态模式,请设置环境变量:
export MCP_SESSION_MODE=stateless
集中式部署的令牌透传
集中运行 MCP 服务(StreamableHTTP 模式)以供多个用户使用时,每位用户都可以通过 HTTP 标头传递自己的 Terraform 令牌,以执行 RBAC 权限控制。这样,单个服务实例就能为权限不同的多个用户提供服务。
配置 MCP_ORGANIZATION_ALLOWLIST 或 --organization-allowlist 时,允许列表必须是包含 HCP Terraform 组织名称的 CSV 列表。服务要求提供 Authorization: Bearer <token>,并会拒绝无法访问该 CSV 允许列表中至少一个组织的令牌所发出的请求。如果请求还包含 TFE_TOKEN 标头,则 Bearer 令牌优先,以确保允许列表验证的令牌也用于 Terraform API 请求。组织名称匹配时不区分大小写。如果配置的 CSV 值解析后不包含任何组织名称,服务将退出并报错,提示组织允许列表格式错误。
客户端 IP 转发
通过代理或负载均衡器在集中位置运行 MCP 服务时,可以通过 X-Forwarded-For 标头将发起请求的客户端 IP 转发到 HCP Terraform / TFE。此功能默认关闭,必须通过 MCP_FORWARD_CLIENT_IP=true 启用。
启用后,服务会根据 MCP_REMOTE_IP_METHOD 获取客户端 IP:
| 方法 | 行为 |
|---|---|
RemoteAddr(默认) | 仅使用直接 TCP 连接的地址。忽略 X-Forwarded-For 和 X-Real-IP。 |
X-Real-IP | 如果 X-Real-IP 标头包含有效 IP,则使用该 IP;否则回退到 RemoteAddr。 |
X-Forwarded-For | 使用 X-Forwarded-For 标头,选择从右侧起第 MCP_XFF_TRUSTED_HOPS 个条目。如果该值缺失或无效,则回退到 RemoteAddr。 |
信任模型
X-Forwarded-For 和 X-Real-IP 由客户端和中间代理设置,因此,除非位于服务前方的可信代理会覆盖这些标头,否则它们可能遭到伪造。因此,默认值为 RemoteAddr,仅信任与服务直接连接的对端。只有当服务位于由你控制且会设置这些标头的代理后方时,才启用 X-Real-IP 或 X-Forwarded-For。某些负载均衡器(包括 AWS Application Load Balancers)不会设置 X-Real-IP,因此使用这类负载均衡器时,该标头会直接来自客户端,不应使用。
可信任的跳数
使用 X-Forwarded-For 时,将 MCP_XFF_TRUSTED_HOPS 设置为你在服务前运行的代理数量。每个代理都会附加它收到请求时的来源地址,而不是自己的地址,因此客户端 IP 是从右侧数对应跳数的位置。其左侧的所有内容都由客户端发送,可能被伪造。
例如,若服务器位于单个负载均衡器(如 AWS ALB)之后,请设置 MCP_XFF_TRUSTED_HOPS=1。值为 198.51.100.7 的标头会解析为 198.51.100.7;值为 1.2.3.4, 198.51.100.7 的标头中,客户端自行发送了 1.2.3.4,也会解析为 198.51.100.7。当 MCP_XFF_TRUSTED_HOPS=2 且标头值为 1.2.3.4, 198.51.100.7, 10.0.0.5 时,服务会选择 198.51.100.7。如果跳数大于条目数,或选中的条目不是有效 IP,服务会回退到 RemoteAddr。
跳数设置过高会导致信任客户端提供的值;设置过低则会选中你自己基础设施中的地址。请将其设置为你实际运行的代理数量。
限制
- 如果请求携带多个
X-Forwarded-For标头,服务会按顺序将它们合并,然后再选择条目。X-Forwarded-For标头。 - 同时支持 IPv4 和 IPv6 地址。无效 IP 值会被拒绝,服务会回退到
RemoteAddr。
从早期版本迁移
早期版本在标头存在时会使用最左侧的 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 令牌 |
Authorization: Bearer <token> | 使用标准 Bearer 身份验证的替代方法 |
TFE_SKIP_TLS_VERIFY | 跳过对此请求的 TLS 验证 |
示例:curl
# 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 标头或查询参数设置TFE_ADDRESS的请求会被拒绝,并返回 403。这可以防止客户端将请求和Authorization令牌重定向到恶意服务。 - 托管部署标识: 设置
TF_MCP_SHARED_SECRET后,每个 HCP Terraform / TFE 请求都会在X-Tf-Mcp-Secret标头中发送该值,以便后端识别来自已知托管部署的请求(例如,用于应用 IP 允许列表)。这是通过标头发送的静态密钥,因此只能通过 TLS 使用,并应将其视为凭据。 - 切勿在查询参数中传递令牌——服务会拒绝此类请求并返回 400 错误。
- 在中心化部署时,始终使用 TLS(
MCP_TLS_CERT_FILE/MCP_TLS_KEY_FILE),以保护传输中的令牌。 - 配置
MCP_ALLOWED_ORIGINS,以限制可连接的客户端。
中心化部署示例
# 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.4.1
之后,用户通过标头传入各自的令牌进行连接,从而启用按用户实施的 RBAC 执行。
故障排除
企业代理 / TLS 检查(Zscaler 等)
如果你位于会执行 TLS 检查的企业代理之后(例如 Zscaler Internet Access),可能会遇到证书错误:
tls: failed to verify certificate: x509: certificate signed by unknown authority
解决方案:将企业 CA 证书挂载到容器中:
docker 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.4.1
对于 MCP 客户端配置:
{
"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.4.1"
]
}
}
}
替代方案:直接运行二进制文件
如果你的环境不允许使用 Docker,可以直接安装并运行服务二进制文件,它会使用系统的证书存储:
go 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 | 显示所有可用命令 |
贡献
- Fork 此仓库
- 创建功能分支
- 进行更改
- 运行测试
- 提交拉取请求
许可证
本项目采用 MPL-2.0 开源许可证。完整条款请参阅 LICENSE 文件。
安全
如需报告安全问题,请联系 [email protected],或遵循我们的安全政策。
支持
如需报告 Bug 或提交功能请求,请在 GitHub 上创建 Issue。
如有一般问题或想参与讨论,请开启 GitHub Discussion。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。