awslabs.terraform-mcp-server 0.0.9__tar.gz → 0.0.11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of awslabs.terraform-mcp-server might be problematic. Click here for more details.
- awslabs_terraform_mcp_server-0.0.11/Dockerfile +75 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/PKG-INFO +24 -1
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/README.md +23 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/impl/resources/terraform_aws_provider_resources_listing.py +1 -1
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/impl/resources/terraform_awscc_provider_resources_listing.py +1 -1
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/scripts/generate_aws_provider_resources.py +2 -1
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/scripts/generate_awscc_provider_resources.py +6 -2
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/static/__init__.py +3 -3
- awslabs_terraform_mcp_server-0.0.11/docker-healthcheck.sh +12 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/pyproject.toml +1 -1
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/uv.lock +1401 -1405
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/.gitignore +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/.pre-commit-config.yaml +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/.python-version +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/CHANGELOG.md +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/__init__.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/__init__.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/impl/resources/__init__.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/impl/tools/__init__.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/impl/tools/execute_terraform_command.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/impl/tools/run_checkov_scan.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/impl/tools/search_aws_provider_docs.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/impl/tools/search_awscc_provider_docs.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/impl/tools/search_specific_aws_ia_modules.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/impl/tools/search_user_provided_module.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/impl/tools/utils.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/models/__init__.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/models/models.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/scripts/scrape_aws_terraform_best_practices.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/server.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/static/AWSCC_PROVIDER_RESOURCES.md +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/static/AWS_PROVIDER_RESOURCES.md +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/static/AWS_TERRAFORM_BEST_PRACTICES.md +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/static/MCP_INSTRUCTIONS.md +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/awslabs/terraform_mcp_server/static/TERRAFORM_WORKFLOW_GUIDE.md +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/run_tests.sh +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/.gitignore +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/README.md +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/__init__.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/conftest.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/test_command_impl.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/test_execute_terraform_command.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/test_models.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/test_parameter_annotations.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/test_resources.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/test_run_checkov_scan.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/test_search_user_provided_module.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/test_server.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/test_tool_implementations.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/test_utils.py +0 -0
- {awslabs_terraform_mcp_server-0.0.9 → awslabs_terraform_mcp_server-0.0.11}/tests/test_utils_additional.py +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
|
|
4
|
+
# with the License. A copy of the License is located at
|
|
5
|
+
#
|
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
#
|
|
8
|
+
# or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
|
|
9
|
+
# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
|
|
10
|
+
# and limitations under the License.
|
|
11
|
+
|
|
12
|
+
#FROM public.ecr.aws/sam/build-python3.10:1.137.1-20250411084548
|
|
13
|
+
FROM public.ecr.aws/sam/build-python3.10@sha256:a40f492a0cd8d76557f8a187fc00e49e8864b3cea683e74718ce317790c1ce61 AS uv
|
|
14
|
+
|
|
15
|
+
# Install the project into `/app`
|
|
16
|
+
WORKDIR /app
|
|
17
|
+
|
|
18
|
+
# Enable bytecode compilation
|
|
19
|
+
ENV UV_COMPILE_BYTECODE=1
|
|
20
|
+
|
|
21
|
+
# Copy from the cache instead of linking since it's a mounted volume
|
|
22
|
+
ENV UV_LINK_MODE=copy
|
|
23
|
+
|
|
24
|
+
# Prefer the system python
|
|
25
|
+
ENV UV_PYTHON_PREFERENCE=only-system
|
|
26
|
+
|
|
27
|
+
# Run without updating the uv.lock file like running with `--frozen`
|
|
28
|
+
ENV UV_FROZEN=true
|
|
29
|
+
|
|
30
|
+
# Copy the required files first
|
|
31
|
+
COPY pyproject.toml uv.lock ./
|
|
32
|
+
|
|
33
|
+
# Install the project's dependencies using the lockfile and settings
|
|
34
|
+
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
35
|
+
pip install uv && \
|
|
36
|
+
uv sync --frozen --no-install-project --no-dev --no-editable
|
|
37
|
+
|
|
38
|
+
# Then, add the rest of the project source code and install it
|
|
39
|
+
# Installing separately from its dependencies allows optimal layer caching
|
|
40
|
+
COPY . /app
|
|
41
|
+
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
42
|
+
uv sync --frozen --no-dev --no-editable
|
|
43
|
+
|
|
44
|
+
# Make the directory just in case it doesn't exist
|
|
45
|
+
RUN mkdir -p /root/.local
|
|
46
|
+
|
|
47
|
+
FROM public.ecr.aws/sam/build-python3.10@sha256:a40f492a0cd8d76557f8a187fc00e49e8864b3cea683e74718ce317790c1ce61
|
|
48
|
+
|
|
49
|
+
# Place executables in the environment at the front of the path and include other binaries
|
|
50
|
+
ENV PATH="/app/.venv/bin:$PATH:/usr/sbin"
|
|
51
|
+
|
|
52
|
+
# Install lsof for the healthcheck
|
|
53
|
+
# Install other tools as needed for the MCP server
|
|
54
|
+
# Add non-root user and ability to change directory into /root
|
|
55
|
+
RUN yum update -y && \
|
|
56
|
+
yum install -y lsof && \
|
|
57
|
+
yum clean all -y && \
|
|
58
|
+
rm -rf /var/cache/yum && \
|
|
59
|
+
groupadd --force --system app && \
|
|
60
|
+
useradd app -g app -d /app && \
|
|
61
|
+
chmod o+x /root
|
|
62
|
+
|
|
63
|
+
# Get the project from the uv layer
|
|
64
|
+
COPY --from=uv --chown=app:app /root/.local /root/.local
|
|
65
|
+
COPY --from=uv --chown=app:app /app/.venv /app/.venv
|
|
66
|
+
|
|
67
|
+
# Get healthcheck script
|
|
68
|
+
COPY ./docker-healthcheck.sh /usr/local/bin/docker-healthcheck.sh
|
|
69
|
+
|
|
70
|
+
# Run as non-root
|
|
71
|
+
USER app
|
|
72
|
+
|
|
73
|
+
# When running the container, add --db-path and a bind mount to the host's db file
|
|
74
|
+
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD [ "docker-healthcheck.sh" ]
|
|
75
|
+
ENTRYPOINT ["awslabs.terraform-mcp-server"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: awslabs.terraform-mcp-server
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.11
|
|
4
4
|
Summary: An AWS Labs Model Context Protocol (MCP) server for terraform
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Requires-Dist: beautifulsoup4>=4.12.0
|
|
@@ -90,6 +90,29 @@ Here are some ways you can work with MCP across AWS, and we'll be adding support
|
|
|
90
90
|
}
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
+
or docker after a succesful `docker build -t awslabs/terraform-mcp-server .`:
|
|
94
|
+
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"mcpServers": {
|
|
98
|
+
"awslabs.terraform-mcp-server": {
|
|
99
|
+
"command": "docker",
|
|
100
|
+
"args": [
|
|
101
|
+
"run",
|
|
102
|
+
"--rm",
|
|
103
|
+
"--interactive",
|
|
104
|
+
"--env",
|
|
105
|
+
"FASTMCP_LOG_LEVEL=ERROR",
|
|
106
|
+
"awslabs/terraform-mcp-server:latest"
|
|
107
|
+
],
|
|
108
|
+
"env": {},
|
|
109
|
+
"disabled": false,
|
|
110
|
+
"autoApprove": []
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
93
116
|
## Security Considerations
|
|
94
117
|
|
|
95
118
|
When using this MCP server, you should consider:
|
|
@@ -75,6 +75,29 @@ Here are some ways you can work with MCP across AWS, and we'll be adding support
|
|
|
75
75
|
}
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
+
or docker after a succesful `docker build -t awslabs/terraform-mcp-server .`:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"mcpServers": {
|
|
83
|
+
"awslabs.terraform-mcp-server": {
|
|
84
|
+
"command": "docker",
|
|
85
|
+
"args": [
|
|
86
|
+
"run",
|
|
87
|
+
"--rm",
|
|
88
|
+
"--interactive",
|
|
89
|
+
"--env",
|
|
90
|
+
"FASTMCP_LOG_LEVEL=ERROR",
|
|
91
|
+
"awslabs/terraform-mcp-server:latest"
|
|
92
|
+
],
|
|
93
|
+
"env": {},
|
|
94
|
+
"disabled": false,
|
|
95
|
+
"autoApprove": []
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
78
101
|
## Security Considerations
|
|
79
102
|
|
|
80
103
|
When using this MCP server, you should consider:
|
|
@@ -39,7 +39,7 @@ async def terraform_aws_provider_assets_listing_impl() -> str:
|
|
|
39
39
|
# Check if the static file exists
|
|
40
40
|
if STATIC_RESOURCES_PATH.exists():
|
|
41
41
|
# Read the static file content
|
|
42
|
-
with open(STATIC_RESOURCES_PATH, 'r') as f:
|
|
42
|
+
with open(STATIC_RESOURCES_PATH, 'r', encoding='utf-8') as f:
|
|
43
43
|
content = f.read()
|
|
44
44
|
logger.info('Successfully loaded AWS Provider asset list')
|
|
45
45
|
return content
|
|
@@ -39,7 +39,7 @@ async def terraform_awscc_provider_resources_listing_impl() -> str:
|
|
|
39
39
|
# Check if the static file exists
|
|
40
40
|
if STATIC_RESOURCES_PATH.exists():
|
|
41
41
|
# Read the static file content
|
|
42
|
-
with open(STATIC_RESOURCES_PATH, 'r') as f:
|
|
42
|
+
with open(STATIC_RESOURCES_PATH, 'r', encoding='utf-8') as f:
|
|
43
43
|
content = f.read()
|
|
44
44
|
|
|
45
45
|
logger.info(
|
|
@@ -372,6 +372,7 @@ async def fetch_aws_provider_page() -> ProviderResult:
|
|
|
372
372
|
prefix='terraform_aws_debug_playwright_',
|
|
373
373
|
suffix='.html',
|
|
374
374
|
mode='w',
|
|
375
|
+
encoding='utf-8',
|
|
375
376
|
delete=False,
|
|
376
377
|
) as temp_file:
|
|
377
378
|
temp_file.write(content)
|
|
@@ -1208,7 +1209,7 @@ async def main():
|
|
|
1208
1209
|
args.output.parent.mkdir(parents=True, exist_ok=True)
|
|
1209
1210
|
|
|
1210
1211
|
# Write markdown to output file
|
|
1211
|
-
with open(args.output, 'w') as f:
|
|
1212
|
+
with open(args.output, 'w', encoding='utf-8') as f:
|
|
1212
1213
|
f.write('\n'.join(markdown))
|
|
1213
1214
|
|
|
1214
1215
|
print(f'Successfully generated markdown file at: {args.output}')
|
|
@@ -317,7 +317,11 @@ async def fetch_awscc_provider_page():
|
|
|
317
317
|
|
|
318
318
|
# Save HTML for debugging using tempfile for security
|
|
319
319
|
with tempfile.NamedTemporaryFile(
|
|
320
|
-
prefix='terraform_awscc_debug_playwright_',
|
|
320
|
+
prefix='terraform_awscc_debug_playwright_',
|
|
321
|
+
suffix='.html',
|
|
322
|
+
mode='w',
|
|
323
|
+
encoding='utf-8',
|
|
324
|
+
delete=False,
|
|
321
325
|
) as temp_file:
|
|
322
326
|
temp_file.write(content)
|
|
323
327
|
debug_file_path = temp_file.name
|
|
@@ -1004,7 +1008,7 @@ async def main():
|
|
|
1004
1008
|
args.output.parent.mkdir(parents=True, exist_ok=True)
|
|
1005
1009
|
|
|
1006
1010
|
# Write markdown to output file
|
|
1007
|
-
with open(args.output, 'w') as f:
|
|
1011
|
+
with open(args.output, 'w', encoding='utf-8') as f:
|
|
1008
1012
|
f.write('\n'.join(markdown))
|
|
1009
1013
|
|
|
1010
1014
|
print(f'Successfully generated markdown file at: {args.output}')
|
|
@@ -3,20 +3,20 @@ from importlib import resources
|
|
|
3
3
|
with (
|
|
4
4
|
resources.files('awslabs.terraform_mcp_server.static')
|
|
5
5
|
.joinpath('MCP_INSTRUCTIONS.md')
|
|
6
|
-
.open('r') as f
|
|
6
|
+
.open('r', encoding='utf-8') as f
|
|
7
7
|
):
|
|
8
8
|
MCP_INSTRUCTIONS = f.read()
|
|
9
9
|
|
|
10
10
|
with (
|
|
11
11
|
resources.files('awslabs.terraform_mcp_server.static')
|
|
12
12
|
.joinpath('TERRAFORM_WORKFLOW_GUIDE.md')
|
|
13
|
-
.open('r') as f
|
|
13
|
+
.open('r', encoding='utf-8') as f
|
|
14
14
|
):
|
|
15
15
|
TERRAFORM_WORKFLOW_GUIDE = f.read()
|
|
16
16
|
|
|
17
17
|
with (
|
|
18
18
|
resources.files('awslabs.terraform_mcp_server.static')
|
|
19
19
|
.joinpath('AWS_TERRAFORM_BEST_PRACTICES.md')
|
|
20
|
-
.open('r') as f
|
|
20
|
+
.open('r', encoding='utf-8') as f
|
|
21
21
|
):
|
|
22
22
|
AWS_TERRAFORM_BEST_PRACTICES = f.read()
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
|
|
3
|
+
if [ "$(lsof +c 0 -p 1 | grep -e "^awslabs\..*\s1\s.*\sunix\s.*socket$" | wc -l)" -ne "0" ]; then
|
|
4
|
+
echo -n "$(lsof +c 0 -p 1 | grep -e "^awslabs\..*\s1\s.*\sunix\s.*socket$" | wc -l) awslabs.* streams found";
|
|
5
|
+
exit 0;
|
|
6
|
+
else
|
|
7
|
+
echo -n "Zero awslabs.* streams found";
|
|
8
|
+
exit 1;
|
|
9
|
+
fi;
|
|
10
|
+
|
|
11
|
+
echo -n "Never should reach here";
|
|
12
|
+
exit 99;
|