Terraform MCP Server
ทางการเซิร์ฟเวอร์ HashiCorp Terraform MCP สำหรับเวิร์กโฟลว์ Infrastructure as Code รวมถึงการค้นหาผู้ให้บริการและโมดูลผ่าน Terraform Registry
คุณทำอะไรได้บ้างด้วย Terraform MCP?
- ค้นหา Terraform Registry — ขอให้ค้นหา providers หรือ modules โดยใช้
search_providersและget_provider_detailsจาก registry สาธารณะ - จัดการเวิร์กสเปซ HCP Terraform — สร้าง อัปเดต หรือลบเวิร์กสเปซ และจัดการตัวแปร แท็ก และ runs ผ่านการดำเนินการเวิร์กสเปซ
- แสดงรายการองค์กรและโปรเจกต์ — ดึงข้อมูลรายการองค์กรและโปรเจกต์จาก HCP Terraform หรือ Terraform Enterprise
- เข้าถึงเนื้อหา registry ส่วนตัว — ค้นหา providers modules และ policies ใน registry ส่วนตัวด้วยชุดเครื่องมือ
registry-private - กรองเครื่องมือที่พร้อมใช้งาน — เปิดใช้งานเฉพาะความสามารถที่จำเป็นโดยใช้แฟล็ก
--toolsetsหรือ--toolsเช่นlist_workspaces
เอกสาร
Terraform MCP Server
Terraform MCP Server คือ Model Context Protocol (MCP) เซิร์ฟเวอร์ที่ผสานรวมกับ Terraform Registry และ HCP Terraform APIs ได้อย่างราบรื่น ช่วยให้สามารถทำงานอัตโนมัติและโต้ตอบขั้นสูงสำหรับการพัฒนา Infrastructure as Code (IaC)
สารบัญ
คุณสมบัติ
- รองรับ Transport แบบคู่: รองรับทั้ง Stdio และ StreamableHTTP transports พร้อม endpoint ที่กำหนดค่าได้
- การผสานรวม Terraform Registry: การผสานรวมโดยตรงกับ Terraform Registry APIs สาธารณะสำหรับ providers, modules และ policies
- รองรับ HCP Terraform และ Terraform Enterprise: การจัดการ workspace อย่างครบถ้วน การแสดงรายการองค์กร/โปรเจกต์ และการเข้าถึง registry ส่วนตัว
- การดำเนินการกับ Workspace: สร้าง อัปเดต ลบ workspaces พร้อมรองรับ variables, tags และการจัดการ run
- เมตริก OTel สำหรับการตรวจสอบการใช้งานเครื่องมือ: การผสานรวมกับ open telemetry meters เพื่อติดตามปริมาณการเรียกใช้เครื่องมือ เวลาแฝง และความล้มเหลวในโหมด Streamable HTTP นอกจากนี้ยังแสดงเมตริกเซิร์ฟเวอร์ HTTP เริ่มต้นเมื่อเปิดใช้คุณสมบัตินี้
หมายเหตุด้านความปลอดภัย: ขึ้นอยู่กับคำค้นหา MCP server อาจเปิดเผยข้อมูล Terraform บางอย่างให้กับ MCP client และ LLM อย่าใช้ MCP server กับ MCP clients หรือ LLMs ที่ไม่น่าเชื่อถือ
หมายเหตุทางกฎหมาย: การใช้ MCP Client/LLM ของบุคคลที่สามของคุณอยู่ภายใต้ข้อกำหนดการใช้งานของ MCP/LLM นั้นเท่านั้น และ IBM ไม่รับผิดชอบต่อประสิทธิภาพของเครื่องมือบุคคลที่สามดังกล่าว IBM ขอปฏิเสธการรับประกันและความรับผิดใดๆ ทั้งสิ้นสำหรับ MCP Clients/LLMs ของบุคคลที่สาม และอาจไม่สามารถให้การสนับสนุนเพื่อแก้ไขปัญหาที่เกิดจากเครื่องมือบุคคลที่สามได้
ข้อควรระวัง: ผลลัพธ์และคำแนะนำที่ให้โดย MCP server ถูกสร้างขึ้นแบบไดนามิกและอาจแตกต่างกันไปตามคำค้นหา โมเดล และ MCP client ที่เชื่อมต่อ ผู้ใช้ควรตรวจสอบผลลัพธ์/คำแนะนำทั้งหมดอย่างละเอียดเพื่อให้แน่ใจว่าสอดคล้องกับแนวทางปฏิบัติด้านความปลอดภัย เป้าหมายด้านความคุ้มค่า และข้อกำหนดการปฏิบัติตามข้อกำหนดขององค์กรก่อนนำไปใช้งาน
ข้อกำหนดเบื้องต้น
- ตรวจสอบให้แน่ใจว่าได้ติดตั้งและรัน Docker เพื่อใช้เซิร์ฟเวอร์ในสภาพแวดล้อมแบบ containerized
- ติดตั้งผู้ช่วย AI ที่รองรับ Model Context Protocol (MCP)
ตัวเลือกบรรทัดคำสั่ง
ตัวแปรสภาพแวดล้อม:
| ตัวแปร | คำอธิบาย | ค่าเริ่มต้น |
|---|---|---|
TFE_ADDRESS | กำหนดที่อยู่ Terraform Enterprise/HCP Terraform สำหรับการเรียก API ต้องรวมโปรโตคอล (เช่น https://app.terraform.io) ในโหมด streamable-http นี่เป็นวิธีเดียวในการตั้งค่าที่อยู่ ไม่สามารถระบุโดยไคลเอนต์ผ่าน header หรือ query parameter ได้ | ไม่บังคับ |
TFE_TOKEN | โทเค็น API ของ Terraform Enterprise | "" (ว่างเปล่า) |
TF_MCP_SHARED_SECRET | ความลับที่ใช้ร่วมกันซึ่งส่งเป็น header X-Tf-Mcp-Secret ในการร้องขอไปยัง HCP Terraform / TFE ใช้เพื่อระบุคำขอที่มาจากการปรับใช้ MCP ที่โฮสต์ ควรใช้ผ่าน TLS เท่านั้น | "" (ว่างเปล่า) |
TFE_SKIP_TLS_VERIFY | ข้ามการตรวจสอบ TLS ของ HCP Terraform หรือ Terraform Enterprise | 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 transport (ค่า http แบบเดิมยังรองรับ) | stdio |
TRANSPORT_HOST | โฮสต์สำหรับผูกเซิร์ฟเวอร์ HTTP | 127.0.0.1 |
TRANSPORT_PORT | พอร์ตเซิร์ฟเวอร์ HTTP | 8080 |
MCP_ENDPOINT | เส้นทาง endpoint ของเซิร์ฟเวอร์ HTTP | /mcp |
MCP_REDIRECT_ROOT_URL | URL สำหรับเปลี่ยนเส้นทางคำขอไปยัง / | "" |
MCP_KEEP_ALIVE | ช่วงเวลา keep-alive สำหรับการเชื่อมต่อ SSE (เช่น 30s, 1m) ตั้งเป็น 0 เพื่อปิดใช้งาน | 0 |
MCP_SESSION_MODE | โหมดเซสชัน: stateful หรือ stateless | stateful |
MCP_ALLOWED_ORIGINS | รายการ 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 | รายชื่อชื่อองค์กร HCP Terraform ที่อนุญาตให้เข้าถึงเซิร์ฟเวอร์ HTTP คั่นด้วยเครื่องหมายจุลภาค | "" (ว่างเปล่า) |
MCP_FORWARD_CLIENT_IP | ส่งต่อ IP ของไคลเอนต์ไปยัง HCP Terraform / TFE ผ่าน X-Forwarded-For ตั้งค่าเป็น true เพื่อเปิดใช้งาน | false |
MCP_REMOTE_IP_METHOD | วิธีที่ IP ของไคลเอนต์ถูกดึงมาเมื่อเปิดใช้งานการส่งต่อ: RemoteAddr (การเชื่อมต่อโดยตรงเท่านั้น), X-Real-IP หรือ X-Forwarded-For | RemoteAddr |
MCP_XFF_TRUSTED_HOPS | จำนวน hop proxy ที่น่าเชื่อถือนับจากด้านขวาของ chain 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 | ควบคุมความถี่ของการ flush เมตริก | 2 |
OTEL_METRICS_ENDPOINT | URL ของ OTel Collector หรือ backend ของคุณ | localhost:4318 |
INSTANA_ENABLED | เปิดใช้งาน Instana instrumentation (เมตริกและการติดตามคำขอ HTTP) สำหรับเซิร์ฟเวอร์ streamable-http ต้องมี Instana agent ที่เซิร์ฟเวอร์สามารถเข้าถึงได้ | false |
INSTANA_SERVICE_NAME | หากเปิดใช้งาน Instana instrumentation ชื่อบริการที่จะใช้สำหรับ MCP server | 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 ให้คำตอบที่ไม่ถูกต้อง โปรดแทนที่ด้วยคำแนะนำของคุณเองและสร้าง container หรือ binary ใหม่ ตัวอย่างของคำแนะนำดังกล่าวอยู่ใน instructions/example-mcp-instructions.md
AGENTS.md ทำหน้าที่เหมือน README สำหรับ coding agents: เป็นสถานที่เฉพาะและคาดเดาได้สำหรับให้บริบทและคำแนะนำเพื่อช่วยให้ AI coding agents ทำงานในโปรเจกต์ของคุณ ไฟล์ AGENTS.md หนึ่งไฟล์ทำงานร่วมกับ coding agents ต่างๆ ได้ ตัวอย่างของคำแนะนำดังกล่าวอยู่ใน instructions/example-AGENTS.md เพื่อใช้งาน ให้ commit ไฟล์ชื่อ AGENTS.md ไปยังไดเรกทอรีที่เก็บการกำหนดค่า Terraform ของคุณ
การติดตั้ง
การใช้งานกับ Visual Studio Code
เพิ่มบล็อก JSON ต่อไปนี้ลงในไฟล์ User Settings (JSON) ของคุณใน VS Code คุณสามารถทำได้โดยกด Ctrl + Shift + P และพิมพ์ Preferences: Open User Settings (JSON)
ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้เครื่องมือ MCP server ใน เอกสารโหมด agent ของ VS Code
| เวอร์ชัน 0.3.0+ หรือสูงกว่า | เวอร์ชัน 0.2.3 หรือต่ำกว่า |
|---|---|
|
|
คุณสามารถเพิ่มตัวอย่างที่คล้ายกัน (เช่น ไม่มีคีย์ mcp) ลงในไฟล์ชื่อ .vscode/mcp.json ใน workspace ของคุณได้ ซึ่งจะช่วยให้คุณสามารถแชร์การกำหนดค่ากับผู้อื่นได้
| เวอร์ชัน 0.3.0+ หรือสูงกว่า | เวอร์ชัน 0.2.3 หรือต่ำกว่า |
|---|---|
|
|
การใช้งานกับ Cursor
เพิ่มสิ่งนี้ลงในการกำหนดค่า Cursor ของคุณ (~/.cursor/mcp.json) หรือผ่าน Settings → Cursor Settings → MCP:
| เวอร์ชัน 0.3.0+ หรือสูงกว่า | เวอร์ชัน 0.2.3 หรือต่ำกว่า |
|---|---|
|
|
การใช้งานกับ Claude Desktop / Amazon Q Developer / Kiro CLI
อ่านเพิ่มเติมเกี่ยวกับการใช้เครื่องมือ MCP server ใน Claude Desktop ได้ที่ เอกสารผู้ใช้ อ่านเพิ่มเติมเกี่ยวกับการใช้ MCP server ใน Amazon Q Developer และ Kiro CLI
| เวอร์ชัน 0.3.0 ขึ้นไป | เวอร์ชัน 0.2.3 หรือต่ำกว่า |
|---|---|
|
|
การใช้งานกับ Claude Code
อ่านเพิ่มเติมเกี่ยวกับการใช้และการเพิ่มเครื่องมือ MCP server ใน Claude Code ได้ที่ เอกสารผู้ใช้
- Local (
stdio) Transport
claude mcp add terraform -s user -t stdio -- docker run -i --rm hashicorp/terraform-mcp-server
- Remote (
streamable-http) Transport
# Run server (example)
docker run -p 8080:8080 --rm -e TRANSPORT_MODE=streamable-http -e TRANSPORT_HOST=0.0.0.0 hashicorp/terraform-mcp-server
# Add to Claude Code
claude mcp add --transport http terraform http://localhost:8080/mcp
การใช้งานกับ Codex CLI
อ่านเพิ่มเติมเกี่ยวกับการใช้และการเพิ่มเครื่องมือ MCP server ใน Codex CLI ได้ที่ เอกสารผู้ใช้
หมายเหตุ: เพิ่ม
TFE_ADDRESSและTFE_TOKENในคำสั่ง Docker สำหรับเครื่องมือ HCP Terraform หรือ Terraform Enterprise ที่ผ่านการรับรองความถูกต้อง
- Local (
stdio) Transport
codex mcp add terraform -- docker run -i --rm hashicorp/terraform-mcp-server
- Remote (
streamable-http) Transport
# 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-server
# Add to Codex
codex mcp add terraform --url http://localhost:8080/mcp
การใช้งานกับส่วนขยาย 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
อ่านเพิ่มเติมเกี่ยวกับการใช้และการเพิ่มเครื่องมือ MCP servers ใน Bob IDE หรือ Shell ได้ที่ การใช้ MCP ใน Bob
| เวอร์ชัน 0.3.0 ขึ้นไป | เวอร์ชัน 0.2.3 หรือต่ำกว่า |
|---|---|
|
|
ติดตั้งจากซอร์ส
ใช้เวอร์ชันรีลีสล่าสุด:
go install github.com/hashicorp/terraform-mcp-server/cmd/terraform-mcp-server@latest
ใช้ branch หลัก:
go install github.com/hashicorp/terraform-mcp-server/cmd/terraform-mcp-server@main
| เวอร์ชัน 0.3.0 ขึ้นไป | เวอร์ชัน 0.2.3 หรือต่ำกว่า |
|---|---|
|
|
สร้าง Docker Image ในเครื่อง
ก่อนใช้ server คุณต้องสร้าง Docker image ในเครื่องก่อน:
- โคลน repository:
git clone https://github.com/hashicorp/terraform-mcp-server.git
cd terraform-mcp-server
- สร้าง Docker image:
make docker-build
- ขั้นตอนนี้จะสร้าง Docker image ในเครื่องที่คุณสามารถใช้ในการกำหนดค่าต่อไปนี้
# 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_providers,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"
]
}
}
}
เครื่องมือที่มีให้ใช้งาน
ดูเครื่องมือที่มีให้ใช้งานที่นี่ :link:
ทรัพยากรที่มีให้ใช้งาน
ดูทรัพยากรที่มีให้ใช้งานที่นี่ :link:
เมตริกที่มีให้ใช้งาน
มีการเก็บเมตริกสองประเภท ประการแรก เมตริกมาตรฐานของ HTTP server จะถูกเพิ่มโดยการครอบ HTTP mux ด้วย otelhttp.NewHandler(...) ซึ่งจะส่งออก:
- http.server.request.body.size
- http.server.response.body.size
- http.server.request.duration
ประการที่สอง MCP server จะบันทึกเมตริกเครื่องมือแบบกำหนดเองรอบการทำงานของเครื่องมือโดยใช้ MCP hooks (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_providers,get_provider_details,list_workspaces
ชุดเครื่องมือที่มีให้ใช้งาน: registry, registry-private, terraform, all, default ดู pkg/toolsets/mapping.go สำหรับชื่อเครื่องมือแต่ละรายการ ไม่สามารถใช้ทั้งสอง flag พร้อมกันได้
การรองรับ Transport
Terraform MCP Server รองรับโปรโตคอล transport หลายแบบ:
1. Stdio Transport (ค่าเริ่มต้น)
การสื่อสารผ่าน standard input/output โดยใช้ข้อความ JSON-RPC เหมาะสำหรับการพัฒนาท้องถิ่นและการเชื่อมต่อโดยตรงกับ MCP clients
2. StreamableHTTP Transport
Transport ที่ใช้ HTTP สมัยใหม่ รองรับทั้งคำขอ HTTP โดยตรงและสตรีม Server-Sent Events (SSE) นี่คือ transport ที่แนะนำสำหรับการตั้งค่าระยะไกล/แบบกระจาย
คุณสมบัติ:
- Endpoint:
http://{hostname}:8080/mcp - Health Check:
http://{hostname}:8080/health - การกำหนดค่าสภาพแวดล้อม: ตั้งค่า
TRANSPORT_MODE=httpหรือTRANSPORT_PORT=8080เพื่อเปิดใช้งาน - รายการอนุญาตองค์กร: ตั้งค่า
MCP_ORGANIZATION_ALLOWLISTหรือ--organization-allowlistเป็นรายการ CSV ของชื่อองค์กร HCP Terraform ที่อนุญาต
โหมดเซสชัน
Terraform MCP Server รองรับสองโหมดเซสชันเมื่อใช้ StreamableHTTP transport:
- Stateful Mode (ค่าเริ่มต้น): รักษาสถานะเซสชันระหว่างคำขอ ทำให้สามารถดำเนินการที่คำนึงถึงบริบทได้
- Stateless Mode: แต่ละคำขอจะถูกประมวลผลอย่างอิสระโดยไม่รักษาสถานะเซสชัน ซึ่งมีประโยชน์สำหรับการปรับใช้ที่มีความพร้อมใช้งานสูงหรือเมื่อใช้ load balancers
เพื่อเปิดใช้งาน stateless mode ให้ตั้งค่าตัวแปรสภาพแวดล้อม:
export MCP_SESSION_MODE=stateless
Token Passthrough สำหรับการปรับใช้แบบรวมศูนย์
เมื่อรัน MCP server แบบรวมศูนย์ (โหมด StreamableHTTP) สำหรับผู้ใช้หลายคน ผู้ใช้แต่ละคนสามารถส่ง token Terraform ของตนเองผ่าน HTTP headers สำหรับการบังคับใช้ RBAC ซึ่งช่วยให้อินสแตนซ์ server เดียวสามารถให้บริการผู้ใช้หลายคนที่มีสิทธิ์ต่างกันได้
เมื่อกำหนดค่า MCP_ORGANIZATION_ALLOWLIST หรือ --organization-allowlist รายการอนุญาตต้องเป็นรายการ CSV ของชื่อองค์กร HCP Terraform server ต้องการ Authorization: Bearer <token> และปฏิเสธคำขอเว้นแต่ token นั้นจะสามารถเข้าถึงองค์กรอย่างน้อยหนึ่งองค์กรในรายการอนุญาต CSV bearer token จะมีความสำคัญกว่า หากคำขอยังมี header TFE_TOKEN ด้วย เพื่อให้แน่ใจว่า token ที่ตรวจสอบโดยรายการอนุญาตคือ token ที่ใช้สำหรับคำขอ Terraform API การจับคู่ชื่อองค์กรไม่คำนึงถึงตัวพิมพ์เล็กใหญ่ หากค่า CSV ที่กำหนดค่าไว้แยกวิเคราะห์เป็นชื่อองค์กรศูนย์ชื่อ server จะออกจากระบบด้วยข้อผิดพลาดรายการอนุญาตองค์กรที่ไม่ถูกต้อง
การส่งต่อ IP ของไคลเอ็นต์
เมื่อรัน MCP server แบบรวมศูนย์หลัง proxy หรือ load balancer คุณสามารถส่งต่อ IP ของไคลเอ็นต์ต้นทางไปยัง HCP Terraform / TFE ผ่าน header X-Forwarded-For ได้ โดยค่าเริ่มต้นปิดอยู่และต้องเปิดใช้งานด้วย MCP_FORWARD_CLIENT_IP=true
เมื่อเปิดใช้งาน server จะใช้ IP ของไคลเอ็นต์ตาม MCP_REMOTE_IP_METHOD:
| วิธีการ | พฤติกรรม |
|---|---|
RemoteAddr (ค่าเริ่มต้น) | ใช้เฉพาะที่อยู่ของการเชื่อมต่อ TCP โดยตรง ไม่สนใจ X-Forwarded-For และ X-Real-IP |
X-Real-IP | ใช้ header X-Real-IP หากเป็น IP ที่ถูกต้อง มิฉะนั้นจะใช้ RemoteAddr แทน |
X-Forwarded-For | ใช้ chain X-Forwarded-For โดยเลือกตำแหน่ง MCP_XFF_TRUSTED_HOPS จากทางขวา จะใช้ RemoteAddr แทนหากค่าไม่ถูกต้องหรือไม่มี |
โมเดลความเชื่อถือ
X-Forwarded-For และ X-Real-IP ถูกตั้งค่าโดยไคลเอ็นต์และ proxy ตัวกลาง ดังนั้นจึงสามารถปลอมแปลงได้ เว้นแต่ proxy ที่เชื่อถือได้หน้า server จะเขียนทับ ค่านี้ด้วยเหตุนี้ค่าเริ่มต้นคือ RemoteAddr ซึ่งเชื่อถือเฉพาะ peer ที่ server เชื่อมต่อโดยตรงเท่านั้น เปิดใช้งาน X-Real-IP หรือ X-Forwarded-For เฉพาะเมื่อ server อยู่หลัง proxy ที่คุณควบคุมซึ่งตั้งค่า headers เหล่านี้
จำนวน hop ที่เชื่อถือได้
เมื่อใช้ X-Forwarded-For ค่า MCP_XFF_TRUSTED_HOPS คือจำนวน proxy ที่คุณดำเนินการระหว่าง server และอินเทอร์เน็ต นับ hop จากทางขวาของ chain เนื่องจากแต่ละ proxy จะเพิ่มที่อยู่ที่ได้รับคำขอ และรายการขวาสุดถูกตั้งค่าโดย proxy ที่ใกล้กับ server มากที่สุด server จะข้ามรายการที่เชื่อถือได้จำนวนนั้นและใช้รายการถัดไปทางซ้าย
ตัวอย่างเช่น ด้วย MCP_XFF_TRUSTED_HOPS=1 และ header เป็น 200.1.2.3, 10.1.1.10 server จะเลือก 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 มากกว่าจำนวนรายการ หรือรายการที่เลือกไม่ใช่ IP ที่ถูกต้อง server จะใช้ RemoteAddr แทน
การตั้งค่าจำนวน hop ต่ำเกินไปจะเชื่อถือค่าที่ไคลเอ็นต์ส่งมา การตั้งค่าสูงเกินไปจะเชื่อถือที่อยู่ที่ลึกเข้าไปในโครงสร้างพื้นฐานของคุณเอง ตั้งค่าเป็นจำนวน proxy ที่คุณรันอย่างแน่นอน
ข้อจำกัด
- server อ่านเฉพาะ header
X-Forwarded-Forแรกบนคำขอเท่านั้น การที่คำขอมีหลาย headerX-Forwarded-Forนั้นถูกต้อง แต่ไลบรารีมาตรฐานของ Go จะคืนค่าเฉพาะค่าแรก และ server จะไม่รวมเข้าด้วยกัน หาก chain proxy ของคุณส่งหลาย headers ให้กำหนดค่าให้ส่ง headerX-Forwarded-Forเดียวที่รวมกัน - รองรับทั้งที่อยู่ IPv4 และ IPv6 ค่าที่ไม่ใช่ IP ที่ถูกต้องจะถูกปฏิเสธและ server จะใช้
RemoteAddrแทน
การย้ายจากเวอร์ชันก่อนหน้า
เวอร์ชันก่อนหน้าใช้ค่า X-Forwarded-For ซ้ายสุดเมื่อมี header โดยไม่มีการกำหนดค่า ซึ่งไม่ปลอดภัย เนื่องจากค่าซ้ายสุดถูกปลอมแปลงได้ง่ายที่สุด ค่าเริ่มต้นตอนนี้คือ RemoteAddr หากคุณรัน server หลัง proxy และพึ่งพาการส่งต่อ X-Forwarded-For ไปยัง HCP Terraform / TFE ให้ตั้งค่า MCP_REMOTE_IP_METHOD=X-Forwarded-For และ MCP_XFF_TRUSTED_HOPS เป็นจำนวน proxy ที่คุณดำเนินการ
Headers ที่รองรับ
| Header | คำอธิบาย |
|---|---|
TFE_TOKEN | Token API ของ Terraform |
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ฝั่ง server เท่านั้น (หรือค่าเริ่มต้น) คำขอที่พยายามตั้งค่าTFE_ADDRESSผ่าน HTTP header หรือ query parameter จะถูกปฏิเสธด้วยรหัส 403 ซึ่งป้องกันไม่ให้ไคลเอ็นต์เปลี่ยนเส้นทางคำขอและ tokenAuthorizationไปยัง server ที่เป็นอันตราย - การระบุการปรับใช้แบบโฮสต์: การตั้งค่า
TF_MCP_SHARED_SECRETจะส่งค่านั้นเป็น headerX-Tf-Mcp-Secretในทุกคำขอ HCP Terraform / TFE ทำให้ backend ระบุคำขอจากการปรับใช้แบบโฮสต์ที่รู้จักได้ (เช่น การใช้ IP allowlists) เป็นความลับแบบคงที่ที่ส่งใน header ดังนั้นใช้ผ่าน TLS เท่านั้นและถือว่าค่าเป็นข้อมูลรับรอง - ห้ามส่ง token ใน query parameters - server จะปฏิเสธคำขอดังกล่าวด้วยข้อผิดพลาด 400
- ใช้ TLS เสมอ (
MCP_TLS_CERT_FILE/MCP_TLS_KEY_FILE) เมื่อปรับใช้แบบรวมศูนย์เพื่อปกป้อง token ระหว่างการส่ง - กำหนดค่า
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.3.0
ผู้ใช้เชื่อมต่อด้วย token ส่วนบุคคลที่ส่งผ่าน headers ทำให้สามารถบังคับใช้ RBAC ต่อผู้ใช้ได้
การแก้ไขปัญหา
Corporate Proxy / การตรวจสอบ TLS (Zscaler ฯลฯ)
หากคุณอยู่หลัง corporate proxy ที่ทำการตรวจสอบ 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.3.0
สำหรับการกำหนดค่า MCP client:
{
"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.3.0"
]
}
}
}
ทางเลือก: รันไบนารีโดยตรง
หากไม่ได้รับอนุญาตให้ใช้ Docker ในสภาพแวดล้อมของคุณ คุณสามารถติดตั้งและรันไบนารี server ได้โดยตรง ซึ่งจะใช้ที่เก็บใบรับรองของระบบ:
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 | รันการทดสอบแบบ end-to-end |
make docker-build | สร้าง Docker image |
make run-http | รัน HTTP server ในเครื่อง |
make docker-run-http | รัน HTTP server ใน Docker |
make test-http | ทดสอบ HTTP health endpoint |
make clean | ลบ build artifacts |
make help | แสดงคำสั่งทั้งหมดที่มี |
การมีส่วนร่วม
- Fork repository
- สร้าง feature branch ของคุณ
- ทำการเปลี่ยนแปลงของคุณ
- รันการทดสอบ
- ส่ง pull request
สัญญาอนุญาต
โปรเจกต์นี้อยู่ภายใต้สัญญาอนุญาตโอเพนซอร์ส MPL-2.0 โปรดดูไฟล์ LICENSE สำหรับข้อกำหนดฉบับเต็ม
ความปลอดภัย
สำหรับปัญหาด้านความปลอดภัย โปรดติดต่อ security@hashicorp.com หรือปฏิบัติตาม นโยบายความปลอดภัย ของเรา
การสนับสนุน
สำหรับรายงานข้อบกพร่องและคำขอฟีเจอร์ โปรดเปิด issue บน GitHub
สำหรับคำถามทั่วไปและการสนทนา โปรดเปิด GitHub Discussion