This is page 506 of 542. Use http://codebase.md/awslabs/mcp?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .devcontainer
│   └── devcontainer.json
├── .github
│   ├── actions
│   │   ├── build-and-push-container-image
│   │   │   └── action.yml
│   │   └── clear-space-ubuntu-latest-agressively
│   │       └── action.yml
│   ├── codecov.yml
│   ├── CODEOWNERS
│   ├── dependabot.yml
│   ├── ISSUE_TEMPLATE
│   │   ├── bug_report.yml
│   │   ├── documentation.yml
│   │   ├── feature_request.yml
│   │   ├── rfc.yml
│   │   └── support_awslabs_mcp_servers.yml
│   ├── pull_request_template.md
│   ├── SECURITY
│   ├── SUPPORT
│   └── workflows
│       ├── aws-api-mcp-upgrade-version.yml
│       ├── bandit-requirements.txt
│       ├── bandit.yml
│       ├── cfn_nag.yml
│       ├── check-gh-pages-builds.yml
│       ├── check-license-header-hash.txt
│       ├── check-license-header.json
│       ├── check-license-header.yml
│       ├── checkov.yml
│       ├── codeql.yml
│       ├── dependency-review-action.yml
│       ├── detect-secrets-requirements.txt
│       ├── gh-pages.yml
│       ├── merge-prevention.yml
│       ├── powershell.yml
│       ├── pre-commit-requirements.txt
│       ├── pre-commit.yml
│       ├── pull-request-lint.yml
│       ├── python.yml
│       ├── RELEASE_INSTRUCTIONS.md
│       ├── release-initiate-branch.yml
│       ├── release-merge-tag.yml
│       ├── release.py
│       ├── release.yml
│       ├── scanners.yml
│       ├── scorecard-analysis.yml
│       ├── semgrep-requirements.txt
│       ├── semgrep.yml
│       ├── stale.yml
│       ├── trivy.yml
│       └── typescript.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .python-version
├── .ruff.toml
├── .secrets.baseline
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── DESIGN_GUIDELINES.md
├── DEVELOPER_GUIDE.md
├── docs
│   └── images
│       └── root-readme
│           ├── cline-api-provider-filled.png
│           ├── cline-chat-interface.png
│           ├── cline-custom-instructions.png
│           ├── cline-select-aws-profile.png
│           ├── cline-select-bedrock.png
│           ├── configure-mcp-servers.png
│           ├── install-cline-extension.png
│           ├── mcp-servers-installed.png
│           └── select-mcp-servers.png
├── docusaurus
│   ├── .gitignore
│   ├── docs
│   │   ├── installation.md
│   │   ├── intro.md
│   │   ├── samples
│   │   │   ├── index.md
│   │   │   ├── mcp-integration-with-kb.md
│   │   │   ├── mcp-integration-with-nova-canvas.md
│   │   │   └── stepfunctions-tool-mcp-server.md
│   │   ├── servers
│   │   │   ├── amazon-bedrock-agentcore-mcp-server.md
│   │   │   ├── amazon-keyspaces-mcp-server.md
│   │   │   ├── amazon-mq-mcp-server.md
│   │   │   ├── amazon-neptune-mcp-server.md
│   │   │   ├── amazon-qbusiness-anonymous-mcp-server.md
│   │   │   ├── amazon-qindex-mcp-server.md
│   │   │   ├── amazon-sns-sqs-mcp-server.md
│   │   │   ├── aurora-dsql-mcp-server.md
│   │   │   ├── aws-api-mcp-server.md
│   │   │   ├── aws-appsync-mcp-server.md
│   │   │   ├── aws-bedrock-custom-model-import-mcp-server.md
│   │   │   ├── aws-bedrock-data-automation-mcp-server.md
│   │   │   ├── aws-dataprocessing-mcp-server.md
│   │   │   ├── aws-diagram-mcp-server.md
│   │   │   ├── aws-documentation-mcp-server.md
│   │   │   ├── aws-healthomics-mcp-server.md
│   │   │   ├── aws-iot-sitewise-mcp-server.md
│   │   │   ├── aws-knowledge-mcp-server.md
│   │   │   ├── aws-location-mcp-server.md
│   │   │   ├── aws-msk-mcp-server.md
│   │   │   ├── aws-pricing-mcp-server.md
│   │   │   ├── aws-serverless-mcp-server.md
│   │   │   ├── aws-support-mcp-server.md
│   │   │   ├── bedrock-kb-retrieval-mcp-server.md
│   │   │   ├── billing-cost-management-mcp-server.md
│   │   │   ├── ccapi-mcp-server.md
│   │   │   ├── cdk-mcp-server.md
│   │   │   ├── cfn-mcp-server.md
│   │   │   ├── cloudtrail-mcp-server.md
│   │   │   ├── cloudwatch-appsignals-mcp-server.md
│   │   │   ├── cloudwatch-mcp-server.md
│   │   │   ├── code-doc-gen-mcp-server.md
│   │   │   ├── core-mcp-server.md
│   │   │   ├── cost-explorer-mcp-server.md
│   │   │   ├── documentdb-mcp-server.md
│   │   │   ├── dynamodb-mcp-server.md
│   │   │   ├── ecs-mcp-server.md
│   │   │   ├── eks-mcp-server.md
│   │   │   ├── elasticache-mcp-server.md
│   │   │   ├── finch-mcp-server.md
│   │   │   ├── frontend-mcp-server.md
│   │   │   ├── git-repo-research-mcp-server.md
│   │   │   ├── healthlake-mcp-server.md
│   │   │   ├── iam-mcp-server.md
│   │   │   ├── kendra-index-mcp-server.md
│   │   │   ├── lambda-tool-mcp-server.md
│   │   │   ├── memcached-mcp-server.md
│   │   │   ├── mysql-mcp-server.md
│   │   │   ├── nova-canvas-mcp-server.md
│   │   │   ├── openapi-mcp-server.md
│   │   │   ├── postgres-mcp-server.md
│   │   │   ├── prometheus-mcp-server.md
│   │   │   ├── redshift-mcp-server.md
│   │   │   ├── s3-tables-mcp-server.md
│   │   │   ├── stepfunctions-tool-mcp-server.md
│   │   │   ├── syntheticdata-mcp-server.md
│   │   │   ├── terraform-mcp-server.md
│   │   │   ├── timestream-for-influxdb-mcp-server.md
│   │   │   ├── valkey-mcp-server.md
│   │   │   └── well-architected-security-mcp-server.mdx
│   │   └── vibe_coding.md
│   ├── docusaurus.config.ts
│   ├── package-lock.json
│   ├── package.json
│   ├── README.md
│   ├── sidebars.ts
│   ├── src
│   │   ├── components
│   │   │   ├── HomepageFeatures
│   │   │   │   └── styles.module.css
│   │   │   └── ServerCards
│   │   │       ├── index.tsx
│   │   │       └── styles.module.css
│   │   ├── css
│   │   │   ├── custom.css
│   │   │   └── doc-override.css
│   │   └── pages
│   │       ├── index.module.css
│   │       └── servers.tsx
│   ├── static
│   │   ├── .nojekyll
│   │   ├── assets
│   │   │   ├── icons
│   │   │   │   ├── activity.svg
│   │   │   │   ├── book-open.svg
│   │   │   │   ├── cpu.svg
│   │   │   │   ├── database.svg
│   │   │   │   ├── dollar-sign.svg
│   │   │   │   ├── help-circle.svg
│   │   │   │   ├── key.svg
│   │   │   │   ├── server.svg
│   │   │   │   ├── share-2.svg
│   │   │   │   ├── tool.svg
│   │   │   │   └── zap.svg
│   │   │   └── server-cards.json
│   │   └── img
│   │       ├── aws-logo.svg
│   │       └── logo.png
│   └── tsconfig.json
├── LICENSE
├── NOTICE
├── README.md
├── samples
│   ├── mcp-integration-with-kb
│   │   ├── .env.example
│   │   ├── .python-version
│   │   ├── assets
│   │   │   └── simplified-mcp-flow-diagram.png
│   │   ├── clients
│   │   │   └── client_server.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── user_interfaces
│   │   │   └── chat_bedrock_st.py
│   │   └── uv.lock
│   ├── mcp-integration-with-nova-canvas
│   │   ├── .env.example
│   │   ├── .python-version
│   │   ├── clients
│   │   │   └── client_server.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── user_interfaces
│   │   │   └── image_generator_st.py
│   │   └── uv.lock
│   ├── README.md
│   └── stepfunctions-tool-mcp-server
│       ├── README.md
│       └── sample_state_machines
│           ├── customer-create
│           │   └── app.py
│           ├── customer-id-from-email
│           │   └── app.py
│           ├── customer-info-from-id
│           │   └── app.py
│           └── template.yml
├── scripts
│   ├── README.md
│   └── verify_package_name.py
├── src
│   ├── amazon-bedrock-agentcore-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_bedrock_agentcore_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── config.py
│   │   │       ├── server.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── cache.py
│   │   │           ├── doc_fetcher.py
│   │   │           ├── indexer.py
│   │   │           ├── text_processor.py
│   │   │           └── url_validator.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── SECURITY.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_cache.py
│   │   │   ├── test_config.py
│   │   │   ├── test_doc_fetcher.py
│   │   │   ├── test_indexer.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_server.py
│   │   │   ├── test_text_processor.py
│   │   │   └── test_url_validator.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── amazon-kendra-index-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_kendra_index_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── server.py
│   │   │       └── util.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── amazon-keyspaces-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_keyspaces_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── client.py
│   │   │       ├── config.py
│   │   │       ├── consts.py
│   │   │       ├── llm_context.py
│   │   │       ├── models.py
│   │   │       ├── server.py
│   │   │       └── services.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_client.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_query_analysis_service.py
│   │   │   ├── test_server.py
│   │   │   └── test_services.py
│   │   └── uv.lock
│   ├── amazon-mq-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_mq_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── aws_service_mcp_generator.py
│   │   │       ├── consts.py
│   │   │       ├── rabbitmq
│   │   │       │   ├── __init__.py
│   │   │       │   ├── admin.py
│   │   │       │   ├── connection.py
│   │   │       │   ├── doc
│   │   │       │   │   ├── rabbitmq_broker_sizing_guide.md
│   │   │       │   │   ├── rabbitmq_performance_optimization_best_practice.md
│   │   │       │   │   ├── rabbitmq_production_deployment_guidelines.md
│   │   │       │   │   ├── rabbitmq_quorum_queue_migration_guide.md
│   │   │       │   │   └── rabbitmq_setup_best_practice.md
│   │   │       │   ├── handlers.py
│   │   │       │   └── module.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── example
│   │   │   └── sample_mcp_q_cli.json
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── rabbitmq
│   │   │   │   ├── __init__.py
│   │   │   │   ├── conftest.py
│   │   │   │   ├── test_admin.py
│   │   │   │   ├── test_connection.py
│   │   │   │   ├── test_handlers.py
│   │   │   │   └── test_module.py
│   │   │   ├── test_aws_service_mcp_generator.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── amazon-neptune-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_neptune_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── exceptions.py
│   │   │       ├── graph_store
│   │   │       │   ├── __init__.py
│   │   │       │   ├── analytics.py
│   │   │       │   ├── base.py
│   │   │       │   └── database.py
│   │   │       ├── models.py
│   │   │       ├── neptune.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_analytics.py
│   │   │   ├── test_database.py
│   │   │   ├── test_exceptions.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_models.py
│   │   │   ├── test_neptune.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── amazon-qbusiness-anonymous-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_qbusiness_anonymous_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── clients.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── amazon-qindex-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_qindex_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── clients.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_clients.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── test_server.py
│   │   └── uv.lock
│   ├── amazon-sns-sqs-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_sns_sqs_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── common.py
│   │   │       ├── consts.py
│   │   │       ├── generator.py
│   │   │       ├── server.py
│   │   │       ├── sns.py
│   │   │       └── sqs.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── print_tools.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── test_common.py
│   │   │   ├── test_generator.py
│   │   │   ├── test_server.py
│   │   │   ├── test_sns.py
│   │   │   └── test_sqs.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aurora-dsql-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aurora_dsql_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── consts.py
│   │   │       ├── mutable_sql_detector.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_connection_reuse.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_profile_option.py
│   │   │   ├── test_readonly_enforcement.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-api-mcp-server
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_api_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── core
│   │   │       │   ├── __init__.py
│   │   │       │   ├── agent_scripts
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── manager.py
│   │   │       │   │   ├── models.py
│   │   │       │   │   └── registry
│   │   │       │   │       ├── __init__.py
│   │   │       │   │       ├── application-failure-troubleshooting.script.md
│   │   │       │   │       ├── cloudtral-mutli-region-setup.script.md
│   │   │       │   │       ├── create_amazon_aurora_db_cluster_with_instances.script.md
│   │   │       │   │       ├── lambda-timeout-debugging.script.md
│   │   │       │   │       ├── scripts_format.md
│   │   │       │   │       └── troubleshoot-permissions-with-cloudtrail-events.script.md
│   │   │       │   ├── aws
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── driver.py
│   │   │       │   │   ├── pagination.py
│   │   │       │   │   ├── regions.py
│   │   │       │   │   ├── service.py
│   │   │       │   │   └── services.py
│   │   │       │   ├── common
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── command_metadata.py
│   │   │       │   │   ├── command.py
│   │   │       │   │   ├── config.py
│   │   │       │   │   ├── errors.py
│   │   │       │   │   ├── file_operations.py
│   │   │       │   │   ├── file_system_controls.py
│   │   │       │   │   ├── helpers.py
│   │   │       │   │   ├── models.py
│   │   │       │   │   └── py.typed
│   │   │       │   ├── data
│   │   │       │   │   └── api_metadata.json
│   │   │       │   ├── metadata
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   └── read_only_operations_list.py
│   │   │       │   ├── parser
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── custom_validators
│   │   │       │   │   │   ├── __init__.py
│   │   │       │   │   │   ├── botocore_param_validator.py
│   │   │       │   │   │   ├── ec2_validator.py
│   │   │       │   │   │   └── ssm_validator.py
│   │   │       │   │   ├── interpretation.py
│   │   │       │   │   ├── lexer.py
│   │   │       │   │   └── parser.py
│   │   │       │   ├── py.typed
│   │   │       │   └── security
│   │   │       │       ├── __init__.py
│   │   │       │       ├── aws_api_customization.json
│   │   │       │       └── policy.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── CONTRIBUTING.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── agent_scripts
│   │   │   │   ├── __init__.py
│   │   │   │   ├── test_manager.py
│   │   │   │   └── test_registry
│   │   │   │       ├── another_valid_script.script.md
│   │   │   │       ├── test_script.script.md
│   │   │   │       └── valid_script.script.md
│   │   │   ├── aws
│   │   │   │   ├── __init__.py
│   │   │   │   ├── test_driver.py
│   │   │   │   ├── test_pagination.py
│   │   │   │   ├── test_service.py
│   │   │   │   └── test_services.py
│   │   │   ├── common
│   │   │   │   ├── test_command.py
│   │   │   │   ├── test_config.py
│   │   │   │   ├── test_file_operations.py
│   │   │   │   ├── test_file_system_controls.py
│   │   │   │   ├── test_file_validation.py
│   │   │   │   └── test_helpers.py
│   │   │   ├── fixtures.py
│   │   │   ├── history_handler.py
│   │   │   ├── metadata
│   │   │   │   ├── __init__.py
│   │   │   │   └── test_read_only_operations_list.py
│   │   │   ├── parser
│   │   │   │   ├── __init__.py
│   │   │   │   ├── test_file_path_detection.py
│   │   │   │   ├── test_lexer.py
│   │   │   │   ├── test_parser_customizations.py
│   │   │   │   └── test_parser.py
│   │   │   ├── test_security_policy.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-appsync-mcp-server
│   │   ├── .dockerignore
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_appsync_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── decorators.py
│   │   │       ├── helpers.py
│   │   │       ├── operations
│   │   │       │   ├── __init__.py
│   │   │       │   ├── create_api_cache.py
│   │   │       │   ├── create_api_key.py
│   │   │       │   ├── create_api.py
│   │   │       │   ├── create_channel_namespace.py
│   │   │       │   ├── create_datasource.py
│   │   │       │   ├── create_domain_name.py
│   │   │       │   ├── create_function.py
│   │   │       │   ├── create_graphql_api.py
│   │   │       │   ├── create_resolver.py
│   │   │       │   └── create_schema.py
│   │   │       ├── server.py
│   │   │       ├── tools
│   │   │       │   ├── __init__.py
│   │   │       │   ├── create_api_cache.py
│   │   │       │   ├── create_api_key.py
│   │   │       │   ├── create_api.py
│   │   │       │   ├── create_channel_namespace.py
│   │   │       │   ├── create_datasource.py
│   │   │       │   ├── create_domain_name.py
│   │   │       │   ├── create_function.py
│   │   │       │   ├── create_graphql_api.py
│   │   │       │   ├── create_resolver.py
│   │   │       │   └── create_schema.py
│   │   │       └── validators.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_all_create_tools_write_protection.py
│   │   │   ├── test_create_api_cache.py
│   │   │   ├── test_create_api_key.py
│   │   │   ├── test_create_api.py
│   │   │   ├── test_create_channel_namespace.py
│   │   │   ├── test_create_datasource_tool.py
│   │   │   ├── test_create_datasource.py
│   │   │   ├── test_create_domain_name.py
│   │   │   ├── test_create_function.py
│   │   │   ├── test_create_graphql_api.py
│   │   │   ├── test_create_resolver.py
│   │   │   ├── test_create_schema_tool.py
│   │   │   ├── test_create_schema.py
│   │   │   ├── test_helpers.py
│   │   │   ├── test_server.py
│   │   │   ├── test_validators.py
│   │   │   └── test_write_operation.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-bedrock-custom-model-import-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_bedrock_custom_model_import_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── client.py
│   │   │       ├── llm_context.py
│   │   │       ├── models.py
│   │   │       ├── prompts.py
│   │   │       ├── server.py
│   │   │       ├── services
│   │   │       │   ├── __init__.py
│   │   │       │   ├── imported_model_service.py
│   │   │       │   └── model_import_service.py
│   │   │       ├── tools
│   │   │       │   ├── create_model_import_job.py
│   │   │       │   ├── delete_imported_model.py
│   │   │       │   ├── get_imported_model.py
│   │   │       │   ├── get_model_import_job.py
│   │   │       │   ├── list_imported_models.py
│   │   │       │   └── list_model_import_jobs.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── aws.py
│   │   │           ├── config.py
│   │   │           ├── consts.py
│   │   │           └── matching.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── services
│   │   │   │   ├── test_imported_model_service.py
│   │   │   │   └── test_model_import_service.py
│   │   │   ├── test_client.py
│   │   │   ├── test_init.py
│   │   │   ├── test_llm_context.py
│   │   │   ├── test_prompts.py
│   │   │   ├── test_server.py
│   │   │   ├── tools
│   │   │   │   ├── test_create_model_import_job.py
│   │   │   │   ├── test_delete_imported_model.py
│   │   │   │   ├── test_get_imported_model.py
│   │   │   │   ├── test_get_model_import_job.py
│   │   │   │   ├── test_list_imported_models.py
│   │   │   │   └── test_list_model_import_jobs.py
│   │   │   └── utils
│   │   │       ├── test_aws.py
│   │   │       ├── test_config.py
│   │   │       └── test_matching.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-bedrock-data-automation-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_bedrock_data_automation_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── helpers.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_helpers.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-dataprocessing-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_dataprocessing_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── core
│   │   │       │   ├── __init__.py
│   │   │       │   └── glue_data_catalog
│   │   │       │       ├── __init__.py
│   │   │       │       ├── data_catalog_database_manager.py
│   │   │       │       ├── data_catalog_handler.py
│   │   │       │       └── data_catalog_table_manager.py
│   │   │       ├── handlers
│   │   │       │   ├── __init__.py
│   │   │       │   ├── athena
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── athena_data_catalog_handler.py
│   │   │       │   │   ├── athena_query_handler.py
│   │   │       │   │   └── athena_workgroup_handler.py
│   │   │       │   ├── commons
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   └── common_resource_handler.py
│   │   │       │   ├── emr
│   │   │       │   │   ├── emr_ec2_cluster_handler.py
│   │   │       │   │   ├── emr_ec2_instance_handler.py
│   │   │       │   │   └── emr_ec2_steps_handler.py
│   │   │       │   └── glue
│   │   │       │       ├── __init__.py
│   │   │       │       ├── crawler_handler.py
│   │   │       │       ├── data_catalog_handler.py
│   │   │       │       ├── glue_commons_handler.py
│   │   │       │       ├── glue_etl_handler.py
│   │   │       │       ├── interactive_sessions_handler.py
│   │   │       │       └── worklows_handler.py
│   │   │       ├── models
│   │   │       │   ├── __init__.py
│   │   │       │   ├── athena_models.py
│   │   │       │   ├── common_resource_models.py
│   │   │       │   ├── data_catalog_models.py
│   │   │       │   ├── emr_models.py
│   │   │       │   └── glue_models.py
│   │   │       ├── server.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── aws_helper.py
│   │   │           ├── consts.py
│   │   │           ├── logging_helper.py
│   │   │           └── sql_analyzer.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── core
│   │   │   │   ├── __init__.py
│   │   │   │   └── glue_data_catalog
│   │   │   │       ├── __init__.py
│   │   │   │       ├── test_data_catalog_database_manager.py
│   │   │   │       ├── test_data_catalog_handler.py
│   │   │   │       └── test_data_catalog_table_manager.py
│   │   │   ├── handlers
│   │   │   │   ├── __init__.py
│   │   │   │   ├── athena
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── test_athena_data_catalog_handler.py
│   │   │   │   │   ├── test_athena_query_handler.py
│   │   │   │   │   ├── test_athena_workgroup_handler.py
│   │   │   │   │   └── test_custom_tags_athena.py
│   │   │   │   ├── commons
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── test_common_resource_handler.py
│   │   │   │   ├── emr
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── test_custom_tags_emr.py
│   │   │   │   │   ├── test_emr_ec2_cluster_handler.py
│   │   │   │   │   ├── test_emr_ec2_instance_handler.py
│   │   │   │   │   └── test_emr_ec2_steps_handler.py
│   │   │   │   └── glue
│   │   │   │       ├── __init__.py
│   │   │   │       ├── test_crawler_handler.py
│   │   │   │       ├── test_custom_tags_glue.py
│   │   │   │       ├── test_data_catalog_handler.py
│   │   │   │       ├── test_glue_commons_handler.py
│   │   │   │       ├── test_glue_etl_handler.py
│   │   │   │       ├── test_glue_interactive_sessions_handler.py
│   │   │   │       └── test_glue_workflows_handler.py
│   │   │   ├── models
│   │   │   │   ├── __init__.py
│   │   │   │   ├── test_athena_models.py
│   │   │   │   ├── test_common_resource_models.py
│   │   │   │   ├── test_data_catalog_models.py
│   │   │   │   ├── test_emr_models.py
│   │   │   │   ├── test_glue_models.py
│   │   │   │   ├── test_interactive_sessions_models.py
│   │   │   │   └── test_workflows_models.py
│   │   │   ├── test_init.py
│   │   │   ├── test_server.py
│   │   │   └── utils
│   │   │       ├── __init__.py
│   │   │       ├── test_aws_helper.py
│   │   │       ├── test_custom_tags.py
│   │   │       ├── test_logging_helper.py
│   │   │       └── test_sql_analyzer.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-diagram-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_diagram_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── diagrams_tools.py
│   │   │       ├── models.py
│   │   │       ├── scanner.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── conftest.py
│   │   │   ├── README.md
│   │   │   ├── resources
│   │   │   │   ├── __init__.py
│   │   │   │   └── example_diagrams
│   │   │   │       ├── __init__.py
│   │   │   │       ├── aws_example.py
│   │   │   │       ├── flow_example.py
│   │   │   │       └── sequence_example.py
│   │   │   ├── test_diagrams.py
│   │   │   ├── test_models.py
│   │   │   ├── test_sarif_fix.py
│   │   │   ├── test_scanner.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-documentation-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_documentation_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── models.py
│   │   │       ├── server_aws_cn.py
│   │   │       ├── server_aws.py
│   │   │       ├── server_utils.py
│   │   │       ├── server.py
│   │   │       └── util.py
│   │   ├── basic-usage.gif
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── constants.py
│   │   │   ├── resources
│   │   │   │   └── lambda_sns_raw.html
│   │   │   ├── test_aws_cn_get_available_services_live.py
│   │   │   ├── test_aws_cn_read_documentation_live.py
│   │   │   ├── test_aws_read_documentation_live.py
│   │   │   ├── test_aws_recommend_live.py
│   │   │   ├── test_aws_search_live.py
│   │   │   ├── test_metadata_handling.py
│   │   │   ├── test_models.py
│   │   │   ├── test_server_aws_cn.py
│   │   │   ├── test_server_aws.py
│   │   │   ├── test_server_utils.py
│   │   │   ├── test_server.py
│   │   │   └── test_util.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-healthomics-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_healthomics_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── consts.py
│   │   │       ├── models.py
│   │   │       ├── server.py
│   │   │       ├── tools
│   │   │       │   ├── __init__.py
│   │   │       │   ├── helper_tools.py
│   │   │       │   ├── run_analysis.py
│   │   │       │   ├── troubleshooting.py
│   │   │       │   ├── workflow_analysis.py
│   │   │       │   ├── workflow_execution.py
│   │   │       │   ├── workflow_linting.py
│   │   │       │   └── workflow_management.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── aws_utils.py
│   │   │           ├── s3_utils.py
│   │   │           └── validation_utils.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── docs
│   │   │   └── workflow_linting.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── conftest.py
│   │   │   ├── test_aws_utils.py
│   │   │   ├── test_consts.py
│   │   │   ├── test_helper_tools.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_models.py
│   │   │   ├── test_run_analysis.py
│   │   │   ├── test_s3_utils.py
│   │   │   ├── test_server.py
│   │   │   ├── test_troubleshooting.py
│   │   │   ├── test_workflow_analysis.py
│   │   │   ├── test_workflow_execution.py
│   │   │   ├── test_workflow_linting.py
│   │   │   ├── test_workflow_management.py
│   │   │   └── test_workflow_tools.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-iot-sitewise-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_iot_sitewise_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── client.py
│   │   │       ├── models.py
│   │   │       ├── prompts
│   │   │       │   ├── __init__.py
│   │   │       │   ├── asset_hierarchy.py
│   │   │       │   ├── bulk_import_workflow.py
│   │   │       │   ├── data_exploration.py
│   │   │       │   └── data_ingestion.py
│   │   │       ├── server.py
│   │   │       ├── tool_metadata.py
│   │   │       ├── tools
│   │   │       │   ├── __init__.py
│   │   │       │   ├── sitewise_access.py
│   │   │       │   ├── sitewise_asset_models.py
│   │   │       │   ├── sitewise_assets.py
│   │   │       │   ├── sitewise_data.py
│   │   │       │   ├── sitewise_gateways.py
│   │   │       │   └── sitewise_metadata_transfer.py
│   │   │       └── validation.py
│   │   ├── CHANGELOG.md
│   │   ├── DEVELOPMENT.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── examples
│   │   │   └── wind_farm_example.py
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_server.py
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_client.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_models.py
│   │   │   ├── test_server.py
│   │   │   ├── test_sitewise_access.py
│   │   │   ├── test_sitewise_asset_models.py
│   │   │   ├── test_sitewise_assets.py
│   │   │   ├── test_sitewise_data.py
│   │   │   ├── test_sitewise_gateways.py
│   │   │   ├── test_sitewise_metadata_transfer.py
│   │   │   └── test_validation.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-knowledge-mcp-server
│   │   └── README.md
│   ├── aws-location-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_location_server
│   │   │       ├── __init__.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_server_integration.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-msk-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_msk_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── server.py
│   │   │       └── tools
│   │   │           ├── __init__.py
│   │   │           ├── common_functions
│   │   │           │   ├── __init__.py
│   │   │           │   ├── client_manager.py
│   │   │           │   └── common_functions.py
│   │   │           ├── logs_and_telemetry
│   │   │           │   ├── __init__.py
│   │   │           │   ├── cluster_metrics_tools.py
│   │   │           │   ├── list_customer_iam_access.py
│   │   │           │   └── metric_config.py
│   │   │           ├── mutate_cluster
│   │   │           │   ├── __init__.py
│   │   │           │   ├── batch_associate_scram_secret.py
│   │   │           │   ├── batch_disassociate_scram_secret.py
│   │   │           │   ├── create_cluster_v2.py
│   │   │           │   ├── put_cluster_policy.py
│   │   │           │   ├── reboot_broker.py
│   │   │           │   ├── update_broker_count.py
│   │   │           │   ├── update_broker_storage.py
│   │   │           │   ├── update_broker_type.py
│   │   │           │   ├── update_cluster_configuration.py
│   │   │           │   ├── update_monitoring.py
│   │   │           │   └── update_security.py
│   │   │           ├── mutate_config
│   │   │           │   ├── __init__.py
│   │   │           │   ├── create_configuration.py
│   │   │           │   ├── tag_resource.py
│   │   │           │   ├── untag_resource.py
│   │   │           │   └── update_configuration.py
│   │   │           ├── mutate_vpc
│   │   │           │   ├── __init__.py
│   │   │           │   ├── create_vpc_connection.py
│   │   │           │   ├── delete_vpc_connection.py
│   │   │           │   └── reject_client_vpc_connection.py
│   │   │           ├── read_cluster
│   │   │           │   ├── __init__.py
│   │   │           │   ├── describe_cluster_operation.py
│   │   │           │   ├── describe_cluster.py
│   │   │           │   ├── get_bootstrap_brokers.py
│   │   │           │   ├── get_cluster_policy.py
│   │   │           │   ├── get_compatible_kafka_versions.py
│   │   │           │   ├── list_client_vpc_connections.py
│   │   │           │   ├── list_cluster_operations.py
│   │   │           │   ├── list_nodes.py
│   │   │           │   └── list_scram_secrets.py
│   │   │           ├── read_config
│   │   │           │   ├── __init__.py
│   │   │           │   ├── describe_configuration_revision.py
│   │   │           │   ├── describe_configuration.py
│   │   │           │   ├── list_configuration_revisions.py
│   │   │           │   └── list_tags_for_resource.py
│   │   │           ├── read_global
│   │   │           │   ├── __init__.py
│   │   │           │   ├── list_clusters.py
│   │   │           │   ├── list_configurations.py
│   │   │           │   ├── list_kafka_versions.py
│   │   │           │   └── list_vpc_connections.py
│   │   │           ├── read_vpc
│   │   │           │   ├── __init__.py
│   │   │           │   └── describe_vpc_connection.py
│   │   │           └── static_tools
│   │   │               ├── __init__.py
│   │   │               └── cluster_best_practices.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_client_manager.py
│   │   │   ├── test_cluster_metrics_tools.py
│   │   │   ├── test_common_functions.py
│   │   │   ├── test_create_cluster_v2.py
│   │   │   ├── test_create_configuration.py
│   │   │   ├── test_create_vpc_connection.py
│   │   │   ├── test_delete_vpc_connection.py
│   │   │   ├── test_describe_cluster_operation.py
│   │   │   ├── test_describe_cluster.py
│   │   │   ├── test_describe_configuration_revision.py
│   │   │   ├── test_describe_configuration.py
│   │   │   ├── test_describe_vpc_connection.py
│   │   │   ├── test_get_bootstrap_brokers.py
│   │   │   ├── test_get_cluster_policy.py
│   │   │   ├── test_get_compatible_kafka_versions.py
│   │   │   ├── test_init.py
│   │   │   ├── test_list_client_vpc_connections.py
│   │   │   ├── test_list_cluster_operations.py
│   │   │   ├── test_list_clusters.py
│   │   │   ├── test_list_configuration_revisions.py
│   │   │   ├── test_list_configurations.py
│   │   │   ├── test_list_customer_iam_access.py
│   │   │   ├── test_list_kafka_versions.py
│   │   │   ├── test_list_nodes.py
│   │   │   ├── test_list_scram_secrets.py
│   │   │   ├── test_list_tags_for_resource.py
│   │   │   ├── test_list_vpc_connections.py
│   │   │   ├── test_logs_and_telemetry.py
│   │   │   ├── test_main.py
│   │   │   ├── test_mutate_cluster_init.py
│   │   │   ├── test_mutate_cluster_success_cases.py
│   │   │   ├── test_mutate_cluster.py
│   │   │   ├── test_mutate_config_init.py
│   │   │   ├── test_mutate_vpc_init.py
│   │   │   ├── test_read_cluster_init_updated.py
│   │   │   ├── test_read_cluster_init.py
│   │   │   ├── test_read_config_init.py
│   │   │   ├── test_read_global_init.py
│   │   │   ├── test_read_vpc_init.py
│   │   │   ├── test_reject_client_vpc_connection.py
│   │   │   ├── test_server.py
│   │   │   ├── test_static_tools_init.py
│   │   │   ├── test_tag_resource.py
│   │   │   ├── test_tool_descriptions.py
│   │   │   ├── test_untag_resource.py
│   │   │   └── test_update_configuration.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-pricing-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_pricing_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── cdk_analyzer.py
│   │   │       ├── consts.py
│   │   │       ├── helpers.py
│   │   │       ├── models.py
│   │   │       ├── pricing_client.py
│   │   │       ├── pricing_transformer.py
│   │   │       ├── report_generator.py
│   │   │       ├── server.py
│   │   │       ├── static
│   │   │       │   ├── __init__.py
│   │   │       │   ├── COST_REPORT_TEMPLATE.md
│   │   │       │   └── patterns
│   │   │       │       ├── __init__.py
│   │   │       │       └── BEDROCK.md
│   │   │       └── terraform_analyzer.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_cdk_analyzer.py
│   │   │   ├── test_helpers.py
│   │   │   ├── test_pricing_client.py
│   │   │   ├── test_pricing_transformer.py
│   │   │   ├── test_report_generator.py
│   │   │   ├── test_server.py
│   │   │   └── test_terraform_analyzer.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-serverless-mcp-server
│   │   ├── .pre-commit.config.yaml
│   │   ├── .python-version
│   │   ├── .secrets.baseline
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_serverless_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── models.py
│   │   │       ├── resources
│   │   │       │   ├── __init__.py
│   │   │       │   ├── deployment_details.py
│   │   │       │   ├── deployment_list.py
│   │   │       │   ├── template_details.py
│   │   │       │   └── template_list.py
│   │   │       ├── server.py
│   │   │       ├── template
│   │   │       │   ├── __init__.py
│   │   │       │   ├── registry.py
│   │   │       │   ├── renderer.py
│   │   │       │   └── templates
│   │   │       │       ├── backend.j2
│   │   │       │       ├── frontend.j2
│   │   │       │       ├── fullstack.j2
│   │   │       │       └── README.md
│   │   │       ├── templates
│   │   │       │   ├── __init__.py
│   │   │       │   └── iam_policies.py
│   │   │       ├── tools
│   │   │       │   ├── common
│   │   │       │   │   └── base_tool.py
│   │   │       │   ├── esm
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── esm_diagnosis.py
│   │   │       │   │   ├── esm_guidance.py
│   │   │       │   │   ├── esm_recommend.py
│   │   │       │   │   └── secure_esm_guidance.py
│   │   │       │   ├── guidance
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── deploy_serverless_app_help.py
│   │   │       │   │   ├── get_iac_guidance.py
│   │   │       │   │   ├── get_lambda_event_schemas.py
│   │   │       │   │   ├── get_lambda_guidance.py
│   │   │       │   │   └── get_serverless_templates.py
│   │   │       │   ├── poller
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── esm_diagnosis.py
│   │   │       │   │   ├── esm_guidance.py
│   │   │       │   │   └── esm_recommend.py
│   │   │       │   ├── sam
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── sam_build.py
│   │   │       │   │   ├── sam_deploy.py
│   │   │       │   │   ├── sam_init.py
│   │   │       │   │   ├── sam_local_invoke.py
│   │   │       │   │   └── sam_logs.py
│   │   │       │   ├── schemas
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── describe_schema.py
│   │   │       │   │   ├── list_registries.py
│   │   │       │   │   └── search_schema.py
│   │   │       │   └── webapps
│   │   │       │       ├── __init__.py
│   │   │       │       ├── configure_domain.py
│   │   │       │       ├── deploy_webapp.py
│   │   │       │       ├── get_metrics.py
│   │   │       │       ├── update_webapp_frontend.py
│   │   │       │       ├── utils
│   │   │       │       │   ├── deploy_service.py
│   │   │       │       │   ├── frontend_uploader.py
│   │   │       │       │   └── startup_script_generator.py
│   │   │       │       └── webapp_deployment_help.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── aws_client_helper.py
│   │   │           ├── cloudformation.py
│   │   │           ├── const.py
│   │   │           ├── data_scrubber.py
│   │   │           ├── deployment_manager.py
│   │   │           ├── github.py
│   │   │           └── process.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── README.md
│   │   │   ├── test_cloudformation.py
│   │   │   ├── test_configure_domain.py
│   │   │   ├── test_data_scrubber.py
│   │   │   ├── test_deploy_serverless_app_help.py
│   │   │   ├── test_deploy_service.py
│   │   │   ├── test_deploy_webapp.py
│   │   │   ├── test_deployment_details.py
│   │   │   ├── test_deployment_help.py
│   │   │   ├── test_deployment_list.py
│   │   │   ├── test_deployment_manager.py
│   │   │   ├── test_esm_diagnosis.py
│   │   │   ├── test_esm_guidance.py
│   │   │   ├── test_esm_recommend.py
│   │   │   ├── test_frontend_uploader.py
│   │   │   ├── test_get_iac_guidance.py
│   │   │   ├── test_get_lambda_event_schemas.py
│   │   │   ├── test_get_lambda_guidance.py
│   │   │   ├── test_get_metrics.py
│   │   │   ├── test_get_serverless_templates.py
│   │   │   ├── test_github.py
│   │   │   ├── test_iam_policies.py
│   │   │   ├── test_models.py
│   │   │   ├── test_process.py
│   │   │   ├── test_sam_build.py
│   │   │   ├── test_sam_deploy.py
│   │   │   ├── test_sam_init.py
│   │   │   ├── test_sam_local_invoke.py
│   │   │   ├── test_sam_logs.py
│   │   │   ├── test_schemas.py
│   │   │   ├── test_secure_esm_guidance.py
│   │   │   ├── test_server.py
│   │   │   ├── test_startup_script_generator.py
│   │   │   ├── test_template_details.py
│   │   │   ├── test_template_list.py
│   │   │   ├── test_template_registry.py
│   │   │   ├── test_template_renderer.py
│   │   │   └── test_update_webapp_frontend.py
│   │   └── uv.lock
│   ├── aws-support-mcp-server
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_support_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── client.py
│   │   │       ├── consts.py
│   │   │       ├── debug_helper.py
│   │   │       ├── errors.py
│   │   │       ├── formatters.py
│   │   │       ├── models.py
│   │   │       └── server.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftests.py
│   │   │   ├── test_aws_support_mcp_server.py
│   │   │   └── test_models.py
│   │   └── uv.lock
│   ├── bedrock-kb-retrieval-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── bedrock_kb_retrieval_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── knowledgebases
│   │   │       │   ├── __init__.py
│   │   │       │   ├── clients.py
│   │   │       │   ├── discovery.py
│   │   │       │   └── retrieval.py
│   │   │       ├── models.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── conftest.py
│   │   │   ├── README.md
│   │   │   ├── test_clients.py
│   │   │   ├── test_discovery.py
│   │   │   ├── test_env_config.py
│   │   │   ├── test_models.py
│   │   │   ├── test_retrieval.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── billing-cost-management-mcp-server
│   │   ├── __init__.py
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── billing_cost_management_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── models.py
│   │   │       ├── prompts
│   │   │       │   ├── __init__.py
│   │   │       │   ├── decorator.py
│   │   │       │   ├── graviton_migration.py
│   │   │       │   ├── README.md
│   │   │       │   ├── savings_plans.py
│   │   │       │   └── types.py
│   │   │       ├── server.py
│   │   │       ├── templates
│   │   │       │   └── recommendation_templates
│   │   │       │       ├── ebs_volume.template
│   │   │       │       ├── ec2_asg.template
│   │   │       │       ├── ec2_instance.template
│   │   │       │       ├── ecs_service.template
│   │   │       │       ├── idle.template
│   │   │       │       ├── lambda_function.template
│   │   │       │       ├── rds_database.template
│   │   │       │       ├── reserved_instances.template
│   │   │       │       └── savings_plans.template
│   │   │       ├── tools
│   │   │       │   ├── __init__.py
│   │   │       │   ├── aws_pricing_operations.py
│   │   │       │   ├── aws_pricing_tools.py
│   │   │       │   ├── bcm_pricing_calculator_tools.py
│   │   │       │   ├── budget_tools.py
│   │   │       │   ├── compute_optimizer_tools.py
│   │   │       │   ├── cost_anomaly_tools.py
│   │   │       │   ├── cost_comparison_tools.py
│   │   │       │   ├── cost_explorer_operations.py
│   │   │       │   ├── cost_explorer_tools.py
│   │   │       │   ├── cost_optimization_hub_helpers.py
│   │   │       │   ├── cost_optimization_hub_tools.py
│   │   │       │   ├── free_tier_usage_tools.py
│   │   │       │   ├── recommendation_details_tools.py
│   │   │       │   ├── ri_performance_tools.py
│   │   │       │   ├── sp_performance_tools.py
│   │   │       │   ├── storage_lens_tools.py
│   │   │       │   └── unified_sql_tools.py
│   │   │       └── utilities
│   │   │           ├── __init__.py
│   │   │           ├── aws_service_base.py
│   │   │           ├── constants.py
│   │   │           ├── logging_utils.py
│   │   │           └── sql_utils.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── requirements.txt
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── prompts
│   │   │   │   ├── __init__.py
│   │   │   │   └── test_prompts.py
│   │   │   ├── README.md
│   │   │   ├── test_models.py
│   │   │   ├── test_server.py
│   │   │   ├── tools
│   │   │   │   ├── __init__.py
│   │   │   │   ├── fixtures.py
│   │   │   │   ├── test_aws_bcm_pricing_calculator_tools.py
│   │   │   │   ├── test_aws_pricing_tools.py
│   │   │   │   ├── test_budget_tools.py
│   │   │   │   ├── test_compute_optimizer_tools.py
│   │   │   │   ├── test_cost_anomaly_tools_enhanced.py
│   │   │   │   ├── test_cost_anomaly_tools.py
│   │   │   │   ├── test_cost_comparison_tools.py
│   │   │   │   ├── test_cost_explorer_operations.py
│   │   │   │   ├── test_cost_explorer_tools.py
│   │   │   │   ├── test_cost_optimization_hub_helpers.py
│   │   │   │   ├── test_cost_optimization_hub_tools.py
│   │   │   │   ├── test_free_tier_usage_tools_new.py
│   │   │   │   ├── test_recommendation_details_tools.py
│   │   │   │   ├── test_ri_performance_tools.py
│   │   │   │   ├── test_sp_performance_tools.py
│   │   │   │   ├── test_storage_lens_tools.py
│   │   │   │   └── test_unified_sql_tools.py
│   │   │   └── utilities
│   │   │       ├── test_aws_service_base.py
│   │   │       └── test_sql_utils.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── ccapi-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── ccapi_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── aws_client.py
│   │   │       ├── cloud_control_utils.py
│   │   │       ├── context.py
│   │   │       ├── errors.py
│   │   │       ├── iac_generator.py
│   │   │       ├── impl
│   │   │       │   ├── __init__.py
│   │   │       │   ├── tools
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── explanation.py
│   │   │       │   │   ├── infrastructure_generation.py
│   │   │       │   │   ├── resource_operations.py
│   │   │       │   │   ├── security_scanning.py
│   │   │       │   │   └── session_management.py
│   │   │       │   └── utils
│   │   │       │       ├── __init__.py
│   │   │       │       └── validation.py
│   │   │       ├── infrastructure_generator.py
│   │   │       ├── models
│   │   │       │   ├── __init__.py
│   │   │       │   └── models.py
│   │   │       ├── schema_manager.py
│   │   │       ├── server.py
│   │   │       └── static
│   │   │           └── __init__.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_aws_client.py
│   │   │   ├── test_checkov_install.py
│   │   │   ├── test_cloud_control_utils.py
│   │   │   ├── test_context.py
│   │   │   ├── test_errors.py
│   │   │   ├── test_explanation.py
│   │   │   ├── test_iac_generator.py
│   │   │   ├── test_infrastructure_generation.py
│   │   │   ├── test_infrastructure_generator.py
│   │   │   ├── test_models.py
│   │   │   ├── test_resource_operations.py
│   │   │   ├── test_schema_manager.py
│   │   │   ├── test_security_scanning.py
│   │   │   ├── test_server.py
│   │   │   ├── test_session_management.py
│   │   │   └── test_validation.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── cdk-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── cdk_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── core
│   │   │       │   ├── __init__.py
│   │   │       │   ├── resources.py
│   │   │       │   ├── search_utils.py
│   │   │       │   ├── server.py
│   │   │       │   └── tools.py
│   │   │       ├── data
│   │   │       │   ├── __init__.py
│   │   │       │   ├── cdk_nag_parser.py
│   │   │       │   ├── construct_descriptions.py
│   │   │       │   ├── genai_cdk_loader.py
│   │   │       │   ├── lambda_layer_parser.py
│   │   │       │   ├── lambda_powertools_loader.py
│   │   │       │   ├── schema_generator.py
│   │   │       │   └── solutions_constructs_parser.py
│   │   │       ├── server.py
│   │   │       └── static
│   │   │           ├── __init__.py
│   │   │           ├── CDK_GENERAL_GUIDANCE.md
│   │   │           ├── CDK_NAG_GUIDANCE.md
│   │   │           └── lambda_powertools
│   │   │               ├── bedrock.md
│   │   │               ├── cdk.md
│   │   │               ├── dependencies.md
│   │   │               ├── index.md
│   │   │               ├── insights.md
│   │   │               ├── logging.md
│   │   │               ├── metrics.md
│   │   │               └── tracing.md
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── core
│   │   │   │   ├── test_resources_enhanced.py
│   │   │   │   ├── test_resources.py
│   │   │   │   ├── test_search_utils.py
│   │   │   │   ├── test_server.py
│   │   │   │   └── test_tools.py
│   │   │   └── data
│   │   │       ├── test_cdk_nag_parser.py
│   │   │       ├── test_genai_cdk_loader.py
│   │   │       ├── test_lambda_powertools_loader.py
│   │   │       ├── test_schema_generator.py
│   │   │       └── test_solutions_constructs_parser.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── cfn-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── cfn_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── aws_client.py
│   │   │       ├── cloud_control_utils.py
│   │   │       ├── context.py
│   │   │       ├── errors.py
│   │   │       ├── iac_generator.py
│   │   │       ├── schema_manager.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_aws_client.py
│   │   │   ├── test_cloud_control_utils.py
│   │   │   ├── test_errors.py
│   │   │   ├── test_iac_generator.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_schema_manager.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── cloudtrail-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── cloudtrail_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── common.py
│   │   │       ├── models.py
│   │   │       ├── server.py
│   │   │       └── tools.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_models.py
│   │   │   ├── test_server.py
│   │   │   └── test_tools.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── cloudwatch-appsignals-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── cloudwatch_appsignals_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── audit_presentation_utils.py
│   │   │       ├── audit_utils.py
│   │   │       ├── aws_clients.py
│   │   │       ├── canary_utils.py
│   │   │       ├── server.py
│   │   │       ├── service_audit_utils.py
│   │   │       ├── service_tools.py
│   │   │       ├── sli_report_client.py
│   │   │       ├── slo_tools.py
│   │   │       ├── trace_tools.py
│   │   │       └── utils.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── conftest.py
│   │   │   ├── test_audit_presentation_utils.py
│   │   │   ├── test_audit_utils.py
│   │   │   ├── test_aws_profile.py
│   │   │   ├── test_canary_utils.py
│   │   │   ├── test_initialization.py
│   │   │   ├── test_server_audit_functions.py
│   │   │   ├── test_server_audit_tools.py
│   │   │   ├── test_server.py
│   │   │   ├── test_service_audit_utils.py
│   │   │   ├── test_service_tools_operations.py
│   │   │   ├── test_sli_report_client.py
│   │   │   ├── test_slo_tools.py
│   │   │   └── test_utils.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── cloudwatch-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── cloudwatch_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── cloudwatch_alarms
│   │   │       │   ├── models.py
│   │   │       │   └── tools.py
│   │   │       ├── cloudwatch_logs
│   │   │       │   ├── models.py
│   │   │       │   └── tools.py
│   │   │       ├── cloudwatch_metrics
│   │   │       │   ├── data
│   │   │       │   │   └── metric_metadata.json
│   │   │       │   ├── models.py
│   │   │       │   └── tools.py
│   │   │       ├── common.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── cloudwatch_alarms
│   │   │   │   ├── test_active_alarms.py
│   │   │   │   ├── test_alarm_history_integration.py
│   │   │   │   ├── test_alarm_history.py
│   │   │   │   └── test_alarms_error_handling.py
│   │   │   ├── cloudwatch_logs
│   │   │   │   ├── test_logs_error_handling.py
│   │   │   │   ├── test_logs_models.py
│   │   │   │   └── test_logs_server.py
│   │   │   ├── cloudwatch_metrics
│   │   │   │   ├── test_metrics_error_handling.py
│   │   │   │   ├── test_metrics_models.py
│   │   │   │   ├── test_metrics_server.py
│   │   │   │   └── test_validation_error.py
│   │   │   ├── test_common_and_server.py
│   │   │   ├── test_init.py
│   │   │   └── test_main.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── code-doc-gen-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── code_doc_gen_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── server.py
│   │   │       └── utils
│   │   │           ├── doc_generator.py
│   │   │           ├── models.py
│   │   │           ├── repomix_manager.py
│   │   │           └── templates.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_doc_generator_edge_cases.py
│   │   │   ├── test_doc_generator.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_repomix_manager_scenarios.py
│   │   │   ├── test_repomix_manager.py
│   │   │   ├── test_repomix_statistics.py
│   │   │   ├── test_server_extended.py
│   │   │   ├── test_server.py
│   │   │   └── test_templates.py
│   │   └── uv.lock
│   ├── core-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── core_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── server.py
│   │   │       └── static
│   │   │           ├── __init__.py
│   │   │           └── PROMPT_UNDERSTANDING.md
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── README.md
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_response_types.py
│   │   │   ├── test_server.py
│   │   │   └── test_static.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── cost-explorer-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── cost_explorer_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── comparison_handler.py
│   │   │       ├── constants.py
│   │   │       ├── cost_usage_handler.py
│   │   │       ├── forecasting_handler.py
│   │   │       ├── helpers.py
│   │   │       ├── metadata_handler.py
│   │   │       ├── models.py
│   │   │       ├── server.py
│   │   │       └── utility_handler.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_comparison_handler.py
│   │   │   ├── test_cost_usage_handler.py
│   │   │   ├── test_forecasting_handler.py
│   │   │   ├── test_helpers.py
│   │   │   ├── test_metadata_handler.py
│   │   │   ├── test_models.py
│   │   │   ├── test_server.py
│   │   │   └── test_utility_handler.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── documentdb-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   └── documentdb_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── analytic_tools.py
│   │   │       ├── config.py
│   │   │       ├── connection_tools.py
│   │   │       ├── db_management_tools.py
│   │   │       ├── query_tools.py
│   │   │       ├── server.py
│   │   │       └── write_tools.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── conftest.py
│   │   │   ├── test_analytic_tools.py
│   │   │   ├── test_connection_tools.py
│   │   │   ├── test_db_management_tools.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_query_tools.py
│   │   │   └── test_write_tools.py
│   │   └── uv.lock
│   ├── dynamodb-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── dynamodb_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── common.py
│   │   │       ├── database_analysis_queries.py
│   │   │       ├── database_analyzers.py
│   │   │       ├── prompts
│   │   │       │   └── dynamodb_architect.md
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── evals
│   │   │   │   ├── dynamic_evaluators.py
│   │   │   │   ├── evaluation_registry.py
│   │   │   │   ├── logging_config.py
│   │   │   │   ├── multiturn_evaluator.py
│   │   │   │   ├── README.md
│   │   │   │   ├── scenarios.py
│   │   │   │   └── test_dspy_evals.py
│   │   │   ├── test_dynamodb_server.py
│   │   │   └── test_source_db_integration.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── ecs-mcp-server
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── ecs_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── api
│   │   │       │   ├── __init__.py
│   │   │       │   ├── containerize.py
│   │   │       │   ├── delete.py
│   │   │       │   ├── ecs_troubleshooting.py
│   │   │       │   ├── infrastructure.py
│   │   │       │   ├── resource_management.py
│   │   │       │   ├── status.py
│   │   │       │   └── troubleshooting_tools
│   │   │       │       ├── __init__.py
│   │   │       │       ├── detect_image_pull_failures.py
│   │   │       │       ├── fetch_cloudformation_status.py
│   │   │       │       ├── fetch_network_configuration.py
│   │   │       │       ├── fetch_service_events.py
│   │   │       │       ├── fetch_task_failures.py
│   │   │       │       ├── fetch_task_logs.py
│   │   │       │       ├── get_ecs_troubleshooting_guidance.py
│   │   │       │       └── utils.py
│   │   │       ├── main.py
│   │   │       ├── modules
│   │   │       │   ├── __init__.py
│   │   │       │   ├── aws_knowledge_proxy.py
│   │   │       │   ├── containerize.py
│   │   │       │   ├── delete.py
│   │   │       │   ├── deployment_status.py
│   │   │       │   ├── infrastructure.py
│   │   │       │   ├── resource_management.py
│   │   │       │   └── troubleshooting.py
│   │   │       ├── templates
│   │   │       │   ├── ecr_infrastructure.json
│   │   │       │   └── ecs_infrastructure.json
│   │   │       └── utils
│   │   │           ├── arn_parser.py
│   │   │           ├── aws.py
│   │   │           ├── config.py
│   │   │           ├── docker.py
│   │   │           ├── security.py
│   │   │           ├── templates.py
│   │   │           └── time_utils.py
│   │   ├── DEVELOPMENT.md
│   │   ├── pyproject.toml
│   │   ├── pyrightconfig.json
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── integ
│   │   │   │   └── mcp-inspector
│   │   │   │       ├── .gitignore
│   │   │   │       ├── README.md
│   │   │   │       ├── run-tests.sh
│   │   │   │       └── scenarios
│   │   │   │           ├── 01_comprehensive_troubleshooting
│   │   │   │           │   ├── 01_create.sh
│   │   │   │           │   ├── 02_validate.sh
│   │   │   │           │   ├── 03_cleanup.sh
│   │   │   │           │   ├── description.txt
│   │   │   │           │   └── utils
│   │   │   │           │       ├── mcp_helpers.sh
│   │   │   │           │       └── validation_helpers.sh
│   │   │   │           └── 02_test_knowledge_proxy_tools
│   │   │   │               ├── 01_create.sh
│   │   │   │               ├── 02_validate.sh
│   │   │   │               ├── 03_cleanup.sh
│   │   │   │               ├── description.txt
│   │   │   │               └── utils
│   │   │   │                   ├── knowledge_validation_helpers.sh
│   │   │   │                   └── mcp_knowledge_helpers.sh
│   │   │   ├── llm_testing
│   │   │   │   ├── invalid_cfn_template.yaml
│   │   │   │   ├── README.md
│   │   │   │   ├── run_tests.sh
│   │   │   │   ├── scenarios
│   │   │   │   │   ├── 01_cloudformation_failure
│   │   │   │   │   │   ├── 01_create.sh
│   │   │   │   │   │   ├── 02_validate.sh
│   │   │   │   │   │   ├── 03_prompts.txt
│   │   │   │   │   │   ├── 04_evaluation.md
│   │   │   │   │   │   ├── 05_cleanup.sh
│   │   │   │   │   │   └── description.txt
│   │   │   │   │   ├── 02_service_failure
│   │   │   │   │   │   ├── 01_create.sh
│   │   │   │   │   │   ├── 02_validate.sh
│   │   │   │   │   │   ├── 03_prompts.txt
│   │   │   │   │   │   ├── 04_evaluation.md
│   │   │   │   │   │   ├── 05_cleanup.sh
│   │   │   │   │   │   └── description.txt
│   │   │   │   │   ├── 03_task_exit_failure
│   │   │   │   │   │   ├── 01_create.sh
│   │   │   │   │   │   ├── 02_validate.sh
│   │   │   │   │   │   ├── 03_prompts.txt
│   │   │   │   │   │   ├── 04_evaluation.md
│   │   │   │   │   │   ├── 05_cleanup.sh
│   │   │   │   │   │   └── description.txt
│   │   │   │   │   ├── 04_network_configuration_failure
│   │   │   │   │   │   ├── 01_create.sh
│   │   │   │   │   │   ├── 02_validate.sh
│   │   │   │   │   │   ├── 03_prompts.txt
│   │   │   │   │   │   ├── 05_cleanup.sh
│   │   │   │   │   │   └── description.txt
│   │   │   │   │   ├── 05_resource_constraint_failure
│   │   │   │   │   │   ├── 01_create.sh
│   │   │   │   │   │   ├── 02_validate.sh
│   │   │   │   │   │   ├── 03_prompts.txt
│   │   │   │   │   │   ├── 05_cleanup.sh
│   │   │   │   │   │   └── description.txt
│   │   │   │   │   └── 06_load_balancer_failure
│   │   │   │   │       ├── 01_create.sh
│   │   │   │   │       ├── 02_validate.sh
│   │   │   │   │       ├── 03_prompts.txt
│   │   │   │   │       ├── 05_cleanup.sh
│   │   │   │   │       └── description.txt
│   │   │   │   ├── SCRIPT_IMPROVEMENTS.md
│   │   │   │   └── utils
│   │   │   │       ├── aws_helpers.sh
│   │   │   │       └── evaluation_template.md
│   │   │   └── unit
│   │   │       ├── __init__.py
│   │   │       ├── api
│   │   │       │   ├── conftest.py
│   │   │       │   ├── test_delete_api.py
│   │   │       │   ├── test_ecs_troubleshooting.py
│   │   │       │   ├── test_resource_management_api.py
│   │   │       │   └── troubleshooting_tools
│   │   │       │       └── test_fetch_network_configuration.py
│   │   │       ├── conftest.py
│   │   │       ├── modules
│   │   │       │   ├── test_aws_knowledge_proxy.py
│   │   │       │   └── test_resource_management_module.py
│   │   │       ├── test_aws_role_utils.py
│   │   │       ├── test_aws_utils.py
│   │   │       ├── test_containerize.py
│   │   │       ├── test_delete.py
│   │   │       ├── test_docker_utils.py
│   │   │       ├── test_docker_with_role.py
│   │   │       ├── test_image_pull_failure_extended.py
│   │   │       ├── test_image_pull_failure.py
│   │   │       ├── test_infrastructure_role.py
│   │   │       ├── test_infrastructure.py
│   │   │       ├── test_integration.py
│   │   │       ├── test_main.py
│   │   │       ├── test_resource_management_api_operation.py
│   │   │       ├── test_resource_management_tool.py
│   │   │       ├── test_resource_management.py
│   │   │       ├── test_security_integration.py
│   │   │       ├── test_status_pytest.py
│   │   │       ├── test_status.py
│   │   │       ├── troubleshooting_tools
│   │   │       │   ├── __init__.py
│   │   │       │   ├── conftest.py
│   │   │       │   ├── test_detect_image_pull_failures.py
│   │   │       │   ├── test_fetch_cloudformation_status.py
│   │   │       │   ├── test_fetch_service_events.py
│   │   │       │   ├── test_fetch_task_failures.py
│   │   │       │   ├── test_fetch_task_logs.py
│   │   │       │   ├── test_get_ecs_troubleshooting_guidance.py
│   │   │       │   ├── test_is_ecr_image_security.py
│   │   │       │   └── test_utils.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── async_test_utils.py
│   │   │           ├── test_arn_parser.py
│   │   │           ├── test_config.py
│   │   │           ├── test_docker.py
│   │   │           ├── test_response_sanitization.py
│   │   │           ├── test_security_extended.py
│   │   │           ├── test_security.py
│   │   │           ├── test_templates.py
│   │   │           └── test_time_utils.py
│   │   └── uv.lock
│   ├── eks-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── eks_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── aws_helper.py
│   │   │       ├── cloudwatch_handler.py
│   │   │       ├── cloudwatch_metrics_guidance_handler.py
│   │   │       ├── consts.py
│   │   │       ├── data
│   │   │       │   └── eks_cloudwatch_metrics_guidance.json
│   │   │       ├── eks_kb_handler.py
│   │   │       ├── eks_stack_handler.py
│   │   │       ├── iam_handler.py
│   │   │       ├── insights_handler.py
│   │   │       ├── k8s_apis.py
│   │   │       ├── k8s_client_cache.py
│   │   │       ├── k8s_handler.py
│   │   │       ├── logging_helper.py
│   │   │       ├── models.py
│   │   │       ├── scripts
│   │   │       │   └── update_eks_cloudwatch_metrics_guidance.py
│   │   │       ├── server.py
│   │   │       ├── templates
│   │   │       │   ├── eks-templates
│   │   │       │   │   └── eks-with-vpc.yaml
│   │   │       │   └── k8s-templates
│   │   │       │       ├── deployment.yaml
│   │   │       │       └── service.yaml
│   │   │       └── vpc_config_handler.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_aws_helper.py
│   │   │   ├── test_cloudwatch_handler.py
│   │   │   ├── test_cloudwatch_metrics_guidance_handler.py
│   │   │   ├── test_eks_kb_handler.py
│   │   │   ├── test_eks_stack_handler.py
│   │   │   ├── test_iam_handler.py
│   │   │   ├── test_init.py
│   │   │   ├── test_insights_handler.py
│   │   │   ├── test_k8s_apis.py
│   │   │   ├── test_k8s_client_cache.py
│   │   │   ├── test_k8s_handler.py
│   │   │   ├── test_logging_helper.py
│   │   │   ├── test_main.py
│   │   │   ├── test_models.py
│   │   │   ├── test_server.py
│   │   │   └── test_vpc_config_handler.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── elasticache-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── elasticache_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── common
│   │   │       │   ├── __init__.py
│   │   │       │   ├── connection.py
│   │   │       │   ├── decorators.py
│   │   │       │   └── server.py
│   │   │       ├── context.py
│   │   │       ├── main.py
│   │   │       └── tools
│   │   │           ├── __init__.py
│   │   │           ├── cc
│   │   │           │   ├── __init__.py
│   │   │           │   ├── connect.py
│   │   │           │   ├── create.py
│   │   │           │   ├── delete.py
│   │   │           │   ├── describe.py
│   │   │           │   ├── modify.py
│   │   │           │   ├── parsers.py
│   │   │           │   └── processors.py
│   │   │           ├── ce
│   │   │           │   ├── __init__.py
│   │   │           │   └── get_cost_and_usage.py
│   │   │           ├── cw
│   │   │           │   ├── __init__.py
│   │   │           │   └── get_metric_statistics.py
│   │   │           ├── cwlogs
│   │   │           │   ├── __init__.py
│   │   │           │   ├── create_log_group.py
│   │   │           │   ├── describe_log_groups.py
│   │   │           │   ├── describe_log_streams.py
│   │   │           │   ├── filter_log_events.py
│   │   │           │   └── get_log_events.py
│   │   │           ├── firehose
│   │   │           │   ├── __init__.py
│   │   │           │   └── list_delivery_streams.py
│   │   │           ├── misc
│   │   │           │   ├── __init__.py
│   │   │           │   ├── batch_apply_update_action.py
│   │   │           │   ├── batch_stop_update_action.py
│   │   │           │   ├── describe_cache_engine_versions.py
│   │   │           │   ├── describe_engine_default_parameters.py
│   │   │           │   ├── describe_events.py
│   │   │           │   └── describe_service_updates.py
│   │   │           ├── rg
│   │   │           │   ├── __init__.py
│   │   │           │   ├── complete_migration.py
│   │   │           │   ├── connect.py
│   │   │           │   ├── create.py
│   │   │           │   ├── delete.py
│   │   │           │   ├── describe.py
│   │   │           │   ├── modify.py
│   │   │           │   ├── parsers.py
│   │   │           │   ├── processors.py
│   │   │           │   ├── start_migration.py
│   │   │           │   └── test_migration.py
│   │   │           └── serverless
│   │   │               ├── __init__.py
│   │   │               ├── connect.py
│   │   │               ├── create.py
│   │   │               ├── delete.py
│   │   │               ├── describe.py
│   │   │               ├── models.py
│   │   │               └── modify.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_connection.py
│   │   │   ├── test_decorators.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── tools
│   │   │       ├── cc
│   │   │       │   ├── __init__.py
│   │   │       │   ├── test_connect_additional.py
│   │   │       │   ├── test_connect_coverage_additional.py
│   │   │       │   ├── test_connect_coverage.py
│   │   │       │   ├── test_connect.py
│   │   │       │   ├── test_create_additional.py
│   │   │       │   ├── test_create.py
│   │   │       │   ├── test_delete.py
│   │   │       │   ├── test_describe.py
│   │   │       │   ├── test_modify.py
│   │   │       │   ├── test_parsers.py
│   │   │       │   └── test_processors.py
│   │   │       ├── ce
│   │   │       │   ├── __init__.py
│   │   │       │   └── test_get_cost_and_usage.py
│   │   │       ├── cw
│   │   │       │   └── test_get_metric_statistics.py
│   │   │       ├── cwlogs
│   │   │       │   ├── __init__.py
│   │   │       │   ├── test_create_log_group.py
│   │   │       │   ├── test_describe_log_groups.py
│   │   │       │   ├── test_describe_log_streams.py
│   │   │       │   ├── test_filter_log_events.py
│   │   │       │   └── test_get_log_events.py
│   │   │       ├── firehose
│   │   │       │   └── test_list_delivery_streams.py
│   │   │       ├── misc
│   │   │       │   ├── __init__.py
│   │   │       │   ├── test_batch_apply_update_action.py
│   │   │       │   ├── test_batch_stop_update_action.py
│   │   │       │   ├── test_describe_cache_engine_versions.py
│   │   │       │   ├── test_describe_engine_default_parameters.py
│   │   │       │   ├── test_describe_events.py
│   │   │       │   └── test_describe_service_updates.py
│   │   │       ├── rg
│   │   │       │   ├── __init__.py
│   │   │       │   ├── test_complete_migration.py
│   │   │       │   ├── test_connect_additional.py
│   │   │       │   ├── test_connect_coverage_additional.py
│   │   │       │   ├── test_connect_optional_fields.py
│   │   │       │   ├── test_connect_partial_coverage.py
│   │   │       │   ├── test_connect.py
│   │   │       │   ├── test_create.py
│   │   │       │   ├── test_delete.py
│   │   │       │   ├── test_describe.py
│   │   │       │   ├── test_modify.py
│   │   │       │   ├── test_parsers.py
│   │   │       │   ├── test_processors.py
│   │   │       │   ├── test_start_migration.py
│   │   │       │   └── test_test_migration.py
│   │   │       └── serverless
│   │   │           ├── test_connect_additional.py
│   │   │           ├── test_connect_coverage_additional.py
│   │   │           ├── test_connect_optional_fields.py
│   │   │           ├── test_connect.py
│   │   │           ├── test_create.py
│   │   │           ├── test_delete.py
│   │   │           ├── test_describe.py
│   │   │           └── test_modify.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── finch-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── finch_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── consts.py
│   │   │       ├── models.py
│   │   │       ├── server.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── build.py
│   │   │           ├── common.py
│   │   │           ├── ecr.py
│   │   │           ├── push.py
│   │   │           └── vm.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_cli_flags.py
│   │   │   ├── test_logging_configuration.py
│   │   │   ├── test_server.py
│   │   │   ├── test_utils_build.py
│   │   │   ├── test_utils_common.py
│   │   │   ├── test_utils_ecr.py
│   │   │   ├── test_utils_push.py
│   │   │   └── test_utils_vm.py
│   │   └── uv.lock
│   ├── frontend-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── frontend_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── server.py
│   │   │       ├── static
│   │   │       │   └── react
│   │   │       │       ├── essential-knowledge.md
│   │   │       │       └── troubleshooting.md
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           └── file_utils.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_file_utils.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── test_server.py
│   │   └── uv.lock
│   ├── git-repo-research-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── git_repo_research_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── defaults.py
│   │   │       ├── embeddings.py
│   │   │       ├── github_search.py
│   │   │       ├── indexer.py
│   │   │       ├── models.py
│   │   │       ├── repository.py
│   │   │       ├── search.py
│   │   │       ├── server.py
│   │   │       └── utils.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_errors_repository.py
│   │   │   ├── test_github_search_edge_cases.py
│   │   │   ├── test_graphql_github_search.py
│   │   │   ├── test_local_repository.py
│   │   │   ├── test_repository_utils.py
│   │   │   ├── test_rest_github_search.py
│   │   │   ├── test_search.py
│   │   │   ├── test_server.py
│   │   │   └── test_url_repository.py
│   │   └── uv.lock
│   ├── healthlake-mcp-server
│   │   ├── .dockerignore
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── healthlake_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── fhir_operations.py
│   │   │       ├── main.py
│   │   │       ├── models.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── CONTRIBUTING.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── examples
│   │   │   ├── mcp_config.json
│   │   │   └── README.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── conftest.py
│   │   │   ├── test_fhir_client_comprehensive.py
│   │   │   ├── test_fhir_error_scenarios.py
│   │   │   ├── test_fhir_operations.py
│   │   │   ├── test_integration_mock_based.py
│   │   │   ├── test_main_edge_cases.py
│   │   │   ├── test_main.py
│   │   │   ├── test_mcp_integration_coverage.py
│   │   │   ├── test_models_edge_cases.py
│   │   │   ├── test_models.py
│   │   │   ├── test_readonly_mode.py
│   │   │   ├── test_server_core.py
│   │   │   ├── test_server_error_handling.py
│   │   │   ├── test_server_mcp_handlers.py
│   │   │   ├── test_server_toolhandler.py
│   │   │   └── test_server_validation.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── iam-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── iam_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── aws_client.py
│   │   │       ├── context.py
│   │   │       ├── errors.py
│   │   │       ├── models.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── DESIGN_COMPLIANCE.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── examples
│   │   │   ├── get_policy_document_example.py
│   │   │   └── inline_policy_demo.py
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── test_context.py
│   │   │   ├── test_errors.py
│   │   │   ├── test_inline_policies.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── lambda-tool-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── lambda_tool_mcp_server
│   │   │       ├── __init__.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── examples
│   │   │   ├── README.md
│   │   │   └── sample_functions
│   │   │       ├── customer-create
│   │   │       │   └── app.py
│   │   │       ├── customer-id-from-email
│   │   │       │   └── app.py
│   │   │       ├── customer-info-from-id
│   │   │       │   └── app.py
│   │   │       └── template.yml
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── conftest.py
│   │   │   ├── README.md
│   │   │   ├── test_format_lambda_response.py
│   │   │   ├── test_integration_coverage.py
│   │   │   ├── test_integration.py
│   │   │   ├── test_register_lambda_functions.py
│   │   │   ├── test_schema_integration.py
│   │   │   ├── test_server_coverage_additional.py
│   │   │   ├── test_server_coverage.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── mcp-lambda-handler
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   └── mcp_lambda_handler
│   │   │       ├── __init__.py
│   │   │       ├── mcp_lambda_handler.py
│   │   │       ├── session.py
│   │   │       └── types.py
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   └── test_lambda_handler.py
│   │   └── uv.lock
│   ├── memcached-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── memcached_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── common
│   │   │       │   ├── config.py
│   │   │       │   ├── connection.py
│   │   │       │   └── server.py
│   │   │       ├── context.py
│   │   │       ├── main.py
│   │   │       └── tools
│   │   │           └── cache.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── ELASTICACHECONNECT.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_cache_readonly.py
│   │   │   ├── test_cache.py
│   │   │   ├── test_connection.py
│   │   │   ├── test_init.py
│   │   │   └── test_main.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── mysql-mcp-server
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── mysql_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── connection
│   │   │       │   ├── __init__.py
│   │   │       │   ├── abstract_db_connection.py
│   │   │       │   ├── asyncmy_pool_connection.py
│   │   │       │   ├── db_connection_singleton.py
│   │   │       │   └── rds_data_api_connection.py
│   │   │       ├── mutable_sql_detector.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── conftest.py
│   │   │   ├── test_abstract_db_connection.py
│   │   │   ├── test_asyncmy_pool_connection.py
│   │   │   ├── test_db_connection_singleton.py
│   │   │   ├── test_rds_data_api_connection.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── nova-canvas-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── nova_canvas_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── consts.py
│   │   │       ├── models.py
│   │   │       ├── novacanvas.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── conftest.py
│   │   │   ├── README.md
│   │   │   ├── test_models.py
│   │   │   ├── test_novacanvas.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── openapi-mcp-server
│   │   ├── .coveragerc
│   │   ├── .dockerignore
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── AUTHENTICATION.md
│   │   ├── AWS_BEST_PRACTICES.md
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── openapi_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── api
│   │   │       │   ├── __init__.py
│   │   │       │   └── config.py
│   │   │       ├── auth
│   │   │       │   ├── __init__.py
│   │   │       │   ├── api_key_auth.py
│   │   │       │   ├── auth_cache.py
│   │   │       │   ├── auth_errors.py
│   │   │       │   ├── auth_factory.py
│   │   │       │   ├── auth_protocol.py
│   │   │       │   ├── auth_provider.py
│   │   │       │   ├── base_auth.py
│   │   │       │   ├── basic_auth.py
│   │   │       │   ├── bearer_auth.py
│   │   │       │   ├── cognito_auth.py
│   │   │       │   └── register.py
│   │   │       ├── patch
│   │   │       │   └── __init__.py
│   │   │       ├── prompts
│   │   │       │   ├── __init__.py
│   │   │       │   ├── generators
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── operation_prompts.py
│   │   │       │   │   └── workflow_prompts.py
│   │   │       │   ├── models.py
│   │   │       │   └── prompt_manager.py
│   │   │       ├── server.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── cache_provider.py
│   │   │           ├── config.py
│   │   │           ├── error_handler.py
│   │   │           ├── http_client.py
│   │   │           ├── metrics_provider.py
│   │   │           ├── openapi_validator.py
│   │   │           └── openapi.py
│   │   ├── CHANGELOG.md
│   │   ├── DEPLOYMENT.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── OBSERVABILITY.md
│   │   ├── pyproject.toml
│   │   ├── pyrightconfig.json
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── api
│   │   │   │   └── test_config.py
│   │   │   ├── auth
│   │   │   │   ├── test_api_key_auth.py
│   │   │   │   ├── test_auth_cache.py
│   │   │   │   ├── test_auth_errors.py
│   │   │   │   ├── test_auth_factory_caching.py
│   │   │   │   ├── test_auth_factory_coverage.py
│   │   │   │   ├── test_auth_factory.py
│   │   │   │   ├── test_auth_protocol_additional.py
│   │   │   │   ├── test_auth_protocol_boost.py
│   │   │   │   ├── test_auth_protocol_coverage.py
│   │   │   │   ├── test_auth_protocol_extended.py
│   │   │   │   ├── test_auth_protocol_improved.py
│   │   │   │   ├── test_auth_protocol.py
│   │   │   │   ├── test_auth_provider_additional.py
│   │   │   │   ├── test_base_auth_coverage.py
│   │   │   │   ├── test_base_auth.py
│   │   │   │   ├── test_basic_auth.py
│   │   │   │   ├── test_bearer_auth.py
│   │   │   │   ├── test_cognito_auth_additional_coverage.py
│   │   │   │   ├── test_cognito_auth_boost_coverage.py
│   │   │   │   ├── test_cognito_auth_client_credentials.py
│   │   │   │   ├── test_cognito_auth_coverage_boost.py
│   │   │   │   ├── test_cognito_auth_exceptions.py
│   │   │   │   ├── test_cognito_auth.py
│   │   │   │   ├── test_register_coverage.py
│   │   │   │   └── test_register.py
│   │   │   ├── prompts
│   │   │   │   ├── standalone
│   │   │   │   │   ├── test_operation_prompt.py
│   │   │   │   │   ├── test_prompt_arguments.py
│   │   │   │   │   └── test_secure_operation_prompt.py
│   │   │   │   ├── test_mcp_prompt_manager_integration.py
│   │   │   │   ├── test_mcp_prompt_manager.py
│   │   │   │   ├── test_models_dict_method.py
│   │   │   │   ├── test_operation_prompts_extended.py
│   │   │   │   ├── test_prompt_manager_additional.py
│   │   │   │   ├── test_prompt_manager_comprehensive.py
│   │   │   │   ├── test_prompt_manager_coverage.py
│   │   │   │   └── test_prompt_registration.py
│   │   │   ├── README.md
│   │   │   ├── test_api_name.py
│   │   │   ├── test_cache_coverage_89.py
│   │   │   ├── test_client.py
│   │   │   ├── test_coverage_boost.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main_extended.py
│   │   │   ├── test_main.py
│   │   │   ├── test_openapi_coverage_89.py
│   │   │   ├── test_server_auth_errors.py
│   │   │   ├── test_server_coverage_boost_2.py
│   │   │   ├── test_server_coverage_boost.py
│   │   │   ├── test_server_exception_handling.py
│   │   │   ├── test_server_extended.py
│   │   │   ├── test_server_httpx_version.py
│   │   │   ├── test_server_part1.py
│   │   │   ├── test_server_route_logging.py
│   │   │   ├── test_server_signal_handlers.py
│   │   │   ├── test_server.py
│   │   │   └── utils
│   │   │       ├── test_cache_provider.py
│   │   │       ├── test_error_handler_boost.py
│   │   │       ├── test_error_handler_extended.py
│   │   │       ├── test_error_handler_fix.py
│   │   │       ├── test_error_handler.py
│   │   │       ├── test_http_client_comprehensive.py
│   │   │       ├── test_http_client_extended.py
│   │   │       ├── test_http_client_extended2.py
│   │   │       ├── test_http_client_import_error.py
│   │   │       ├── test_http_client.py
│   │   │       ├── test_metrics_provider_decorators.py
│   │   │       ├── test_metrics_provider_extended2.py
│   │   │       ├── test_metrics_provider_prometheus.py
│   │   │       ├── test_metrics_provider.py
│   │   │       ├── test_openapi_validator.py
│   │   │       └── test_openapi.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── postgres-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── postgres_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── connection
│   │   │       │   ├── __init__.py
│   │   │       │   ├── abstract_db_connection.py
│   │   │       │   ├── db_connection_singleton.py
│   │   │       │   ├── psycopg_pool_connection.py
│   │   │       │   └── rds_api_connection.py
│   │   │       ├── mutable_sql_detector.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── conftest.py
│   │   │   ├── test_psycopg_connector.py
│   │   │   ├── test_server.py
│   │   │   └── test_singleton.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── prometheus-mcp-server
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── prometheus_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── consts.py
│   │   │       ├── models.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── conftest.py
│   │   │   ├── test_aws_credentials.py
│   │   │   ├── test_config_manager.py
│   │   │   ├── test_consts.py
│   │   │   ├── test_coverage_gaps.py
│   │   │   ├── test_coverage_improvement.py
│   │   │   ├── test_final_coverage.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_models.py
│   │   │   ├── test_prometheus_client.py
│   │   │   ├── test_prometheus_connection.py
│   │   │   ├── test_security_validator.py
│   │   │   ├── test_server_coverage.py
│   │   │   ├── test_tools.py
│   │   │   └── test_workspace_config.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── redshift-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── redshift_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── consts.py
│   │   │       ├── models.py
│   │   │       ├── redshift.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_redshift.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── s3-tables-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── s3_tables_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── constants.py
│   │   │       ├── database.py
│   │   │       ├── engines
│   │   │       │   ├── __init__.py
│   │   │       │   └── pyiceberg.py
│   │   │       ├── file_processor
│   │   │       │   ├── __init__.py
│   │   │       │   ├── csv.py
│   │   │       │   ├── parquet.py
│   │   │       │   └── utils.py
│   │   │       ├── models.py
│   │   │       ├── namespaces.py
│   │   │       ├── resources.py
│   │   │       ├── s3_operations.py
│   │   │       ├── server.py
│   │   │       ├── table_buckets.py
│   │   │       ├── tables.py
│   │   │       └── utils.py
│   │   ├── CHANGELOG.md
│   │   ├── CONTEXT.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_csv.py
│   │   │   ├── test_database.py
│   │   │   ├── test_file_processor_utils.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_namespaces.py
│   │   │   ├── test_parquet.py
│   │   │   ├── test_pyiceberg.py
│   │   │   ├── test_resources.py
│   │   │   ├── test_s3_operations.py
│   │   │   ├── test_server.py
│   │   │   ├── test_table_buckets.py
│   │   │   ├── test_tables.py
│   │   │   └── test_utils.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── stepfunctions-tool-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── stepfunctions_tool_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── aws_helper.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── test_aws_helper.py
│   │   │   ├── test_create_state_machine_tool.py
│   │   │   ├── test_filter_state_machines_by_tag.py
│   │   │   ├── test_format_state_machine_response.py
│   │   │   ├── test_get_schema_arn_from_state_machine_arn.py
│   │   │   ├── test_get_schema_from_registry.py
│   │   │   ├── test_invoke_express_state_machine_impl.py
│   │   │   ├── test_invoke_standard_state_machine_impl.py
│   │   │   ├── test_main.py
│   │   │   ├── test_register_state_machines.py
│   │   │   ├── test_sanitize_tool_name.py
│   │   │   ├── test_server.py
│   │   │   └── test_validate_state_machine_name.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── syntheticdata-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── syntheticdata_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── pandas_interpreter.py
│   │   │       ├── server.py
│   │   │       └── storage
│   │   │           ├── __init__.py
│   │   │           ├── base.py
│   │   │           ├── loader.py
│   │   │           └── s3.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_constants.py
│   │   │   ├── test_pandas_interpreter.py
│   │   │   ├── test_server.py
│   │   │   └── test_storage
│   │   │       ├── __init__.py
│   │   │       ├── test_loader.py
│   │   │       └── test_s3.py
│   │   └── uv.lock
│   ├── terraform-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── terraform_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── impl
│   │   │       │   ├── resources
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── terraform_aws_provider_resources_listing.py
│   │   │       │   │   └── terraform_awscc_provider_resources_listing.py
│   │   │       │   └── tools
│   │   │       │       ├── __init__.py
│   │   │       │       ├── execute_terraform_command.py
│   │   │       │       ├── execute_terragrunt_command.py
│   │   │       │       ├── run_checkov_scan.py
│   │   │       │       ├── search_aws_provider_docs.py
│   │   │       │       ├── search_awscc_provider_docs.py
│   │   │       │       ├── search_specific_aws_ia_modules.py
│   │   │       │       ├── search_user_provided_module.py
│   │   │       │       └── utils.py
│   │   │       ├── models
│   │   │       │   ├── __init__.py
│   │   │       │   └── models.py
│   │   │       ├── scripts
│   │   │       │   ├── generate_aws_provider_resources.py
│   │   │       │   ├── generate_awscc_provider_resources.py
│   │   │       │   └── scrape_aws_terraform_best_practices.py
│   │   │       ├── server.py
│   │   │       └── static
│   │   │           ├── __init__.py
│   │   │           ├── AWS_PROVIDER_RESOURCES.md
│   │   │           ├── AWS_TERRAFORM_BEST_PRACTICES.md
│   │   │           ├── AWSCC_PROVIDER_RESOURCES.md
│   │   │           ├── MCP_INSTRUCTIONS.md
│   │   │           └── TERRAFORM_WORKFLOW_GUIDE.md
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── conftest.py
│   │   │   ├── README.md
│   │   │   ├── test_command_impl.py
│   │   │   ├── test_execute_terraform_command.py
│   │   │   ├── test_execute_terragrunt_command.py
│   │   │   ├── test_models.py
│   │   │   ├── test_parameter_annotations.py
│   │   │   ├── test_resources.py
│   │   │   ├── test_run_checkov_scan.py
│   │   │   ├── test_search_user_provided_module.py
│   │   │   ├── test_server.py
│   │   │   ├── test_tool_implementations.py
│   │   │   ├── test_utils_additional.py
│   │   │   └── test_utils.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── timestream-for-influxdb-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── timestream_for_influxdb_mcp_server
│   │   │       ├── __init__.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── valkey-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── valkey_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── common
│   │   │       │   ├── __init__.py
│   │   │       │   ├── config.py
│   │   │       │   ├── connection.py
│   │   │       │   └── server.py
│   │   │       ├── context.py
│   │   │       ├── main.py
│   │   │       ├── tools
│   │   │       │   ├── __init__.py
│   │   │       │   ├── bitmap.py
│   │   │       │   ├── hash.py
│   │   │       │   ├── hyperloglog.py
│   │   │       │   ├── json.py
│   │   │       │   ├── list.py
│   │   │       │   ├── misc.py
│   │   │       │   ├── server_management.py
│   │   │       │   ├── set.py
│   │   │       │   ├── sorted_set.py
│   │   │       │   ├── stream.py
│   │   │       │   └── string.py
│   │   │       └── version.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── ELASTICACHECONNECT.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_bitmap.py
│   │   │   ├── test_config.py
│   │   │   ├── test_connection.py
│   │   │   ├── test_hash.py
│   │   │   ├── test_hyperloglog.py
│   │   │   ├── test_init.py
│   │   │   ├── test_json_additional.py
│   │   │   ├── test_json_readonly.py
│   │   │   ├── test_json.py
│   │   │   ├── test_list_additional.py
│   │   │   ├── test_list_readonly.py
│   │   │   ├── test_list.py
│   │   │   ├── test_main.py
│   │   │   ├── test_misc.py
│   │   │   ├── test_server_management.py
│   │   │   ├── test_set_readonly.py
│   │   │   ├── test_set.py
│   │   │   ├── test_sorted_set_additional.py
│   │   │   ├── test_sorted_set_readonly.py
│   │   │   ├── test_sorted_set.py
│   │   │   ├── test_stream_additional.py
│   │   │   ├── test_stream_readonly.py
│   │   │   ├── test_stream.py
│   │   │   └── test_string.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   └── well-architected-security-mcp-server
│       ├── .python-version
│       ├── awslabs
│       │   └── well_architected_security_mcp_server
│       │       ├── __init__.py
│       │       ├── consts.py
│       │       ├── server.py
│       │       └── util
│       │           ├── __init__.py
│       │           ├── network_security.py
│       │           ├── prompt_utils.py
│       │           ├── resource_utils.py
│       │           ├── security_services.py
│       │           └── storage_security.py
│       ├── PROMPT_TEMPLATE.md
│       ├── pyproject.toml
│       ├── README.md
│       ├── tests
│       │   ├── __init__.py
│       │   ├── conftest.py
│       │   ├── README.md
│       │   ├── test_access_analyzer_fix.py
│       │   ├── test_network_security_additional.py
│       │   ├── test_network_security.py
│       │   ├── test_prompt_utils_coverage.py
│       │   ├── test_prompt_utils.py
│       │   ├── test_resource_utils_fix.py
│       │   ├── test_resource_utils.py
│       │   ├── test_security_services_additional.py
│       │   ├── test_security_services_coverage.py
│       │   ├── test_security_services.py
│       │   ├── test_server_additional.py
│       │   ├── test_server_coverage.py
│       │   ├── test_server_prompts.py
│       │   ├── test_server_security_findings.py
│       │   ├── test_server.py
│       │   ├── test_storage_security_additional.py
│       │   ├── test_storage_security_comprehensive.py
│       │   ├── test_storage_security_edge_cases.py
│       │   ├── test_storage_security_recommendations.py
│       │   ├── test_storage_security.py
│       │   └── test_user_agent_config.py
│       └── uv.lock
└── VIBE_CODING_TIPS_TRICKS.md
```
# Files
--------------------------------------------------------------------------------
/src/iam-mcp-server/awslabs/iam_mcp_server/server.py:
--------------------------------------------------------------------------------
```python
   1 | # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   2 | #
   3 | # Licensed under the Apache License, Version 2.0 (the "License");
   4 | # you may not use this file except in compliance with the License.
   5 | # You may obtain a copy of the License at
   6 | #
   7 | #     http://www.apache.org/licenses/LICENSE-2.0
   8 | #
   9 | # Unless required by applicable law or agreed to in writing, software
  10 | # distributed under the License is distributed on an "AS IS" BASIS,
  11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12 | # See the License for the specific language governing permissions and
  13 | # limitations under the License.
  14 | 
  15 | """AWS IAM MCP Server implementation."""
  16 | 
  17 | import argparse
  18 | import json
  19 | from awslabs.iam_mcp_server.aws_client import get_iam_client
  20 | from awslabs.iam_mcp_server.context import Context
  21 | from awslabs.iam_mcp_server.errors import IamClientError, IamValidationError, handle_iam_error
  22 | from awslabs.iam_mcp_server.models import (
  23 |     AccessKey,
  24 |     AttachedPolicy,
  25 |     CreateGroupResponse,
  26 |     CreateUserResponse,
  27 |     GroupDetailsResponse,
  28 |     GroupMembershipResponse,
  29 |     GroupPolicyAttachmentResponse,
  30 |     GroupsListResponse,
  31 |     IamGroup,
  32 |     IamUser,
  33 |     InlinePolicyListResponse,
  34 |     InlinePolicyResponse,
  35 |     ManagedPolicyResponse,
  36 |     UserDetailsResponse,
  37 |     UsersListResponse,
  38 | )
  39 | from loguru import logger
  40 | from mcp.server.fastmcp import FastMCP
  41 | from mcp.types import CallToolResult
  42 | from pydantic import Field
  43 | from typing import Any, Dict, List, Optional, Union
  44 | 
  45 | 
  46 | mcp = FastMCP(
  47 |     'awslabs.iam-mcp-server',
  48 |     instructions="""
  49 |     # AWS IAM MCP Server
  50 | 
  51 |     This MCP server provides comprehensive AWS Identity and Access Management (IAM) capabilities:
  52 | 
  53 |     ## Core Features:
  54 |     1. **User Management**: Create, list, update, and delete IAM users
  55 |     2. **Role Management**: Create, list, update, and delete IAM roles
  56 |     3. **Policy Management**: Create, list, update, and delete IAM policies
  57 |     4. **Inline Policy Management**: Full CRUD operations for user and role inline policies
  58 |     5. **Group Management**: Create, list, update, and delete IAM groups
  59 |     6. **Permission Management**: Attach/detach policies to users, roles, and groups
  60 |     7. **Access Key Management**: Create, list, and delete access keys for users
  61 |     8. **Security Analysis**: Analyze permissions, find unused resources, and security recommendations
  62 | 
  63 |     ## Inline Policy Management:
  64 |     - **User Inline Policies**: Create, retrieve, update, delete, and list inline policies for users
  65 |     - **Role Inline Policies**: Create, retrieve, update, delete, and list inline policies for roles
  66 |     - **Policy Validation**: Automatic JSON validation for policy documents
  67 |     - **Security Best Practices**: Built-in guidance for policy creation and management
  68 | 
  69 |     ## Security Best Practices:
  70 |     - Always follow the principle of least privilege
  71 |     - Regularly rotate access keys
  72 |     - Use roles instead of users for applications
  73 |     - Enable MFA where possible
  74 |     - Review and audit permissions regularly
  75 |     - Prefer managed policies over inline policies for reusable permissions
  76 |     - Test policies using simulate_principal_policy before applying
  77 | 
  78 |     ## Usage Requirements:
  79 |     - Requires valid AWS credentials with appropriate IAM permissions
  80 |     - Some operations may be restricted in read-only mode
  81 |     - Always test policy changes in a safe environment first
  82 |     """,
  83 |     dependencies=['pydantic', 'loguru', 'boto3', 'botocore'],
  84 | )
  85 | 
  86 | 
  87 | @mcp.tool()
  88 | async def list_users(
  89 |     ctx: CallToolResult,
  90 |     path_prefix: Optional[str] = Field(
  91 |         description='Path prefix to filter users (e.g., "/division_abc/")', default=None
  92 |     ),
  93 |     max_items: int = Field(description='Maximum number of users to return', default=100),
  94 | ) -> UsersListResponse:
  95 |     """List IAM users in the account.
  96 | 
  97 |     This tool retrieves a list of IAM users from your AWS account with optional filtering.
  98 |     Use this to get an overview of all users or find specific users by path prefix.
  99 | 
 100 |     ## Usage Tips:
 101 |     - Use path_prefix to filter users by organizational structure
 102 |     - Adjust max_items to control response size for large accounts
 103 |     - Results may be paginated for accounts with many users
 104 | 
 105 |     Args:
 106 |         ctx: MCP context for error reporting
 107 |         path_prefix: Optional path prefix to filter users
 108 |         max_items: Maximum number of users to return
 109 | 
 110 |     Returns:
 111 |         UsersListResponse containing list of users and metadata
 112 |     """
 113 |     try:
 114 |         logger.info(f"Listing IAM users with path_prefix='{path_prefix}', max_items={max_items}")
 115 | 
 116 |         iam = get_iam_client()
 117 | 
 118 |         kwargs: Dict[str, Any] = {'MaxItems': max_items}
 119 |         if path_prefix:
 120 |             kwargs['PathPrefix'] = path_prefix
 121 | 
 122 |         response = iam.list_users(**kwargs)
 123 | 
 124 |         users = []
 125 |         for user in response.get('Users', []):
 126 |             users.append(
 127 |                 IamUser(
 128 |                     user_name=user['UserName'],
 129 |                     user_id=user['UserId'],
 130 |                     arn=user['Arn'],
 131 |                     path=user['Path'],
 132 |                     create_date=user['CreateDate'].isoformat(),
 133 |                     password_last_used=user.get('PasswordLastUsed', '').isoformat()
 134 |                     if user.get('PasswordLastUsed')
 135 |                     else None,
 136 |                 )
 137 |             )
 138 | 
 139 |         result = UsersListResponse(
 140 |             users=users,
 141 |             is_truncated=response.get('IsTruncated', False),
 142 |             marker=response.get('Marker'),
 143 |             count=len(users),
 144 |         )
 145 | 
 146 |         logger.info(f'Successfully listed {len(users)} IAM users')
 147 |         return result
 148 | 
 149 |     except Exception as e:
 150 |         error = handle_iam_error(e)
 151 |         logger.error(f'Error listing users: {error}')
 152 |         raise error
 153 | 
 154 | 
 155 | @mcp.tool()
 156 | async def get_user(
 157 |     ctx: CallToolResult, user_name: str = Field(description='The name of the IAM user to retrieve')
 158 | ) -> UserDetailsResponse:
 159 |     """Get detailed information about a specific IAM user.
 160 | 
 161 |     This tool retrieves comprehensive information about an IAM user including
 162 |     attached policies, group memberships, and access keys. Use this to get
 163 |     a complete picture of a user's permissions and configuration.
 164 | 
 165 |     ## Usage Tips:
 166 |     - Use this after list_users to get detailed information about specific users
 167 |     - Review attached policies to understand user permissions
 168 |     - Check access keys to identify potential security issues
 169 | 
 170 |     Args:
 171 |         ctx: MCP context for error reporting
 172 |         user_name: The name of the IAM user
 173 | 
 174 |     Returns:
 175 |         UserDetailsResponse containing comprehensive user information
 176 |     """
 177 |     try:
 178 |         logger.info(f'Getting details for IAM user: {user_name}')
 179 | 
 180 |         if not user_name:
 181 |             raise IamValidationError('User name is required')
 182 | 
 183 |         iam = get_iam_client()
 184 | 
 185 |         # Get user details
 186 |         user_response = iam.get_user(UserName=user_name)
 187 |         user = user_response['User']
 188 | 
 189 |         # Get attached policies
 190 |         attached_policies_response = iam.list_attached_user_policies(UserName=user_name)
 191 |         attached_policies = [
 192 |             AttachedPolicy(policy_name=policy['PolicyName'], policy_arn=policy['PolicyArn'])
 193 |             for policy in attached_policies_response.get('AttachedPolicies', [])
 194 |         ]
 195 | 
 196 |         # Get inline policies
 197 |         inline_policies_response = iam.list_user_policies(UserName=user_name)
 198 |         inline_policies = inline_policies_response.get('PolicyNames', [])
 199 | 
 200 |         # Get groups
 201 |         groups_response = iam.list_groups_for_user(UserName=user_name)
 202 |         groups = [group['GroupName'] for group in groups_response.get('Groups', [])]
 203 | 
 204 |         # Get access keys
 205 |         access_keys_response = iam.list_access_keys(UserName=user_name)
 206 |         access_keys = [
 207 |             AccessKey(
 208 |                 access_key_id=key['AccessKeyId'],
 209 |                 status=key['Status'],
 210 |                 create_date=key['CreateDate'].isoformat(),
 211 |             )
 212 |             for key in access_keys_response.get('AccessKeyMetadata', [])
 213 |         ]
 214 | 
 215 |         user_details = IamUser(
 216 |             user_name=user['UserName'],
 217 |             user_id=user['UserId'],
 218 |             arn=user['Arn'],
 219 |             path=user['Path'],
 220 |             create_date=user['CreateDate'].isoformat(),
 221 |             password_last_used=user.get('PasswordLastUsed', '').isoformat()
 222 |             if user.get('PasswordLastUsed')
 223 |             else None,
 224 |         )
 225 | 
 226 |         result = UserDetailsResponse(
 227 |             user=user_details,
 228 |             attached_policies=attached_policies,
 229 |             inline_policies=inline_policies,
 230 |             groups=groups,
 231 |             access_keys=access_keys,
 232 |         )
 233 | 
 234 |         logger.info(f'Successfully retrieved details for user: {user_name}')
 235 |         return result
 236 | 
 237 |     except Exception as e:
 238 |         error = handle_iam_error(e)
 239 |         logger.error(f'Error getting user details: {error}')
 240 |         raise error
 241 | 
 242 | 
 243 | @mcp.tool()
 244 | async def create_user(
 245 |     ctx: CallToolResult,
 246 |     user_name: str = Field(description='The name of the new IAM user'),
 247 |     path: str = Field(description='The path for the user', default='/'),
 248 |     permissions_boundary: Optional[str] = Field(
 249 |         description='ARN of the permissions boundary policy', default=None
 250 |     ),
 251 | ) -> CreateUserResponse:
 252 |     """Create a new IAM user.
 253 | 
 254 |     This tool creates a new IAM user in your AWS account. The user will be created
 255 |     without any permissions by default - you'll need to attach policies separately.
 256 | 
 257 |     ## Security Best Practices:
 258 |     - Use descriptive user names that indicate the user's role or purpose
 259 |     - Set appropriate paths for organizational structure
 260 |     - Consider using permissions boundaries to limit maximum permissions
 261 |     - Follow the principle of least privilege when assigning permissions later
 262 | 
 263 |     Args:
 264 |         ctx: MCP context for error reporting
 265 |         user_name: The name of the new IAM user
 266 |         path: The path for the user (default: '/')
 267 |         permissions_boundary: Optional ARN of the permissions boundary policy
 268 | 
 269 |     Returns:
 270 |         CreateUserResponse containing the created user details
 271 |     """
 272 |     try:
 273 |         logger.info(f'Creating IAM user: {user_name}')
 274 | 
 275 |         # Check if server is in read-only mode
 276 |         if Context.is_readonly():
 277 |             raise IamClientError('Cannot create user: server is running in read-only mode')
 278 | 
 279 |         if not user_name:
 280 |             raise IamValidationError('User name is required')
 281 | 
 282 |         iam = get_iam_client()
 283 | 
 284 |         kwargs = {'UserName': user_name, 'Path': path}
 285 | 
 286 |         if permissions_boundary:
 287 |             kwargs['PermissionsBoundary'] = permissions_boundary
 288 | 
 289 |         response = iam.create_user(**kwargs)
 290 |         user = response['User']
 291 | 
 292 |         user_details = IamUser(
 293 |             user_name=user['UserName'],
 294 |             user_id=user['UserId'],
 295 |             arn=user['Arn'],
 296 |             path=user['Path'],
 297 |             create_date=user['CreateDate'].isoformat(),
 298 |             password_last_used=user.get('PasswordLastUsed').isoformat()
 299 |             if user.get('PasswordLastUsed')
 300 |             else None,
 301 |         )
 302 | 
 303 |         result = CreateUserResponse(
 304 |             user=user_details, message=f'Successfully created user: {user_name}'
 305 |         )
 306 | 
 307 |         logger.info(f'Successfully created IAM user: {user_name}')
 308 |         return result
 309 | 
 310 |     except Exception as e:
 311 |         error = handle_iam_error(e)
 312 |         logger.error(f'Error creating user: {error}')
 313 |         raise error
 314 | 
 315 | 
 316 | @mcp.tool()
 317 | async def delete_user(
 318 |     user_name: str = Field(description='The name of the IAM user to delete'),
 319 |     force: bool = Field(
 320 |         description='Force delete user by removing all attached policies, groups, and access keys first',
 321 |         default=False,
 322 |     ),
 323 | ) -> Dict[str, Any]:
 324 |     """Delete an IAM user.
 325 | 
 326 |     Args:
 327 |         user_name: The name of the IAM user to delete
 328 |         force: If True, removes all attached policies, groups, and access keys first
 329 | 
 330 |     Returns:
 331 |         Dictionary containing deletion status
 332 |     """
 333 |     try:
 334 |         # Check if server is in read-only mode
 335 |         if Context.is_readonly():
 336 |             raise IamClientError('Cannot delete user: server is running in read-only mode')
 337 | 
 338 |         iam = get_iam_client()
 339 | 
 340 |         if force:
 341 |             # Remove from all groups
 342 |             groups = iam.list_groups_for_user(UserName=user_name)
 343 |             for group in groups.get('Groups', []):
 344 |                 iam.remove_user_from_group(GroupName=group['GroupName'], UserName=user_name)
 345 | 
 346 |             # Detach all managed policies
 347 |             attached_policies = iam.list_attached_user_policies(UserName=user_name)
 348 |             for policy in attached_policies.get('AttachedPolicies', []):
 349 |                 iam.detach_user_policy(UserName=user_name, PolicyArn=policy['PolicyArn'])
 350 | 
 351 |             # Delete all inline policies
 352 |             inline_policies = iam.list_user_policies(UserName=user_name)
 353 |             for policy_name in inline_policies.get('PolicyNames', []):
 354 |                 iam.delete_user_policy(UserName=user_name, PolicyName=policy_name)
 355 | 
 356 |             # Delete all access keys
 357 |             access_keys = iam.list_access_keys(UserName=user_name)
 358 |             for key in access_keys.get('AccessKeyMetadata', []):
 359 |                 iam.delete_access_key(UserName=user_name, AccessKeyId=key['AccessKeyId'])
 360 | 
 361 |         # Delete the user
 362 |         iam.delete_user(UserName=user_name)
 363 | 
 364 |         return {'Message': f'Successfully deleted user: {user_name}', 'ForcedCleanup': force}
 365 | 
 366 |     except Exception as e:
 367 |         raise handle_iam_error(e)
 368 | 
 369 | 
 370 | @mcp.tool()
 371 | async def list_roles(
 372 |     path_prefix: Optional[str] = Field(
 373 |         description='Path prefix to filter roles (e.g., "/service-role/")', default=None
 374 |     ),
 375 |     max_items: int = Field(description='Maximum number of roles to return', default=100),
 376 | ) -> Dict[str, Any]:
 377 |     """List IAM roles in the account.
 378 | 
 379 |     Args:
 380 |         path_prefix: Optional path prefix to filter roles
 381 |         max_items: Maximum number of roles to return
 382 | 
 383 |     Returns:
 384 |         Dictionary containing list of roles and metadata
 385 |     """
 386 |     try:
 387 |         iam = get_iam_client()
 388 | 
 389 |         kwargs: Dict[str, Any] = {'MaxItems': max_items}
 390 |         if path_prefix:
 391 |             kwargs['PathPrefix'] = path_prefix
 392 | 
 393 |         response = iam.list_roles(**kwargs)
 394 | 
 395 |         roles = []
 396 |         for role in response.get('Roles', []):
 397 |             roles.append(
 398 |                 {
 399 |                     'RoleName': role['RoleName'],
 400 |                     'RoleId': role['RoleId'],
 401 |                     'Arn': role['Arn'],
 402 |                     'Path': role['Path'],
 403 |                     'CreateDate': role['CreateDate'].isoformat(),
 404 |                     'AssumeRolePolicyDocument': role.get('AssumeRolePolicyDocument'),
 405 |                     'Description': role.get('Description'),
 406 |                     'MaxSessionDuration': role.get('MaxSessionDuration'),
 407 |                 }
 408 |             )
 409 | 
 410 |         return {
 411 |             'Roles': roles,
 412 |             'IsTruncated': response.get('IsTruncated', False),
 413 |             'Marker': response.get('Marker'),
 414 |             'Count': len(roles),
 415 |         }
 416 | 
 417 |     except Exception as e:
 418 |         raise handle_iam_error(e)
 419 | 
 420 | 
 421 | @mcp.tool()
 422 | async def create_role(
 423 |     role_name: str = Field(description='The name of the new IAM role'),
 424 |     assume_role_policy_document: Union[str, dict] = Field(
 425 |         description='The trust policy document in JSON format (string or dict)'
 426 |     ),
 427 |     path: str = Field(description='The path for the role', default='/'),
 428 |     description: Optional[str] = Field(description='Description of the role', default=None),
 429 |     max_session_duration: int = Field(
 430 |         description='Maximum session duration in seconds (3600-43200)', default=3600
 431 |     ),
 432 |     permissions_boundary: Optional[str] = Field(
 433 |         description='ARN of the permissions boundary policy', default=None
 434 |     ),
 435 | ) -> Dict[str, Any]:
 436 |     """Create a new IAM role.
 437 | 
 438 |     Args:
 439 |         role_name: The name of the new IAM role
 440 |         assume_role_policy_document: The trust policy document in JSON format
 441 |         path: The path for the role (default: '/')
 442 |         description: Optional description of the role
 443 |         max_session_duration: Maximum session duration in seconds
 444 |         permissions_boundary: Optional ARN of the permissions boundary policy
 445 | 
 446 |     Returns:
 447 |         Dictionary containing the created role details
 448 |     """
 449 |     try:
 450 |         # Check if server is in read-only mode
 451 |         if Context.is_readonly():
 452 |             raise IamClientError('Cannot create role: server is running in read-only mode')
 453 | 
 454 |         iam = get_iam_client()
 455 | 
 456 |         # Handle both string and dict types
 457 |         if isinstance(assume_role_policy_document, dict):
 458 |             policy_document = json.dumps(assume_role_policy_document)
 459 |         else:
 460 |             policy_document = assume_role_policy_document
 461 |             # Validate JSON
 462 |             try:
 463 |                 json.loads(policy_document)
 464 |             except json.JSONDecodeError:
 465 |                 raise Exception('Invalid JSON in assume_role_policy_document')
 466 | 
 467 |         kwargs = {
 468 |             'RoleName': role_name,
 469 |             'AssumeRolePolicyDocument': policy_document,
 470 |             'Path': path,
 471 |             'MaxSessionDuration': max_session_duration,
 472 |         }
 473 | 
 474 |         if description:
 475 |             kwargs['Description'] = description
 476 |         if permissions_boundary:
 477 |             kwargs['PermissionsBoundary'] = permissions_boundary
 478 | 
 479 |         response = iam.create_role(**kwargs)
 480 |         role = response['Role']
 481 | 
 482 |         return {
 483 |             'Role': {
 484 |                 'RoleName': role['RoleName'],
 485 |                 'RoleId': role['RoleId'],
 486 |                 'Arn': role['Arn'],
 487 |                 'Path': role['Path'],
 488 |                 'CreateDate': role['CreateDate'].isoformat(),
 489 |                 'AssumeRolePolicyDocument': role.get('AssumeRolePolicyDocument'),
 490 |                 'Description': role.get('Description'),
 491 |                 'MaxSessionDuration': role.get('MaxSessionDuration'),
 492 |             },
 493 |             'Message': f'Successfully created role: {role_name}',
 494 |         }
 495 | 
 496 |     except Exception as e:
 497 |         raise handle_iam_error(e)
 498 | 
 499 | 
 500 | @mcp.tool()
 501 | async def list_policies(
 502 |     scope: str = Field(
 503 |         description='Scope of policies to list: "All", "AWS", or "Local"', default='Local'
 504 |     ),
 505 |     only_attached: bool = Field(
 506 |         description='Only return policies that are attached to a user, group, or role',
 507 |         default=False,
 508 |     ),
 509 |     path_prefix: Optional[str] = Field(description='Path prefix to filter policies', default=None),
 510 |     max_items: int = Field(description='Maximum number of policies to return', default=100),
 511 | ) -> Dict[str, Any]:
 512 |     """List IAM policies in the account.
 513 | 
 514 |     Args:
 515 |         scope: Scope of policies to list ("All", "AWS", or "Local")
 516 |         only_attached: Only return policies that are attached
 517 |         path_prefix: Optional path prefix to filter policies
 518 |         max_items: Maximum number of policies to return
 519 | 
 520 |     Returns:
 521 |         Dictionary containing list of policies and metadata
 522 |     """
 523 |     try:
 524 |         iam = get_iam_client()
 525 | 
 526 |         kwargs = {'Scope': scope, 'OnlyAttached': only_attached, 'MaxItems': max_items}
 527 |         if path_prefix:
 528 |             kwargs['PathPrefix'] = path_prefix
 529 | 
 530 |         response = iam.list_policies(**kwargs)
 531 | 
 532 |         policies = []
 533 |         for policy in response.get('Policies', []):
 534 |             policies.append(
 535 |                 {
 536 |                     'PolicyName': policy['PolicyName'],
 537 |                     'PolicyId': policy['PolicyId'],
 538 |                     'Arn': policy['Arn'],
 539 |                     'Path': policy['Path'],
 540 |                     'DefaultVersionId': policy['DefaultVersionId'],
 541 |                     'AttachmentCount': policy['AttachmentCount'],
 542 |                     'PermissionsBoundaryUsageCount': policy.get(
 543 |                         'PermissionsBoundaryUsageCount', 0
 544 |                     ),
 545 |                     'IsAttachable': policy['IsAttachable'],
 546 |                     'Description': policy.get('Description'),
 547 |                     'CreateDate': policy['CreateDate'].isoformat(),
 548 |                     'UpdateDate': policy['UpdateDate'].isoformat(),
 549 |                 }
 550 |             )
 551 | 
 552 |         return {
 553 |             'Policies': policies,
 554 |             'IsTruncated': response.get('IsTruncated', False),
 555 |             'Marker': response.get('Marker'),
 556 |             'Count': len(policies),
 557 |         }
 558 | 
 559 |     except Exception as e:
 560 |         raise handle_iam_error(e)
 561 | 
 562 | 
 563 | @mcp.tool()
 564 | async def get_managed_policy_document(
 565 |     policy_arn: str = Field(description='The ARN of the managed policy'),
 566 |     version_id: Optional[str] = Field(
 567 |         description='The version ID of the policy (defaults to current version)', default=None
 568 |     ),
 569 | ) -> ManagedPolicyResponse:
 570 |     """Retrieve the policy document for a managed policy.
 571 | 
 572 |     This tool retrieves the policy document for a specific managed policy version.
 573 |     Use this to examine the actual permissions and wildcards in managed policies.
 574 | 
 575 |     Args:
 576 |         policy_arn: The ARN of the managed policy
 577 |         version_id: Optional version ID (defaults to current version)
 578 | 
 579 |     Returns:
 580 |         ManagedPolicyResponse containing the policy document and details
 581 |     """
 582 |     try:
 583 |         logger.info(f'Getting managed policy document for: {policy_arn}')
 584 | 
 585 |         if not policy_arn:
 586 |             raise IamValidationError('Policy ARN is required')
 587 | 
 588 |         iam = get_iam_client()
 589 | 
 590 |         # Build parameters for the API call
 591 |         kwargs = {'PolicyArn': policy_arn}
 592 |         if version_id:
 593 |             kwargs['VersionId'] = version_id
 594 | 
 595 |         response = iam.get_policy_version(**kwargs)
 596 |         policy_version = response['PolicyVersion']
 597 | 
 598 |         # Extract policy name from ARN
 599 |         policy_name = policy_arn.split('/')[-1]
 600 | 
 601 |         result = ManagedPolicyResponse(
 602 |             policy_arn=policy_arn,
 603 |             policy_name=policy_name,
 604 |             version_id=policy_version['VersionId'],
 605 |             policy_document=json.dumps(policy_version['Document'], indent=2),
 606 |             is_default_version=policy_version['IsDefaultVersion'],
 607 |             create_date=policy_version['CreateDate'].isoformat(),
 608 |             message=f'Successfully retrieved managed policy document for {policy_name}',
 609 |         )
 610 | 
 611 |         logger.info(f'Successfully retrieved managed policy document for: {policy_arn}')
 612 |         return result
 613 | 
 614 |     except Exception as e:
 615 |         error = handle_iam_error(e)
 616 |         logger.error(f'Error getting managed policy document: {error}')
 617 |         raise error
 618 | 
 619 | 
 620 | @mcp.tool()
 621 | async def attach_user_policy(
 622 |     user_name: str = Field(description='The name of the IAM user'),
 623 |     policy_arn: str = Field(description='The ARN of the policy to attach'),
 624 | ) -> Dict[str, Any]:
 625 |     """Attach a managed policy to an IAM user.
 626 | 
 627 |     Args:
 628 |         user_name: The name of the IAM user
 629 |         policy_arn: The ARN of the policy to attach
 630 | 
 631 |     Returns:
 632 |         Dictionary containing attachment status
 633 |     """
 634 |     try:
 635 |         # Check if server is in read-only mode
 636 |         if Context.is_readonly():
 637 |             raise IamClientError('Cannot attach policy: server is running in read-only mode')
 638 | 
 639 |         iam = get_iam_client()
 640 | 
 641 |         iam.attach_user_policy(UserName=user_name, PolicyArn=policy_arn)
 642 | 
 643 |         return {
 644 |             'Message': f'Successfully attached policy {policy_arn} to user {user_name}',
 645 |             'UserName': user_name,
 646 |             'PolicyArn': policy_arn,
 647 |         }
 648 | 
 649 |     except Exception as e:
 650 |         raise handle_iam_error(e)
 651 | 
 652 | 
 653 | @mcp.tool()
 654 | async def detach_user_policy(
 655 |     user_name: str = Field(description='The name of the IAM user'),
 656 |     policy_arn: str = Field(description='The ARN of the policy to detach'),
 657 | ) -> Dict[str, Any]:
 658 |     """Detach a managed policy from an IAM user.
 659 | 
 660 |     Args:
 661 |         user_name: The name of the IAM user
 662 |         policy_arn: The ARN of the policy to detach
 663 | 
 664 |     Returns:
 665 |         Dictionary containing detachment status
 666 |     """
 667 |     try:
 668 |         # Check if server is in read-only mode
 669 |         if Context.is_readonly():
 670 |             raise IamClientError('Cannot detach policy: server is running in read-only mode')
 671 | 
 672 |         iam = get_iam_client()
 673 | 
 674 |         iam.detach_user_policy(UserName=user_name, PolicyArn=policy_arn)
 675 | 
 676 |         return {
 677 |             'Message': f'Successfully detached policy {policy_arn} from user {user_name}',
 678 |             'UserName': user_name,
 679 |             'PolicyArn': policy_arn,
 680 |         }
 681 | 
 682 |     except Exception as e:
 683 |         raise handle_iam_error(e)
 684 | 
 685 | 
 686 | @mcp.tool()
 687 | async def create_access_key(
 688 |     user_name: str = Field(description='The name of the IAM user'),
 689 | ) -> Dict[str, Any]:
 690 |     """Create a new access key for an IAM user.
 691 | 
 692 |     Args:
 693 |         user_name: The name of the IAM user
 694 | 
 695 |     Returns:
 696 |         Dictionary containing the new access key details
 697 |     """
 698 |     try:
 699 |         # Check if server is in read-only mode
 700 |         if Context.is_readonly():
 701 |             raise IamClientError('Cannot create access key: server is running in read-only mode')
 702 | 
 703 |         iam = get_iam_client()
 704 | 
 705 |         response = iam.create_access_key(UserName=user_name)
 706 |         access_key = response['AccessKey']
 707 | 
 708 |         return {
 709 |             'AccessKey': {
 710 |                 'AccessKeyId': access_key['AccessKeyId'],
 711 |                 'SecretAccessKey': access_key['SecretAccessKey'],
 712 |                 'Status': access_key['Status'],
 713 |                 'UserName': access_key['UserName'],
 714 |                 'CreateDate': access_key['CreateDate'].isoformat(),
 715 |             },
 716 |             'Message': f'Successfully created access key for user: {user_name}',
 717 |             'Warning': 'Store the SecretAccessKey securely - it cannot be retrieved again!',
 718 |         }
 719 | 
 720 |     except Exception as e:
 721 |         raise handle_iam_error(e)
 722 | 
 723 | 
 724 | @mcp.tool()
 725 | async def delete_access_key(
 726 |     user_name: str = Field(description='The name of the IAM user'),
 727 |     access_key_id: str = Field(description='The access key ID to delete'),
 728 | ) -> Dict[str, Any]:
 729 |     """Delete an access key for an IAM user.
 730 | 
 731 |     Args:
 732 |         user_name: The name of the IAM user
 733 |         access_key_id: The access key ID to delete
 734 | 
 735 |     Returns:
 736 |         Dictionary containing deletion status
 737 |     """
 738 |     try:
 739 |         # Check if server is in read-only mode
 740 |         if Context.is_readonly():
 741 |             raise IamClientError('Cannot delete access key: server is running in read-only mode')
 742 | 
 743 |         iam = get_iam_client()
 744 | 
 745 |         iam.delete_access_key(UserName=user_name, AccessKeyId=access_key_id)
 746 | 
 747 |         return {
 748 |             'Message': f'Successfully deleted access key {access_key_id} for user {user_name}',
 749 |             'UserName': user_name,
 750 |             'AccessKeyId': access_key_id,
 751 |         }
 752 | 
 753 |     except Exception as e:
 754 |         raise handle_iam_error(e)
 755 | 
 756 | 
 757 | @mcp.tool()
 758 | async def simulate_principal_policy(
 759 |     policy_source_arn: str = Field(description='ARN of the user or role to simulate'),
 760 |     action_names: List[str] = Field(description='List of actions to simulate'),
 761 |     resource_arns: Optional[List[str]] = Field(
 762 |         description='List of resource ARNs to test against', default=None
 763 |     ),
 764 |     context_entries: Optional[Dict[str, str]] = Field(
 765 |         description='Context entries for the simulation', default=None
 766 |     ),
 767 | ) -> Dict[str, Any]:
 768 |     """Simulate IAM policy evaluation for a principal.
 769 | 
 770 |     Args:
 771 |         policy_source_arn: ARN of the user or role to simulate
 772 |         action_names: List of actions to simulate
 773 |         resource_arns: Optional list of resource ARNs to test against
 774 |         context_entries: Optional context entries for the simulation
 775 | 
 776 |     Returns:
 777 |         Dictionary containing simulation results
 778 |     """
 779 |     try:
 780 |         iam = get_iam_client()
 781 | 
 782 |         kwargs = {'PolicySourceArn': policy_source_arn, 'ActionNames': action_names}
 783 | 
 784 |         if resource_arns:
 785 |             kwargs['ResourceArns'] = resource_arns
 786 |         if context_entries:
 787 |             kwargs['ContextEntries'] = [
 788 |                 {'ContextKeyName': k, 'ContextKeyValues': [v]} for k, v in context_entries.items()
 789 |             ]
 790 | 
 791 |         response = iam.simulate_principal_policy(**kwargs)
 792 | 
 793 |         results = []
 794 |         for result in response.get('EvaluationResults', []):
 795 |             results.append(
 796 |                 {
 797 |                     'EvalActionName': result['EvalActionName'],
 798 |                     'EvalResourceName': result.get('EvalResourceName', '*'),
 799 |                     'EvalDecision': result['EvalDecision'],
 800 |                     'MatchedStatements': result.get('MatchedStatements', []),
 801 |                     'MissingContextValues': result.get('MissingContextValues', []),
 802 |                 }
 803 |             )
 804 | 
 805 |         return {
 806 |             'EvaluationResults': results,
 807 |             'IsTruncated': response.get('IsTruncated', False),
 808 |             'Marker': response.get('Marker'),
 809 |             'PolicySourceArn': policy_source_arn,
 810 |         }
 811 | 
 812 |     except Exception as e:
 813 |         raise handle_iam_error(e)
 814 | 
 815 | 
 816 | # Group Management Tools
 817 | 
 818 | 
 819 | @mcp.tool()
 820 | async def list_groups(
 821 |     path_prefix: Optional[str] = Field(
 822 |         None, description='Path prefix to filter groups (e.g., "/division_abc/")'
 823 |     ),
 824 |     max_items: int = Field(100, description='Maximum number of groups to return'),
 825 | ) -> GroupsListResponse:
 826 |     """List IAM groups in the account.
 827 | 
 828 |     This tool retrieves a list of IAM groups from your AWS account with optional filtering.
 829 |     Use this to get an overview of all groups or find specific groups by path prefix.
 830 | 
 831 |     ## Usage Tips:
 832 |     - Use path_prefix to filter groups by organizational structure
 833 |     - Adjust max_items to control response size for large accounts
 834 |     - Results may be paginated for accounts with many groups
 835 | 
 836 |     Args:
 837 |         path_prefix: Optional path prefix to filter groups
 838 |         max_items: Maximum number of groups to return
 839 | 
 840 |     Returns:
 841 |         GroupsListResponse containing list of groups and metadata
 842 |     """
 843 |     if Context.is_readonly():
 844 |         # List operations are allowed in read-only mode
 845 |         pass
 846 | 
 847 |     try:
 848 |         iam = get_iam_client()
 849 | 
 850 |         kwargs: Dict[str, Union[int, str]] = {'MaxItems': max_items}
 851 |         if path_prefix:
 852 |             kwargs['PathPrefix'] = path_prefix
 853 | 
 854 |         response = iam.list_groups(**kwargs)
 855 | 
 856 |         groups = []
 857 |         for group_data in response.get('Groups', []):
 858 |             group = IamGroup(
 859 |                 group_name=group_data['GroupName'],
 860 |                 group_id=group_data['GroupId'],
 861 |                 arn=group_data['Arn'],
 862 |                 path=group_data['Path'],
 863 |                 create_date=group_data['CreateDate'].isoformat(),
 864 |             )
 865 |             groups.append(group)
 866 | 
 867 |         return GroupsListResponse(
 868 |             groups=groups,
 869 |             is_truncated=response.get('IsTruncated', False),
 870 |             marker=response.get('Marker'),
 871 |             count=len(groups),
 872 |         )
 873 | 
 874 |     except Exception as e:
 875 |         raise handle_iam_error(e)
 876 | 
 877 | 
 878 | @mcp.tool()
 879 | async def get_group(
 880 |     group_name: str = Field(description='The name of the IAM group to retrieve'),
 881 | ) -> GroupDetailsResponse:
 882 |     """Get detailed information about a specific IAM group.
 883 | 
 884 |     This tool retrieves comprehensive information about an IAM group including
 885 |     group members, attached policies, and inline policies. Use this to get
 886 |     a complete picture of a group's configuration and membership.
 887 | 
 888 |     ## Usage Tips:
 889 |     - Use this after list_groups to get detailed information about specific groups
 890 |     - Review attached policies to understand group permissions
 891 |     - Check group members to see who has these permissions
 892 | 
 893 |     Args:
 894 |         group_name: The name of the IAM group
 895 | 
 896 |     Returns:
 897 |         GroupDetailsResponse containing comprehensive group information
 898 |     """
 899 |     if Context.is_readonly():
 900 |         # Get operations are allowed in read-only mode
 901 |         pass
 902 | 
 903 |     try:
 904 |         iam = get_iam_client()
 905 | 
 906 |         # Get group details and members
 907 |         group_response = iam.get_group(GroupName=group_name)
 908 |         group_data = group_response['Group']
 909 | 
 910 |         group = IamGroup(
 911 |             group_name=group_data['GroupName'],
 912 |             group_id=group_data['GroupId'],
 913 |             arn=group_data['Arn'],
 914 |             path=group_data['Path'],
 915 |             create_date=group_data['CreateDate'].isoformat(),
 916 |         )
 917 | 
 918 |         # Get group members
 919 |         users = [user['UserName'] for user in group_response.get('Users', [])]
 920 | 
 921 |         # Get attached managed policies
 922 |         attached_policies_response = iam.list_attached_group_policies(GroupName=group_name)
 923 |         attached_policies = [
 924 |             AttachedPolicy(policy_name=policy['PolicyName'], policy_arn=policy['PolicyArn'])
 925 |             for policy in attached_policies_response.get('AttachedPolicies', [])
 926 |         ]
 927 | 
 928 |         # Get inline policies
 929 |         inline_policies_response = iam.list_group_policies(GroupName=group_name)
 930 |         inline_policies = inline_policies_response.get('PolicyNames', [])
 931 | 
 932 |         return GroupDetailsResponse(
 933 |             group=group,
 934 |             users=users,
 935 |             attached_policies=attached_policies,
 936 |             inline_policies=inline_policies,
 937 |         )
 938 | 
 939 |     except Exception as e:
 940 |         raise handle_iam_error(e)
 941 | 
 942 | 
 943 | @mcp.tool()
 944 | async def create_group(
 945 |     group_name: str = Field(description='The name of the new IAM group'),
 946 |     path: str = Field('/', description='The path for the group'),
 947 | ) -> CreateGroupResponse:
 948 |     """Create a new IAM group.
 949 | 
 950 |     This tool creates a new IAM group in your AWS account. The group will be created
 951 |     without any permissions by default - you'll need to attach policies separately.
 952 | 
 953 |     ## Security Best Practices:
 954 |     - Use descriptive group names that indicate the group's purpose
 955 |     - Set appropriate paths for organizational structure
 956 |     - Follow the principle of least privilege when assigning permissions later
 957 | 
 958 |     Args:
 959 |         group_name: The name of the new IAM group
 960 |         path: The path for the group (default: '/')
 961 | 
 962 |     Returns:
 963 |         CreateGroupResponse containing the created group details
 964 |     """
 965 |     if Context.is_readonly():
 966 |         raise IamValidationError('Cannot create group in read-only mode')
 967 | 
 968 |     try:
 969 |         iam = get_iam_client()
 970 | 
 971 |         response = iam.create_group(GroupName=group_name, Path=path)
 972 | 
 973 |         group_data = response['Group']
 974 |         group = IamGroup(
 975 |             group_name=group_data['GroupName'],
 976 |             group_id=group_data['GroupId'],
 977 |             arn=group_data['Arn'],
 978 |             path=group_data['Path'],
 979 |             create_date=group_data['CreateDate'].isoformat(),
 980 |         )
 981 | 
 982 |         return CreateGroupResponse(
 983 |             group=group, message=f'Successfully created IAM group: {group_name}'
 984 |         )
 985 | 
 986 |     except Exception as e:
 987 |         raise handle_iam_error(e)
 988 | 
 989 | 
 990 | @mcp.tool()
 991 | async def delete_group(
 992 |     group_name: str = Field(description='The name of the IAM group to delete'),
 993 |     force: bool = Field(
 994 |         False, description='Force delete by removing all members and policies first'
 995 |     ),
 996 | ) -> Dict[str, str]:
 997 |     """Delete an IAM group.
 998 | 
 999 |     Args:
1000 |         group_name: The name of the IAM group to delete
1001 |         force: If True, removes all members and attached policies first
1002 | 
1003 |     Returns:
1004 |         Dictionary containing deletion status
1005 |     """
1006 |     if Context.is_readonly():
1007 |         raise IamValidationError('Cannot delete group in read-only mode')
1008 | 
1009 |     try:
1010 |         iam = get_iam_client()
1011 | 
1012 |         if force:
1013 |             # Remove all users from the group
1014 |             group_response = iam.get_group(GroupName=group_name)
1015 |             for user in group_response.get('Users', []):
1016 |                 iam.remove_user_from_group(GroupName=group_name, UserName=user['UserName'])
1017 | 
1018 |             # Detach all managed policies
1019 |             attached_policies = iam.list_attached_group_policies(GroupName=group_name)
1020 |             for policy in attached_policies.get('AttachedPolicies', []):
1021 |                 iam.detach_group_policy(GroupName=group_name, PolicyArn=policy['PolicyArn'])
1022 | 
1023 |             # Delete all inline policies
1024 |             inline_policies = iam.list_group_policies(GroupName=group_name)
1025 |             for policy_name in inline_policies.get('PolicyNames', []):
1026 |                 iam.delete_group_policy(GroupName=group_name, PolicyName=policy_name)
1027 | 
1028 |         # Delete the group
1029 |         iam.delete_group(GroupName=group_name)
1030 | 
1031 |         return {'message': f'Successfully deleted IAM group: {group_name}'}
1032 | 
1033 |     except Exception as e:
1034 |         raise handle_iam_error(e)
1035 | 
1036 | 
1037 | @mcp.tool()
1038 | async def add_user_to_group(
1039 |     group_name: str = Field(description='The name of the IAM group'),
1040 |     user_name: str = Field(description='The name of the IAM user'),
1041 | ) -> GroupMembershipResponse:
1042 |     """Add a user to an IAM group.
1043 | 
1044 |     Args:
1045 |         group_name: The name of the IAM group
1046 |         user_name: The name of the IAM user
1047 | 
1048 |     Returns:
1049 |         GroupMembershipResponse containing operation status
1050 |     """
1051 |     if Context.is_readonly():
1052 |         raise IamValidationError('Cannot add user to group in read-only mode')
1053 | 
1054 |     try:
1055 |         iam = get_iam_client()
1056 |         iam.add_user_to_group(GroupName=group_name, UserName=user_name)
1057 | 
1058 |         return GroupMembershipResponse(
1059 |             message=f'Successfully added user {user_name} to group {group_name}',
1060 |             group_name=group_name,
1061 |             user_name=user_name,
1062 |         )
1063 | 
1064 |     except Exception as e:
1065 |         raise handle_iam_error(e)
1066 | 
1067 | 
1068 | @mcp.tool()
1069 | async def remove_user_from_group(
1070 |     group_name: str = Field(description='The name of the IAM group'),
1071 |     user_name: str = Field(description='The name of the IAM user'),
1072 | ) -> GroupMembershipResponse:
1073 |     """Remove a user from an IAM group.
1074 | 
1075 |     Args:
1076 |         group_name: The name of the IAM group
1077 |         user_name: The name of the IAM user
1078 | 
1079 |     Returns:
1080 |         GroupMembershipResponse containing operation status
1081 |     """
1082 |     if Context.is_readonly():
1083 |         raise IamValidationError('Cannot remove user from group in read-only mode')
1084 | 
1085 |     try:
1086 |         iam = get_iam_client()
1087 |         iam.remove_user_from_group(GroupName=group_name, UserName=user_name)
1088 | 
1089 |         return GroupMembershipResponse(
1090 |             message=f'Successfully removed user {user_name} from group {group_name}',
1091 |             group_name=group_name,
1092 |             user_name=user_name,
1093 |         )
1094 | 
1095 |     except Exception as e:
1096 |         raise handle_iam_error(e)
1097 | 
1098 | 
1099 | @mcp.tool()
1100 | async def attach_group_policy(
1101 |     group_name: str = Field(description='The name of the IAM group'),
1102 |     policy_arn: str = Field(description='The ARN of the policy to attach'),
1103 | ) -> GroupPolicyAttachmentResponse:
1104 |     """Attach a managed policy to an IAM group.
1105 | 
1106 |     Args:
1107 |         group_name: The name of the IAM group
1108 |         policy_arn: The ARN of the policy to attach
1109 | 
1110 |     Returns:
1111 |         GroupPolicyAttachmentResponse containing operation status
1112 |     """
1113 |     if Context.is_readonly():
1114 |         raise IamValidationError('Cannot attach policy to group in read-only mode')
1115 | 
1116 |     try:
1117 |         iam = get_iam_client()
1118 |         iam.attach_group_policy(GroupName=group_name, PolicyArn=policy_arn)
1119 | 
1120 |         return GroupPolicyAttachmentResponse(
1121 |             message=f'Successfully attached policy {policy_arn} to group {group_name}',
1122 |             group_name=group_name,
1123 |             policy_arn=policy_arn,
1124 |         )
1125 | 
1126 |     except Exception as e:
1127 |         raise handle_iam_error(e)
1128 | 
1129 | 
1130 | @mcp.tool()
1131 | async def detach_group_policy(
1132 |     group_name: str = Field(description='The name of the IAM group'),
1133 |     policy_arn: str = Field(description='The ARN of the policy to detach'),
1134 | ) -> GroupPolicyAttachmentResponse:
1135 |     """Detach a managed policy from an IAM group.
1136 | 
1137 |     Args:
1138 |         group_name: The name of the IAM group
1139 |         policy_arn: The ARN of the policy to detach
1140 | 
1141 |     Returns:
1142 |         GroupPolicyAttachmentResponse containing operation status
1143 |     """
1144 |     if Context.is_readonly():
1145 |         raise IamValidationError('Cannot detach policy from group in read-only mode')
1146 | 
1147 |     try:
1148 |         iam = get_iam_client()
1149 |         iam.detach_group_policy(GroupName=group_name, PolicyArn=policy_arn)
1150 | 
1151 |         return GroupPolicyAttachmentResponse(
1152 |             message=f'Successfully detached policy {policy_arn} from group {group_name}',
1153 |             group_name=group_name,
1154 |             policy_arn=policy_arn,
1155 |         )
1156 | 
1157 |     except Exception as e:
1158 |         raise handle_iam_error(e)
1159 | 
1160 | 
1161 | # Inline Policy Management Tools
1162 | 
1163 | 
1164 | @mcp.tool()
1165 | async def put_user_policy(
1166 |     user_name: str = Field(description='The name of the IAM user'),
1167 |     policy_name: str = Field(description='The name of the inline policy'),
1168 |     policy_document: Union[str, dict] = Field(
1169 |         description='The policy document in JSON format (string or dict)'
1170 |     ),
1171 | ) -> InlinePolicyResponse:
1172 |     """Create or update an inline policy for an IAM user.
1173 | 
1174 |     This tool creates a new inline policy or updates an existing one for the specified user.
1175 |     Inline policies are directly embedded in a single user, role, or group and have a one-to-one
1176 |     relationship with the identity.
1177 | 
1178 |     ## Security Best Practices:
1179 |     - Follow the principle of least privilege when creating policies
1180 |     - Use managed policies for common permissions that can be reused
1181 |     - Regularly review and audit inline policies
1182 |     - Test policies using simulate_principal_policy before applying
1183 | 
1184 |     Args:
1185 |         user_name: The name of the IAM user
1186 |         policy_name: The name of the inline policy
1187 |         policy_document: The policy document in JSON format
1188 | 
1189 |     Returns:
1190 |         InlinePolicyResponse containing the policy details and operation status
1191 |     """
1192 |     try:
1193 |         logger.info(f'Creating/updating inline policy {policy_name} for user: {user_name}')
1194 | 
1195 |         # Check if server is in read-only mode
1196 |         if Context.is_readonly():
1197 |             raise IamClientError(
1198 |                 'Cannot create/update inline policy: server is running in read-only mode'
1199 |             )
1200 | 
1201 |         if not user_name or not policy_name:
1202 |             raise IamValidationError('User name and policy name are required')
1203 | 
1204 |         iam = get_iam_client()
1205 | 
1206 |         # Handle both string and dict types
1207 |         if isinstance(policy_document, dict):
1208 |             policy_doc = json.dumps(policy_document)
1209 |         else:
1210 |             policy_doc = policy_document
1211 |             # Validate JSON
1212 |             try:
1213 |                 json.loads(policy_doc)
1214 |             except json.JSONDecodeError:
1215 |                 raise IamValidationError('Invalid JSON in policy_document')
1216 | 
1217 |         iam.put_user_policy(UserName=user_name, PolicyName=policy_name, PolicyDocument=policy_doc)
1218 | 
1219 |         result = InlinePolicyResponse(
1220 |             policy_name=policy_name,
1221 |             policy_document=policy_doc,
1222 |             user_name=user_name,
1223 |             role_name=None,
1224 |             message=f'Successfully created/updated inline policy {policy_name} for user {user_name}',
1225 |         )
1226 | 
1227 |         logger.info(
1228 |             f'Successfully created/updated inline policy {policy_name} for user: {user_name}'
1229 |         )
1230 |         return result
1231 | 
1232 |     except Exception as e:
1233 |         error = handle_iam_error(e)
1234 |         logger.error(f'Error creating/updating inline policy: {error}')
1235 |         raise error
1236 | 
1237 | 
1238 | @mcp.tool()
1239 | async def get_user_policy(
1240 |     user_name: str = Field(description='The name of the IAM user'),
1241 |     policy_name: str = Field(description='The name of the inline policy'),
1242 | ) -> InlinePolicyResponse:
1243 |     """Retrieve an inline policy for an IAM user.
1244 | 
1245 |     This tool retrieves the policy document for a specific inline policy attached to a user.
1246 | 
1247 |     Args:
1248 |         user_name: The name of the IAM user
1249 |         policy_name: The name of the inline policy
1250 | 
1251 |     Returns:
1252 |         InlinePolicyResponse containing the policy document and details
1253 |     """
1254 |     try:
1255 |         logger.info(f'Getting inline policy {policy_name} for user: {user_name}')
1256 | 
1257 |         if not user_name or not policy_name:
1258 |             raise IamValidationError('User name and policy name are required')
1259 | 
1260 |         iam = get_iam_client()
1261 | 
1262 |         response = iam.get_user_policy(UserName=user_name, PolicyName=policy_name)
1263 | 
1264 |         result = InlinePolicyResponse(
1265 |             policy_name=response['PolicyName'],
1266 |             policy_document=response['PolicyDocument'],
1267 |             user_name=response['UserName'],
1268 |             role_name=None,
1269 |             message=f'Successfully retrieved inline policy {policy_name} for user {user_name}',
1270 |         )
1271 | 
1272 |         logger.info(f'Successfully retrieved inline policy {policy_name} for user: {user_name}')
1273 |         return result
1274 | 
1275 |     except Exception as e:
1276 |         error = handle_iam_error(e)
1277 |         logger.error(f'Error getting inline policy: {error}')
1278 |         raise error
1279 | 
1280 | 
1281 | @mcp.tool()
1282 | async def delete_user_policy(
1283 |     user_name: str = Field(description='The name of the IAM user'),
1284 |     policy_name: str = Field(description='The name of the inline policy to delete'),
1285 | ) -> Dict[str, Any]:
1286 |     """Delete an inline policy from an IAM user.
1287 | 
1288 |     This tool removes an inline policy from the specified user. The policy document
1289 |     will be permanently deleted and cannot be recovered.
1290 | 
1291 |     Args:
1292 |         user_name: The name of the IAM user
1293 |         policy_name: The name of the inline policy to delete
1294 | 
1295 |     Returns:
1296 |         Dictionary containing deletion status
1297 |     """
1298 |     try:
1299 |         logger.info(f'Deleting inline policy {policy_name} from user: {user_name}')
1300 | 
1301 |         # Check if server is in read-only mode
1302 |         if Context.is_readonly():
1303 |             raise IamClientError(
1304 |                 'Cannot delete inline policy: server is running in read-only mode'
1305 |             )
1306 | 
1307 |         if not user_name or not policy_name:
1308 |             raise IamValidationError('User name and policy name are required')
1309 | 
1310 |         iam = get_iam_client()
1311 | 
1312 |         iam.delete_user_policy(UserName=user_name, PolicyName=policy_name)
1313 | 
1314 |         result = {
1315 |             'message': f'Successfully deleted inline policy {policy_name} from user {user_name}',
1316 |             'user_name': user_name,
1317 |             'policy_name': policy_name,
1318 |         }
1319 | 
1320 |         logger.info(f'Successfully deleted inline policy {policy_name} from user: {user_name}')
1321 |         return result
1322 | 
1323 |     except Exception as e:
1324 |         error = handle_iam_error(e)
1325 |         logger.error(f'Error deleting inline policy: {error}')
1326 |         raise error
1327 | 
1328 | 
1329 | # Role Inline Policy Management Tools
1330 | 
1331 | 
1332 | @mcp.tool()
1333 | async def put_role_policy(
1334 |     role_name: str = Field(description='The name of the IAM role'),
1335 |     policy_name: str = Field(description='The name of the inline policy'),
1336 |     policy_document: Union[str, dict] = Field(
1337 |         description='The policy document in JSON format (string or dict)'
1338 |     ),
1339 | ) -> InlinePolicyResponse:
1340 |     """Create or update an inline policy for an IAM role.
1341 | 
1342 |     This tool creates a new inline policy or updates an existing one for the specified role.
1343 |     Inline policies are directly embedded in a single user, role, or group and have a one-to-one
1344 |     relationship with the identity.
1345 | 
1346 |     Args:
1347 |         role_name: The name of the IAM role
1348 |         policy_name: The name of the inline policy
1349 |         policy_document: The policy document in JSON format
1350 | 
1351 |     Returns:
1352 |         InlinePolicyResponse containing the policy details and operation status
1353 |     """
1354 |     try:
1355 |         logger.info(f'Creating/updating inline policy {policy_name} for role: {role_name}')
1356 | 
1357 |         # Check if server is in read-only mode
1358 |         if Context.is_readonly():
1359 |             raise IamClientError(
1360 |                 'Cannot create/update inline policy: server is running in read-only mode'
1361 |             )
1362 | 
1363 |         if not role_name or not policy_name:
1364 |             raise IamValidationError('Role name and policy name are required')
1365 | 
1366 |         iam = get_iam_client()
1367 | 
1368 |         # Handle both string and dict types
1369 |         if isinstance(policy_document, dict):
1370 |             policy_doc = json.dumps(policy_document)
1371 |         else:
1372 |             policy_doc = policy_document
1373 |             # Validate JSON
1374 |             try:
1375 |                 json.loads(policy_doc)
1376 |             except json.JSONDecodeError:
1377 |                 raise IamValidationError('Invalid JSON in policy_document')
1378 | 
1379 |         iam.put_role_policy(RoleName=role_name, PolicyName=policy_name, PolicyDocument=policy_doc)
1380 | 
1381 |         result = InlinePolicyResponse(
1382 |             policy_name=policy_name,
1383 |             policy_document=policy_doc,
1384 |             user_name=None,
1385 |             role_name=role_name,
1386 |             message=f'Successfully created/updated inline policy {policy_name} for role {role_name}',
1387 |         )
1388 | 
1389 |         logger.info(
1390 |             f'Successfully created/updated inline policy {policy_name} for role: {role_name}'
1391 |         )
1392 |         return result
1393 | 
1394 |     except Exception as e:
1395 |         error = handle_iam_error(e)
1396 |         logger.error(f'Error creating/updating inline policy: {error}')
1397 |         raise error
1398 | 
1399 | 
1400 | @mcp.tool()
1401 | async def get_role_policy(
1402 |     role_name: str = Field(description='The name of the IAM role'),
1403 |     policy_name: str = Field(description='The name of the inline policy'),
1404 | ) -> InlinePolicyResponse:
1405 |     """Retrieve an inline policy for an IAM role.
1406 | 
1407 |     This tool retrieves the policy document for a specific inline policy attached to a role.
1408 | 
1409 |     Args:
1410 |         role_name: The name of the IAM role
1411 |         policy_name: The name of the inline policy
1412 | 
1413 |     Returns:
1414 |         InlinePolicyResponse containing the policy document and details
1415 |     """
1416 |     try:
1417 |         logger.info(f'Getting inline policy {policy_name} for role: {role_name}')
1418 | 
1419 |         if not role_name or not policy_name:
1420 |             raise IamValidationError('Role name and policy name are required')
1421 | 
1422 |         iam = get_iam_client()
1423 | 
1424 |         response = iam.get_role_policy(RoleName=role_name, PolicyName=policy_name)
1425 | 
1426 |         result = InlinePolicyResponse(
1427 |             policy_name=response['PolicyName'],
1428 |             policy_document=response['PolicyDocument'],
1429 |             user_name=None,
1430 |             role_name=response['RoleName'],
1431 |             message=f'Successfully retrieved inline policy {policy_name} for role {role_name}',
1432 |         )
1433 | 
1434 |         logger.info(f'Successfully retrieved inline policy {policy_name} for role: {role_name}')
1435 |         return result
1436 | 
1437 |     except Exception as e:
1438 |         error = handle_iam_error(e)
1439 |         logger.error(f'Error getting inline policy: {error}')
1440 |         raise error
1441 | 
1442 | 
1443 | @mcp.tool()
1444 | async def delete_role_policy(
1445 |     role_name: str = Field(description='The name of the IAM role'),
1446 |     policy_name: str = Field(description='The name of the inline policy to delete'),
1447 | ) -> Dict[str, Any]:
1448 |     """Delete an inline policy from an IAM role.
1449 | 
1450 |     This tool removes an inline policy from the specified role. The policy document
1451 |     will be permanently deleted and cannot be recovered.
1452 | 
1453 |     Args:
1454 |         role_name: The name of the IAM role
1455 |         policy_name: The name of the inline policy to delete
1456 | 
1457 |     Returns:
1458 |         Dictionary containing deletion status
1459 |     """
1460 |     try:
1461 |         logger.info(f'Deleting inline policy {policy_name} from role: {role_name}')
1462 | 
1463 |         # Check if server is in read-only mode
1464 |         if Context.is_readonly():
1465 |             raise IamClientError(
1466 |                 'Cannot delete inline policy: server is running in read-only mode'
1467 |             )
1468 | 
1469 |         if not role_name or not policy_name:
1470 |             raise IamValidationError('Role name and policy name are required')
1471 | 
1472 |         iam = get_iam_client()
1473 | 
1474 |         iam.delete_role_policy(RoleName=role_name, PolicyName=policy_name)
1475 | 
1476 |         result = {
1477 |             'message': f'Successfully deleted inline policy {policy_name} from role {role_name}',
1478 |             'role_name': role_name,
1479 |             'policy_name': policy_name,
1480 |         }
1481 | 
1482 |         logger.info(f'Successfully deleted inline policy {policy_name} from role: {role_name}')
1483 |         return result
1484 | 
1485 |     except Exception as e:
1486 |         error = handle_iam_error(e)
1487 |         logger.error(f'Error deleting inline policy: {error}')
1488 |         raise error
1489 | 
1490 | 
1491 | @mcp.tool()
1492 | async def list_user_policies(
1493 |     user_name: str = Field(description='The name of the IAM user'),
1494 | ) -> InlinePolicyListResponse:
1495 |     """List all inline policies for an IAM user.
1496 | 
1497 |     This tool retrieves the names of all inline policies attached to the specified user.
1498 | 
1499 |     Args:
1500 |         user_name: The name of the IAM user
1501 | 
1502 |     Returns:
1503 |         InlinePolicyListResponse containing the list of policy names
1504 |     """
1505 |     try:
1506 |         logger.info(f'Listing inline policies for user: {user_name}')
1507 | 
1508 |         if not user_name:
1509 |             raise IamValidationError('User name is required')
1510 | 
1511 |         iam = get_iam_client()
1512 | 
1513 |         response = iam.list_user_policies(UserName=user_name)
1514 | 
1515 |         result = InlinePolicyListResponse(
1516 |             policy_names=response.get('PolicyNames', []),
1517 |             user_name=user_name,
1518 |             role_name=None,
1519 |             count=len(response.get('PolicyNames', [])),
1520 |         )
1521 | 
1522 |         logger.info(f'Successfully listed {result.count} inline policies for user: {user_name}')
1523 |         return result
1524 | 
1525 |     except Exception as e:
1526 |         error = handle_iam_error(e)
1527 |         logger.error(f'Error listing inline policies: {error}')
1528 |         raise error
1529 | 
1530 | 
1531 | @mcp.tool()
1532 | async def list_role_policies(
1533 |     role_name: str = Field(description='The name of the IAM role'),
1534 | ) -> InlinePolicyListResponse:
1535 |     """List all inline policies for an IAM role.
1536 | 
1537 |     This tool retrieves the names of all inline policies attached to the specified role.
1538 | 
1539 |     Args:
1540 |         role_name: The name of the IAM role
1541 | 
1542 |     Returns:
1543 |         InlinePolicyListResponse containing the list of policy names
1544 |     """
1545 |     try:
1546 |         logger.info(f'Listing inline policies for role: {role_name}')
1547 | 
1548 |         if not role_name:
1549 |             raise IamValidationError('Role name is required')
1550 | 
1551 |         iam = get_iam_client()
1552 | 
1553 |         response = iam.list_role_policies(RoleName=role_name)
1554 | 
1555 |         result = InlinePolicyListResponse(
1556 |             policy_names=response.get('PolicyNames', []),
1557 |             user_name=None,
1558 |             role_name=role_name,
1559 |             count=len(response.get('PolicyNames', [])),
1560 |         )
1561 | 
1562 |         logger.info(f'Successfully listed {result.count} inline policies for role: {role_name}')
1563 |         return result
1564 | 
1565 |     except Exception as e:
1566 |         error = handle_iam_error(e)
1567 |         logger.error(f'Error listing inline policies: {error}')
1568 |         raise error
1569 | 
1570 | 
1571 | def main():
1572 |     """Run the MCP server with CLI argument support."""
1573 |     parser = argparse.ArgumentParser(
1574 |         description='An AWS Labs Model Context Protocol (MCP) server for comprehensive AWS IAM management'
1575 |     )
1576 |     parser.add_argument(
1577 |         '--readonly',
1578 |         action='store_true',
1579 |         help='Run server in read-only mode (prevents all mutating operations)',
1580 |     )
1581 | 
1582 |     args = parser.parse_args()
1583 | 
1584 |     # Set read-only mode if specified
1585 |     if args.readonly:
1586 |         Context.set_readonly(True)
1587 |         logger.info('Server started in READ-ONLY mode - all mutating operations are disabled')
1588 |     else:
1589 |         logger.info('Server started in FULL ACCESS mode')
1590 | 
1591 |     # Run the MCP server
1592 |     mcp.run()
1593 | 
1594 | 
1595 | if __name__ == '__main__':
1596 |     main()
1597 | 
```