Terraform MCP Server
ทางการเซิร์ฟเวอร์ HashiCorp Terraform MCP สำหรับเวิร์กโฟลว์ Infrastructure as Code รวมถึงการค้นหาผู้ให้บริการและโมดูลผ่าน Terraform Registry
คุณทำอะไรได้บ้างด้วย Terraform MCP?
- Registry และการค้นพบ workspace — ให้ผู้ช่วยของคุณค้นหา Terraform Registry providers, modules และ policies หรือแสดงรายการ HCP Terraform workspaces และ organizations
- การจัดการ workspace — สร้าง อัปเดต หรือลบ workspaces รวมถึงการจัดการ variables, tags และการเรียกใช้งาน runs ผ่านภาษาธรรมชาติทั้งหมด
- การปรับใช้แบบ multi-user แบบรวมศูนย์ — กำหนดค่าเซิร์ฟเวอร์ในโหมด
streamable-httpพร้อมการส่งผ่าน token ต่อผู้ใช้ผ่านAuthorization: Bearerheaders เพื่อบังคับใช้ RBAC - การควบคุมการปฏิบัติงาน — เปิดหรือปิดใช้งานกลุ่มเครื่องมือเฉพาะ (เช่น
registry,terraform) หรือเครื่องมือแต่ละรายการโดยใช้แฟล็ก--toolsetsหรือ--tools - การเสริมความปลอดภัย — จำกัดการเข้าถึงผ่าน
MCP_ORGANIZATION_ALLOWLIST, บังคับใช้ TLS ด้วยMCP_TLS_CERT_FILE/MCP_TLS_KEY_FILEและควบคุม CORS ด้วยMCP_ALLOWED_ORIGINS
เอกสาร
Terraform MCP Server
Terraform MCP Server คือเซิร์ฟเวอร์ Model Context Protocol (MCP) ที่ผสานรวมเข้ากับ Terraform Registry และ HCP Terraform APIs ได้อย่างราบรื่น ช่วยให้มีความสามารถด้านการทำงานอัตโนมัติและการโต้ตอบขั้นสูงสำหรับการพัฒนา Infrastructure as Code (IaC)
สารบัญ
| ความสามารถของเซิร์ฟเวอร์ | การปรับใช้และความปลอดภัย | ความช่วยเหลือและการมีส่วนร่วม |
|---|---|---|
|
เครื่องมือที่มี ทรัพยากรที่มี เมตริกที่มี การกรองเครื่องมือ |
โหมดเซสชัน Token Passthrough สำหรับการปรับใช้แบบรวมศูนย์ การส่งต่อ IP ของไคลเอนต์ โมเดลความน่าเชื่อถือ hops ที่น่าเชื่อถือ ข้อจำกัด การย้ายจากเวอร์ชันก่อนหน้า ส่วนหัวที่รองรับ ข้อควรพิจารณาด้านความปลอดภัย ตัวอย่างการปรับใช้แบบรวมศูนย์ |
การแก้ไขปัญหา Corporate Proxy และ TLS Inspection การพัฒนา การมีส่วนร่วม ใบอนุญาต ความปลอดภัย การสนับสนุน |
คุณสมบัติ
- รองรับ Transport แบบคู่: รองรับทั้ง Stdio และ StreamableHTTP transports พร้อม endpoint ที่กำหนดค่าได้
- การผสานรวม Terraform Registry: การผสานรวมโดยตรงกับ Terraform Registry APIs สาธารณะสำหรับ providers, modules และ policies
- รองรับ HCP Terraform และ Terraform Enterprise: การจัดการ workspace อย่างครบถ้วน การแสดงรายการ organization/project และการเข้าถึง private 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 server | 127.0.0.1 |
TRANSPORT_PORT | พอร์ตของ HTTP server | 8080 |
MCP_ENDPOINT | เส้นทาง endpoint ของ HTTP server | /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 | รายการ CSV ของชื่อองค์กร HCP Terraform ที่อนุญาตให้เข้าถึง HTTP server | "" (ว่างเปล่า) |
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 | จำนวน hops ของพร็อกซีที่น่าเชื่อถือที่นับจากด้านขวาของ 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 (เมตริกและการติดตามคำขอ HTTP) สำหรับ streamable-http server ต้องมี Instana agent ที่เซิร์ฟเวอร์สามารถเข้าถึงได้ | false |
INSTANA_SERVICE_NAME | หากเปิดใช้งานการตรวจวัด Instana ชื่อบริการที่จะใช้สำหรับ 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 หรือต่ำกว่า |
|---|---|
|
|
Kubernetes (Helm)
มี Helm chart สำหรับปรับใช้เซิร์ฟเวอร์บน Kubernetes ภายใต้ helm/terraform-mcp-server
ติดตั้งจากซอร์สโค้ด
ใช้เวอร์ชันรีลีสล่าสุด:
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 ในเครื่อง
ก่อนใช้เซิร์ฟเวอร์ คุณต้องสร้าง 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_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"
]
}
}
}
เครื่องมือที่มีให้ใช้งาน
ดูเครื่องมือที่มีให้ใช้งานที่นี่ :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_provider_docs,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 ซึ่งช่วยให้อินสแตนซ์เซิร์ฟเวอร์เดียวสามารถให้บริการผู้ใช้หลายคนที่มีสิทธิ์ต่างกันได้
เมื่อกำหนดค่า MCP_ORGANIZATION_ALLOWLIST หรือ --organization-allowlist รายการอนุญาตต้องเป็นรายการ CSV ของชื่อองค์กร HCP Terraform เซิร์ฟเวอร์ต้องการ Authorization: Bearer <token> และปฏิเสธคำขอเว้นแต่ token นั้นจะสามารถเข้าถึงอย่างน้อยหนึ่งองค์กรในรายการอนุญาต CSV bearer token จะมีความสำคัญก่อนหากคำขอยังรวม TFE_TOKEN header ด้วย เพื่อให้แน่ใจว่า token ที่ตรวจสอบโดยรายการอนุญาตคือ token ที่ใช้สำหรับคำขอ Terraform API การจับคู่ชื่อองค์กรไม่คำนึงถึงตัวพิมพ์เล็กใหญ่ หากค่าที่กำหนดค่า CSV แยกวิเคราะห์เป็นชื่อองค์กรศูนย์ชื่อ เซิร์ฟเวอร์จะออกพร้อมกับข้อผิดพลาดรายการอนุญาตองค์กรที่ผิดรูปแบบ
การส่งต่อ IP ของไคลเอ็นต์
เมื่อรัน MCP server แบบรวมศูนย์ด้านหลัง proxy หรือ load balancer คุณสามารถส่งต่อ IP ของไคลเอ็นต์ต้นทางไปยัง HCP Terraform / TFE ผ่าน X-Forwarded-For header ซึ่งปิดโดยค่าเริ่มต้นและต้องเปิดใช้งานด้วย MCP_FORWARD_CLIENT_IP=true
เมื่อเปิดใช้งาน เซิร์ฟเวอร์จะใช้แหล่งที่มาของ IP ไคลเอ็นต์ตาม MCP_REMOTE_IP_METHOD:
| วิธีการ | พฤติกรรม |
|---|---|
RemoteAddr (ค่าเริ่มต้น) | ใช้เฉพาะที่อยู่ของการเชื่อมต่อ TCP โดยตรง ไม่สนใจ X-Forwarded-For และ X-Real-IP |
X-Real-IP | ใช้ X-Real-IP header หากเป็น IP ที่ถูกต้อง มิฉะนั้นจะถอยกลับไปใช้ RemoteAddr |
X-Forwarded-For | ใช้ X-Forwarded-For chain โดยเลือก MCP_XFF_TRUSTED_HOPS ตำแหน่งจากด้านขวา ถอยกลับไปใช้ RemoteAddr หากค่าไม่พร้อมใช้งานหรือไม่ถูกต้อง |
โมเดลความน่าเชื่อถือ
X-Forwarded-For และ X-Real-IP ถูกตั้งค่าโดยไคลเอ็นต์และ proxy ตัวกลาง ดังนั้นจึงสามารถปลอมแปลงได้เว้นแต่ proxy ที่เชื่อถือได้ด้านหน้าเซิร์ฟเวอร์จะเขียนทับค่าเหล่านั้น ด้วยเหตุนี้ค่าเริ่มต้นคือ RemoteAddr ซึ่งเชื่อถือเฉพาะ peer ที่เซิร์ฟเวอร์เชื่อมต่อโดยตรงเท่านั้น เปิดใช้งาน X-Real-IP หรือ X-Forwarded-For เฉพาะเมื่อเซิร์ฟเวอร์อยู่ด้านหลัง proxy ที่คุณควบคุมซึ่งตั้งค่า headers เหล่านี้
จำนวน hop ที่เชื่อถือได้
เมื่อใช้ X-Forwarded-For MCP_XFF_TRUSTED_HOPS คือจำนวน proxies ที่คุณดำเนินการระหว่างเซิร์ฟเวอร์และอินเทอร์เน็ต นับ hop จากด้านขวาของ chain เนื่องจากแต่ละ proxy จะเพิ่มที่อยู่ที่ได้รับคำขอ และรายการขวาสุดถูกตั้งค่าโดย proxy ที่ใกล้กับเซิร์ฟเวอร์ที่สุด เซิร์ฟเวอร์จะข้ามรายการที่เชื่อถือได้จำนวนนั้นและใช้รายการถัดไปทางซ้าย
ตัวอย่างเช่น ด้วย 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 มากกว่าจำนวนรายการ หรือรายการที่เลือกไม่ใช่ IP ที่ถูกต้อง เซิร์ฟเวอร์จะถอยกลับไปใช้ RemoteAddr
การตั้งค่าจำนวน hop ต่ำเกินไปจะเชื่อถือค่าที่ไคลเอ็นต์ระบุ การตั้งค่าสูงเกินไปจะเชื่อถือที่อยู่ที่ลึกเข้าไปในโครงสร้างพื้นฐานของคุณเอง ตั้งค่าเป็นจำนวน proxies ที่คุณรันอย่างแน่นอน
ข้อจำกัด
- เซิร์ฟเวอร์อ่านเฉพาะ
X-Forwarded-Forheader แรกบนคำขอ เป็นการถูกต้องที่คำขอจะพกX-Forwarded-Forheaders หลายรายการ แต่ไลบรารีมาตรฐานของ Go จะส่งคืนเฉพาะรายการแรก และเซิร์ฟเวอร์ไม่ได้รวมเข้าด้วยกัน หาก proxy chain ของคุณส่งออกหลาย headers ให้กำหนดค่าให้ส่งออกX-Forwarded-Forheader เดียวที่รวมกัน - รองรับทั้งที่อยู่ IPv4 และ IPv6 ค่าที่ไม่ใช่ IP ที่ถูกต้องจะถูกปฏิเสธและเซิร์ฟเวอร์จะถอยกลับไปใช้
RemoteAddr
การย้ายจากเวอร์ชันก่อนหน้า
เวอร์ชันก่อนหน้าใช้ X-Forwarded-For ค่าซ้ายสุดเมื่อมี header โดยไม่มีการกำหนดค่า ซึ่งไม่ปลอดภัย เนื่องจากค่าซ้ายสุดถูกปลอมแปลงได้ง่ายที่สุด ค่าเริ่มต้นตอนนี้คือ RemoteAddr หากคุณรันเซิร์ฟเวอร์ด้านหลัง proxy และพึ่งพา X-Forwarded-For ที่ถูกส่งต่อไปยัง HCP Terraform / TFE ให้ตั้งค่า MCP_REMOTE_IP_METHOD=X-Forwarded-For และ MCP_XFF_TRUSTED_HOPS เป็นจำนวน proxies ที่คุณดำเนินการ
Headers ที่รองรับ
| Header | คำอธิบาย |
|---|---|
TFE_TOKEN | Terraform API token |
Authorization: Bearer <token> | วิธีการทางเลือกโดยใช้มาตรฐาน Bearer auth |
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ตัวแปรสภาพแวดล้อมฝั่งเซิร์ฟเวอร์เท่านั้น (หรือค่าเริ่มต้น) คำขอที่พยายามตั้งค่าTFE_ADDRESSผ่าน HTTP header หรือ query parameter จะถูกปฏิเสธด้วย 403 ซึ่งป้องกันไม่ให้ไคลเอ็นต์เปลี่ยนเส้นทางคำขอและAuthorizationtoken ไปยังเซิร์ฟเวอร์ที่เป็นอันตราย - การระบุการปรับใช้แบบโฮสต์: การตั้งค่า
TF_MCP_SHARED_SECRETจะส่งค่านั้นเป็นX-Tf-Mcp-Secretheader ในทุกคำขอ HCP Terraform / TFE ทำให้แบ็กเอนด์สามารถระบุคำขอจากการปรับใช้แบบโฮสต์ที่รู้จัก (เช่น เพื่อใช้ IP allowlists) เป็นความลับแบบคงที่ที่ส่งใน header ดังนั้นใช้ผ่าน TLS เท่านั้นและถือว่าค่าเป็นข้อมูลประจำตัว - ห้ามส่ง tokens ใน query parameters - เซิร์ฟเวอร์จะปฏิเสธคำขอดังกล่าวด้วยข้อผิดพลาด 400
- ใช้ TLS เสมอ (
MCP_TLS_CERT_FILE/MCP_TLS_KEY_FILE) เมื่อปรับใช้แบบรวมศูนย์เพื่อปกป้อง tokens ระหว่างการส่ง - กำหนดค่า
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 Inspection (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 ในสภาพแวดล้อมของคุณ คุณสามารถติดตั้งและรันไบนารีเซิร์ฟเวอร์โดยตรง ซึ่งจะใช้ที่เก็บใบรับรองของระบบของคุณ:
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