awslabs.cfn-mcp-server 0.0.1__py3-none-any.whl → 1.0.1__py3-none-any.whl
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.
- awslabs/cfn_mcp_server/aws_client.py +5 -1
- awslabs/cfn_mcp_server/errors.py +1 -1
- awslabs/cfn_mcp_server/server.py +2 -14
- {awslabs_cfn_mcp_server-0.0.1.dist-info → awslabs_cfn_mcp_server-1.0.1.dist-info}/METADATA +27 -6
- awslabs_cfn_mcp_server-1.0.1.dist-info/RECORD +14 -0
- awslabs_cfn_mcp_server-0.0.1.dist-info/RECORD +0 -14
- {awslabs_cfn_mcp_server-0.0.1.dist-info → awslabs_cfn_mcp_server-1.0.1.dist-info}/WHEEL +0 -0
- {awslabs_cfn_mcp_server-0.0.1.dist-info → awslabs_cfn_mcp_server-1.0.1.dist-info}/entry_points.txt +0 -0
- {awslabs_cfn_mcp_server-0.0.1.dist-info → awslabs_cfn_mcp_server-1.0.1.dist-info}/licenses/LICENSE +0 -0
- {awslabs_cfn_mcp_server-0.0.1.dist-info → awslabs_cfn_mcp_server-1.0.1.dist-info}/licenses/NOTICE +0 -0
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
|
|
10
10
|
# and limitations under the License.
|
|
11
11
|
|
|
12
|
+
import botocore.config
|
|
12
13
|
import sys
|
|
13
14
|
from awslabs.cfn_mcp_server.errors import ClientError
|
|
14
15
|
from boto3 import Session
|
|
@@ -16,6 +17,9 @@ from os import environ
|
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
session = Session(profile_name=environ.get('AWS_PROFILE'))
|
|
20
|
+
session_config = botocore.config.Config(
|
|
21
|
+
user_agent_extra='cfn-mcp-server/1.0.0',
|
|
22
|
+
)
|
|
19
23
|
|
|
20
24
|
|
|
21
25
|
def get_aws_client(service_name, region_name=None):
|
|
@@ -47,7 +51,7 @@ def get_aws_client(service_name, region_name=None):
|
|
|
47
51
|
print(
|
|
48
52
|
f'Creating new {service_name} client for region {region_name} with auto-detected credentials'
|
|
49
53
|
)
|
|
50
|
-
client = session.client(service_name, region_name=region_name)
|
|
54
|
+
client = session.client(service_name, region_name=region_name, config=session_config)
|
|
51
55
|
|
|
52
56
|
print('Created client for service with credentials')
|
|
53
57
|
return client
|
awslabs/cfn_mcp_server/errors.py
CHANGED
|
@@ -86,6 +86,6 @@ class ServerError(Exception):
|
|
|
86
86
|
def __init__(self, log):
|
|
87
87
|
"""Call super."""
|
|
88
88
|
# Call the base class constructor with the parameters it needs
|
|
89
|
-
super().__init__('An internal error
|
|
89
|
+
super().__init__('An internal error occurred while processing your request')
|
|
90
90
|
print(log)
|
|
91
91
|
self.type = 'server'
|
awslabs/cfn_mcp_server/server.py
CHANGED
|
@@ -31,11 +31,7 @@ mcp = FastMCP(
|
|
|
31
31
|
1. Read and List all of your AWS resources by the CloudFormation type name (e.g. AWS::S3::Bucket)
|
|
32
32
|
2. Create/Update/Delete your AWS resources
|
|
33
33
|
""",
|
|
34
|
-
dependencies=[
|
|
35
|
-
'pydantic',
|
|
36
|
-
'loguru',
|
|
37
|
-
'boto3',
|
|
38
|
-
],
|
|
34
|
+
dependencies=['pydantic', 'loguru', 'boto3', 'botocore'],
|
|
39
35
|
)
|
|
40
36
|
|
|
41
37
|
|
|
@@ -358,8 +354,6 @@ def main():
|
|
|
358
354
|
parser = argparse.ArgumentParser(
|
|
359
355
|
description='An AWS Labs Model Context Protocol (MCP) server for doing common cloudformation tasks and for managing your resources in your AWS account'
|
|
360
356
|
)
|
|
361
|
-
parser.add_argument('--sse', action='store_true', help='Use SSE transport')
|
|
362
|
-
parser.add_argument('--port', type=int, default=8888, help='Port to run the server on')
|
|
363
357
|
parser.add_argument(
|
|
364
358
|
'--readonly',
|
|
365
359
|
action=argparse.BooleanOptionalAction,
|
|
@@ -368,13 +362,7 @@ def main():
|
|
|
368
362
|
|
|
369
363
|
args = parser.parse_args()
|
|
370
364
|
Context.initialize(args.readonly)
|
|
371
|
-
|
|
372
|
-
# Run server with appropriate transport
|
|
373
|
-
if args.sse:
|
|
374
|
-
mcp.settings.port = args.port
|
|
375
|
-
mcp.run(transport='sse')
|
|
376
|
-
else:
|
|
377
|
-
mcp.run()
|
|
365
|
+
mcp.run()
|
|
378
366
|
|
|
379
367
|
|
|
380
368
|
if __name__ == '__main__':
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: awslabs.cfn-mcp-server
|
|
3
|
-
Version:
|
|
3
|
+
Version: 1.0.1
|
|
4
4
|
Summary: An AWS Labs Model Context Protocol (MCP) server for doing common cloudformation tasks and for managing your resources in your AWS account
|
|
5
5
|
Project-URL: homepage, https://awslabs.github.io/mcp/
|
|
6
6
|
Project-URL: docs, https://awslabs.github.io/mcp/servers/cfn-mcp-server/
|
|
@@ -22,6 +22,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
22
22
|
Classifier: Programming Language :: Python :: 3.13
|
|
23
23
|
Requires-Python: >=3.10
|
|
24
24
|
Requires-Dist: boto3>=1.34.0
|
|
25
|
+
Requires-Dist: botocore>=1.34.0
|
|
25
26
|
Requires-Dist: loguru>=0.7.0
|
|
26
27
|
Requires-Dist: mcp[cli]>=1.6.0
|
|
27
28
|
Requires-Dist: pydantic>=2.10.6
|
|
@@ -59,11 +60,10 @@ Here are some ways you can work with MCP across AWS, and we'll be adding support
|
|
|
59
60
|
"awslabs.cfn-mcp-server": {
|
|
60
61
|
"command": "uvx",
|
|
61
62
|
"args": [
|
|
62
|
-
"awslabs.
|
|
63
|
-
"--readonly" // Optional paramter if you would like to restrict the MCP to only read actions
|
|
63
|
+
"awslabs.cfn-mcp-server@latest"
|
|
64
64
|
],
|
|
65
65
|
"env": {
|
|
66
|
-
"AWS_PROFILE": "your-named-profile"
|
|
66
|
+
"AWS_PROFILE": "your-named-profile"
|
|
67
67
|
},
|
|
68
68
|
"disabled": false,
|
|
69
69
|
"autoApprove": []
|
|
@@ -72,10 +72,31 @@ Here are some ways you can work with MCP across AWS, and we'll be adding support
|
|
|
72
72
|
}
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
If you would like to prevent the MCP from taking any mutating actions (i.e. Create/Update/Delete Resource), you can specify the readonly flag as demonstrated below:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"mcpServers": {
|
|
80
|
+
"awslabs.cfn-mcp-server": {
|
|
81
|
+
"command": "uvx",
|
|
82
|
+
"args": [
|
|
83
|
+
"awslabs.cfn-mcp-server@latest",
|
|
84
|
+
"--readonly"
|
|
85
|
+
],
|
|
86
|
+
"env": {
|
|
87
|
+
"AWS_PROFILE": "your-named-profile"
|
|
88
|
+
},
|
|
89
|
+
"disabled": false,
|
|
90
|
+
"autoApprove": []
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
or docker after a successful `docker build -t awslabs/cfn-mcp-server .`:
|
|
76
97
|
|
|
77
98
|
```file
|
|
78
|
-
#
|
|
99
|
+
# fictitious `.env` file with AWS temporary credentials
|
|
79
100
|
AWS_ACCESS_KEY_ID=ASIAIOSFODNN7EXAMPLE
|
|
80
101
|
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
|
|
81
102
|
AWS_SESSION_TOKEN=AQoEXAMPLEH4aoAH0gNCAPy...truncated...zrkuWJOgQs8IZZaIv2BXIa2R4Olgk
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
awslabs/__init__.py,sha256=47wJeKcStxEJwX7SVVV2pnAWYR8FxcaYoT3YTmZ5Plg,674
|
|
2
|
+
awslabs/cfn_mcp_server/__init__.py,sha256=0iDzkNDzH_VHat2joZdYA_i2NeOiAWYlorKpKaW1vpE,611
|
|
3
|
+
awslabs/cfn_mcp_server/aws_client.py,sha256=w0cwuQq7b34IUaABEwZYpEols1QoMjO2gd3T98K5FcE,2783
|
|
4
|
+
awslabs/cfn_mcp_server/cloud_control_utils.py,sha256=wUDT-J9iEAOYnqZAG2vDtBsXUp0EUZ__jQzJ4RJ6AvM,2973
|
|
5
|
+
awslabs/cfn_mcp_server/context.py,sha256=YpJZPjyzHW7df9O-lyj2j8yuenZI-yPxLuVuyvmnAnE,777
|
|
6
|
+
awslabs/cfn_mcp_server/errors.py,sha256=0ADg9EesPyvjNZD-J89QLQ5OFcD6aSKDaMfW_4RQjfo,4481
|
|
7
|
+
awslabs/cfn_mcp_server/schema_manager.py,sha256=7dw2W2hgdn1ODRU5PrUmOG9_rvnKUhGD51q8Wz4Ksks,6775
|
|
8
|
+
awslabs/cfn_mcp_server/server.py,sha256=A_t60rwFRDJ8KopbS_zo5aYr7aqh6KiE5IWyZrLrh1U,13839
|
|
9
|
+
awslabs_cfn_mcp_server-1.0.1.dist-info/METADATA,sha256=umJjb2U5Yx0-oyjbCpu815RMJrNIlT6ednWO-EGZ61c,8272
|
|
10
|
+
awslabs_cfn_mcp_server-1.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
11
|
+
awslabs_cfn_mcp_server-1.0.1.dist-info/entry_points.txt,sha256=Hartc24s_fYgi3o2m2tBHahod0pqXYwpebQy2_tXL7s,78
|
|
12
|
+
awslabs_cfn_mcp_server-1.0.1.dist-info/licenses/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142
|
|
13
|
+
awslabs_cfn_mcp_server-1.0.1.dist-info/licenses/NOTICE,sha256=bcw4NZAgn5eQZzrtuDiwOe23BRSm_JiRzn0gxBLDzlg,90
|
|
14
|
+
awslabs_cfn_mcp_server-1.0.1.dist-info/RECORD,,
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
awslabs/__init__.py,sha256=47wJeKcStxEJwX7SVVV2pnAWYR8FxcaYoT3YTmZ5Plg,674
|
|
2
|
-
awslabs/cfn_mcp_server/__init__.py,sha256=0iDzkNDzH_VHat2joZdYA_i2NeOiAWYlorKpKaW1vpE,611
|
|
3
|
-
awslabs/cfn_mcp_server/aws_client.py,sha256=E7ekLizw0P6q9Pem40UDnhFTHKo5TMYmPeajuFDnMBY,2649
|
|
4
|
-
awslabs/cfn_mcp_server/cloud_control_utils.py,sha256=wUDT-J9iEAOYnqZAG2vDtBsXUp0EUZ__jQzJ4RJ6AvM,2973
|
|
5
|
-
awslabs/cfn_mcp_server/context.py,sha256=YpJZPjyzHW7df9O-lyj2j8yuenZI-yPxLuVuyvmnAnE,777
|
|
6
|
-
awslabs/cfn_mcp_server/errors.py,sha256=rNHaKx9t3xJGLLypSxXO6ec8nl1h19e8_2yYMTmDP4g,4480
|
|
7
|
-
awslabs/cfn_mcp_server/schema_manager.py,sha256=7dw2W2hgdn1ODRU5PrUmOG9_rvnKUhGD51q8Wz4Ksks,6775
|
|
8
|
-
awslabs/cfn_mcp_server/server.py,sha256=y0ipXAv2TKIxYTaGQZDkU1nxb7y6bXN9BW-TkzFSzuU,14177
|
|
9
|
-
awslabs_cfn_mcp_server-0.0.1.dist-info/METADATA,sha256=q3oLI4k5q_bNnJHwGmrxleB97Y_IBbxA9IGdZMdB_kk,7875
|
|
10
|
-
awslabs_cfn_mcp_server-0.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
11
|
-
awslabs_cfn_mcp_server-0.0.1.dist-info/entry_points.txt,sha256=Hartc24s_fYgi3o2m2tBHahod0pqXYwpebQy2_tXL7s,78
|
|
12
|
-
awslabs_cfn_mcp_server-0.0.1.dist-info/licenses/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142
|
|
13
|
-
awslabs_cfn_mcp_server-0.0.1.dist-info/licenses/NOTICE,sha256=bcw4NZAgn5eQZzrtuDiwOe23BRSm_JiRzn0gxBLDzlg,90
|
|
14
|
-
awslabs_cfn_mcp_server-0.0.1.dist-info/RECORD,,
|
|
File without changes
|
{awslabs_cfn_mcp_server-0.0.1.dist-info → awslabs_cfn_mcp_server-1.0.1.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{awslabs_cfn_mcp_server-0.0.1.dist-info → awslabs_cfn_mcp_server-1.0.1.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
{awslabs_cfn_mcp_server-0.0.1.dist-info → awslabs_cfn_mcp_server-1.0.1.dist-info}/licenses/NOTICE
RENAMED
|
File without changes
|