Terry Form MCP
通过模型上下文协议实现人工智能驱动的地形执行。
  ](https://github.com/aj-geddes/terry-form-mcp/blob/main/Dockerfile) 
Terry Form MCP是一个集装箱 模型上下文协议 服务器,为克劳德等人工智能助手提供对Terraform的安全、结构化访问。它公开了25个MCP工具,涵盖了Terraform执行、LSP智能、GitHub集成和Terraform Cloud连接——所有这些工具都在Docker中运行,设计阻止了破坏性操作。
______________________________________________________________________
仪表盘
内置的web仪表板提供实时服务器运行状况监控、工具类别概述和集成状态一目了然。实时状态每5秒自动刷新一次。
配置UI
选项卡式配置界面允许您管理服务器设置、集成、云提供商凭据和速率限制,所有这些都不需要接触配置文件。使用HAT堆栈(HTMX+Alpine.js+Tailwind CSS)构建。
| GitHub集成 | 云提供商 | 费率限制 |
|---|---|---|
| Cloud Providers | Rate Limits |
工具目录
交互式工具目录位于 /tools 列出了所有25个MCP工具,包括搜索、类别过滤和可扩展参数详细信息。也可作为原始JSON端点在 /api/tools 作为一种静态 tools.json 文件。
______________________________________________________________________
快速开始
先决条件
- Docker已安装并正在运行
- Python>=3.10(用于本地开发)
1.建造
scripts/build.sh # Linux/macOS
scripts\build.bat # Windows
# or directly:
docker build -t terry-form-mcp .2.作为MCP服务器运行
docker run -it --rm \
-v "$(pwd)":/mnt/workspace \
terry-form-mcp3.验证图像
scripts/verify.sh # Runs 8 checks: Docker, image size, Terraform, terraform-ls, Python, files, tools, startup______________________________________________________________________
环境变量
所有配置都是通过环境变量进行的。基本使用不需要配置文件。
服务器配置
| 变量 | 描述 | 默认值 | 必填 |
|---|---|---|---|
MCP_TRANSPORT | 传输协议: stdio, sse,或 streamable-http | stdio | 没有 |
TERRY_HOST | 服务器绑定地址(回退: HOST) | 0.0.0.0 | 没有 |
TERRY_PORT | 服务器端口(回退: PORT) | 8000 | 没有 |
TERRY_FORM_API_KEY | 用于前端身份验证的API密钥;如果未设置,则禁用身份验证 | 无 | 否 |
TERRY_CSRF_SECRET | CSRF令牌秘密;如果未设置,则在重新启动时重新生成 | 随机 | 推荐 |
TERRY_WORKSPACE_ROOT | Terraform工作区根目录 | /mnt/workspace | 没有 |
TERRY_CONFIG_PATH | 配置文件路径 | /app/config/terry-config.json | 没有 |
地形
| 变量 | 描述 | 默认值 | 必填 |
|---|---|---|---|
MAX_OPERATION_TIMEOUT | 地形命令超时(秒)(10–3600) | 300 | 没有 |
语言服务器协议
| 变量 | 描述 | 默认值 | 必填 |
|---|---|---|---|
TERRY_TERRAFORM_LS_PATH | 通往 terraform-ls 二进制 | terraform-ls | 没有 |
TERRY_LSP_TIMEOUT | LSP请求超时(秒) | 30 | 没有 |
TERRY_LSP_MAX_RESPONSE_BYTES | 最大LSP响应大小(字节) | 10485760 | 没有 |
GitHub集成
| 变量 | 描述 | 默认值 | 必填 |
|---|---|---|---|
GITHUB_APP_ID | GitHub应用程序ID | 无 | 适用于GitHub功能 |
GITHUB_APP_PRIVATE_KEY_PATH | GitHub应用程序私钥文件的路径 | 无 | GitHub功能 |
GITHUB_APP_PRIVATE_KEY | GitHub应用程序私钥(内联PEM) | 无 | Alt到路径 |
GITHUB_APP_INSTALLATION_ID | GitHub应用程序安装ID | 无 | 否 |
GITHUB_APP_WEBHOOK_SECRET | Webhook签名验证密钥 | 无 | 否 |
地形云
| 变量 | 描述 | 默认值 | 必填 |
|---|---|---|---|
TF_API_TOKEN | Terraform Cloud API令牌 | 无 | 用于TF Cloud功能 |
速率限制
| 变量 | 描述 | 默认值 | 必填 |
|---|---|---|---|
TERRY_RATE_LIMIT_TERRAFORM | 每分钟地形操作数 | 20 | 没有 |
TERRY_RATE_LIMIT_GITHUB | GitHub每分钟操作数 | 30 | 没有 |
TERRY_RATE_LIMIT_TF_CLOUD | 地形云每分钟运行次数 | 30 | 没有 |
TERRY_RATE_LIMIT_DEFAULT | 默认每分钟速率限制 | 100 | 没有 |
云提供商通道
这些变量直接转发到Terraform子流程。将它们设置为与您的云提供商进行身份验证。
AWS: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN, AWS_DEFAULT_REGION, AWS_REGION, AWS_PROFILE
GCP: GOOGLE_CREDENTIALS, GOOGLE_APPLICATION_CREDENTIALS, GOOGLE_PROJECT, GOOGLE_REGION, GOOGLE_ZONE
Azure: ARM_CLIENT_ID, ARM_CLIENT_SECRET, ARM_SUBSCRIPTION_ID, ARM_TENANT_ID
______________________________________________________________________
MCP客户端配置
将Terry Form添加到任何兼容MCP的客户端:
{
"mcpServers": {
"terry": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/path/to/your/workspace:/mnt/workspace",
"terry-form-mcp"
]
}
}
}Platform-specific examples
克劳德桌面(Windows)
{
"mcpServers": {
"terry": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "C:\\Users\\YourUsername\\terraform-projects:/mnt/workspace",
"terry-form-mcp"
]
}
}
}克劳德桌面(macOS)
{
"mcpServers": {
"terry": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/Users/YourUsername/terraform-projects:/mnt/workspace",
"terry-form-mcp"
]
}
}
}VSCode(使用工作空间变量)
{
"mcp.servers": {
"terry": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "${workspaceFolder}:/mnt/workspace",
"terry-form-mcp"
]
}
}
}______________________________________________________________________
工具(25)
| 类别 | 工具 | 计数 |
|---|---|---|
| 核心地形 | terry, terry_version, terry_environment_check, terry_workspace_list | 4 |
| LSP情报 | terraform_validate_lsp, terraform_hover, terraform_complete, terraform_format_lsp, terraform_lsp_status | 5 |
| 诊断 | terry_lsp_debug, terry_workspace_info, terry_lsp_init, terry_file_check, terry_workspace_setup, terry_analyze | 6 |
| 安全 | terry_security_scan, terry_recommendations | 2 |
| GitHub | github_clone_repo, github_list_terraform_files, github_get_terraform_config, github_prepare_workspace | 4 |
| 地形云 | tf_cloud_list_workspaces, tf_cloud_get_workspace, tf_cloud_list_runs, tf_cloud_get_state_outputs | 4 |
核心地形
# Initialize and validate a project
terry(path="infrastructure/aws", actions=["init", "validate"])
# Plan with variables
terry(path="environments/prod", actions=["plan"], vars={"instance_count": "3", "region": "us-east-1"})仅 init, validate, fmt,以及 plan 是允许的。 apply 和 destroy 被封锁。
LSP情报
# Code completions
terraform_complete(file_path="main.tf", line=10, character=0)
# Hover documentation
terraform_hover(file_path="main.tf", line=15, character=12)
# Detailed validation with error locations
terraform_validate_lsp(file_path="main.tf")
# Format a file
terraform_format_lsp(file_path="main.tf")由...驱动 terraform-ls v0.38.5--提供上下文感知的补全、内联文档和具有精确源位置的诊断。
GitHub集成
# Clone a repo and prepare it for Terraform operations
github_clone_repo(owner="myorg", repo="infrastructure")
github_prepare_workspace(owner="myorg", repo="infrastructure", config_path="environments/prod")安全扫描
# Scan for hardcoded credentials, missing encryption, overly permissive policies
terry_security_scan(path="my-project")
# Get actionable improvement recommendations
terry_recommendations(path="my-project")______________________________________________________________________
建筑
┌─────────────┐ MCP Protocol ┌──────────────────────────────────────┐
│ AI Assistant │ ◄──────────────────► │ Terry-Form MCP Server │
│ (Claude) │ │ │
└─────────────┘ │ ┌─────────────┐ ┌──────────────┐ │
│ │ Terraform │ │ terraform-ls │ │
│ │ CLI 1.12 │ │ LSP 0.38.5 │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────────────────────┐ │
│ │ /mnt/workspace (isolated) │ │
│ └──────────────────────────────┘ │
└──────────────────────────────────────┘
Docker Container关键组件
| 文件 | 目的 |
|---|---|
src/server_enhanced_with_lsp.py | 主FastMCP服务器——注册所有25个工具 |
src/terry-form-mcp.py | 核心Terraform子流程执行 |
src/terraform_lsp_client.py | 异步LSP客户端包装 terraform-ls |
src/mcp_request_validator.py | 输入净化、路径遍历预防、速率限制 |
src/github_repo_handler.py | 克隆存储库并提取Terraform文件 |
src/github_app_auth.py | GitHub应用程序JWT/OAuth身份验证 |
src/frontend/ | HAT堆栈web UI(仪表板+配置) |
前端堆栈
内置的web UI使用 HAT堆栈:
- HTMX 2.0——不完全重新加载的部分页面更新
- A.lpine.js 3.14——标签和吐司的轻量级客户端反应
- Tailwind CSS——暗模式优先实用样式
与一起运行时,可在服务器根目录访问 streamable-http 或 sse 运输。
______________________________________________________________________
安全模型
Terry Form采用四层深度防御:
| 层 | 保护 |
|---|---|
| 集装箱隔离 | 所有执行都在临时Docker容器中。没有主机访问权限。 |
| 操作许可清单 | 只有 init, validate, fmt, plan不 apply/destroy. |
| 工作区隔离 | 所有文件操作仅限于 /mnt/workspace。路径遍历被阻止。 |
| 输入验证 | JSON模式强制、变量净化、每个类别的速率限制。 |
强制环境变量: TF_IN_AUTOMATION=true, TF_INPUT=false, CHECKPOINT_DISABLE=true.
______________________________________________________________________
使用Web UI运行
要使用仪表板和配置UI,请使用HTTP传输运行:
# Local
MCP_TRANSPORT=streamable-http HOST=0.0.0.0 PORT=8000 python3 src/server_enhanced_with_lsp.py
# Docker
docker run -it --rm \
-p 8000:8000 \
-v "$(pwd)":/mnt/workspace \
-e MCP_TRANSPORT=streamable-http \
terry-form-mcp然后打开 http://localhost:8000 在您的浏览器中。
配置选项卡
| 选项卡 | 它配置了什么 |
|---|---|
| 服务器 | 传输模式、主机、端口、API密钥 |
| GitHub | 应用ID、安装ID、私钥路径、webhook密钥 |
| 地形云 | API令牌 |
| 云提供商 | AWS、GCP和Azure凭据 |
| 速率限制 | 每类请求限制(立即适用) |
| 地形选项 | 日志级别,操作超时 |
______________________________________________________________________
集装箱详情
建立在 hashicorp/terraform:1.12 (基于阿尔卑斯山,~150MB)。包括:
- Terraform CLI 1.12
terraform-lsv0.38.5用于LSP支持- Python 3.12与FastMCP 3.0+
- 以非root用户身份运行
terraform(UID 1001)
______________________________________________________________________
发展
# Install dependencies
pip install -r requirements.txt
# Run locally
python3 src/server_enhanced_with_lsp.py
# Code quality
black . # Format (88-char line limit)
flake8 . # Lint
mypy src/*.py # Type check______________________________________________________________________
局限性
- 无状态修改 —
apply和destroy被故意封锁 - 仅字符串变量 --CLI直通不支持复杂变量类型
- LSP冷启动 --第一次LSP操作需要1-2秒进行初始化
- 本地执行 --专为开发工作流程而非生产CI/CD而设计
______________________________________________________________________
