#
tokens: 52563/50000 1/2435 files (page 377/389)
lines: off (toggle) GitHub
raw markdown copy
This is page 377 of 389. Use http://codebase.md/awslabs/mcp?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
├── 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
│   │   │           └── mutable_sql_detector.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
│   │   ├── 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
│   │   │       ├── 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
│   │   │       └── 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_server.py
│   │   │   ├── test_sitewise_access.py
│   │   │   ├── test_sitewise_asset_models.py
│   │   │   ├── test_sitewise_assets.py
│   │   │   ├── test_sitewise_data.py
│   │   │   ├── test_sitewise_gateways.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
│   │   ├── 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
│   │   │       ├── tools
│   │   │       │   ├── common
│   │   │       │   │   └── base_tool.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
│   │   │       │   ├── 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
│   │   │           ├── 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_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_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_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_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
│   │   │       ├── mutable_sql_detector.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── conftest.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/aws-iot-sitewise-mcp-server/tests/test_sitewise_data.py:
--------------------------------------------------------------------------------

```python
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Tests for AWS IoT SiteWise Data Ingestion and Retrieval Tools."""

import os
import pytest
import sys
from awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data import (
    batch_get_asset_property_aggregates,
    batch_get_asset_property_value,
    batch_get_asset_property_value_history,
    batch_put_asset_property_value,
    create_buffered_ingestion_job,
    create_bulk_import_iam_role,
    create_bulk_import_job,
    describe_bulk_import_job,
    execute_query,
    get_asset_property_aggregates,
    get_asset_property_value,
    get_asset_property_value_history,
    get_interpolated_asset_property_values,
    list_bulk_import_jobs,
)
from botocore.exceptions import ClientError
from unittest.mock import Mock, patch


# Add the project root directory and its parent to Python path
script_dir = os.path.dirname(os.path.abspath(__file__))
project_dir = os.path.dirname(script_dir)
sys.path.insert(0, project_dir)
sys.path.insert(0, os.path.dirname(project_dir))
sys.path.insert(0, os.path.dirname(os.path.dirname(project_dir)))


class TestSiteWiseData:
    """Test cases for SiteWise data ingestion and retrieval tools."""

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_batch_put_asset_property_value_success(self, mock_boto_client):
        """Test successful batch data ingestion."""
        # Mock the boto3 client
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        # Mock the response
        mock_response = {'errorEntries': []}
        mock_client.batch_put_asset_property_value.return_value = mock_response

        # Test data
        entries = [
            {
                'entryId': 'entry1',
                'assetId': 'test-asset-123',
                'propertyId': 'test-property-456',
                'propertyValues': [
                    {
                        'value': {'doubleValue': 25.5},
                        'timestamp': {'timeInSeconds': 1640995200},
                        'quality': 'GOOD',
                    }
                ],
            }
        ]

        # Call the function
        result = batch_put_asset_property_value(entries=entries, region='us-east-1')

        # Verify the result
        assert result['success'] is True
        assert result['error_entries'] == []

        # Verify the client was called correctly
        mock_client.batch_put_asset_property_value.assert_called_once_with(entries=entries)

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_get_asset_property_value_success(self, mock_boto_client):
        """Test successful property value retrieval."""
        # Mock the boto3 client
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        # Mock the response
        mock_response = {
            'propertyValue': {
                'value': {'doubleValue': 25.5},
                'timestamp': {'timeInSeconds': 1640995200},
                'quality': 'GOOD',
            }
        }
        mock_client.get_asset_property_value.return_value = mock_response

        # Call the function
        result = get_asset_property_value(
            asset_id='test-asset-123',
            property_id='test-property-456',
            region='us-east-1',
        )

        # Verify the result
        assert result['success'] is True
        assert result['value']['doubleValue'] == 25.5
        assert result['quality'] == 'GOOD'

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_get_asset_property_value_history_success(self, mock_boto_client):
        """Test successful property value history retrieval."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'assetPropertyValueHistory': [
                {
                    'value': {'doubleValue': 25.5},
                    'timestamp': {'timeInSeconds': 1640995200},
                },
                {
                    'value': {'doubleValue': 26.0},
                    'timestamp': {'timeInSeconds': 1640995260},
                },
            ],
            'nextToken': 'token-123',
        }
        mock_client.get_asset_property_value_history.return_value = mock_response

        result = get_asset_property_value_history(
            asset_id='test-asset-123',
            property_id='test-property-456',
            property_alias=None,
            start_date=None,
            end_date=None,
            qualities=None,
            time_ordering='ASCENDING',
            next_token=None,
            max_results=100,
            region='us-east-1',
        )

        assert result['success'] is True
        assert len(result['asset_property_value_history']) == 2

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_get_asset_property_aggregates_success(self, mock_boto_client):
        """Test successful property aggregates retrieval."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'aggregatedValues': [
                {
                    'timestamp': {'timeInSeconds': 1640995200},
                    'value': {'average': 25.5},
                },
            ],
            'nextToken': 'token-123',
        }
        mock_client.get_asset_property_aggregates.return_value = mock_response

        result = get_asset_property_aggregates(
            asset_id='test-asset-123',
            property_id='test-property-456',
            property_alias=None,
            aggregate_types=None,
            resolution='1h',
            start_date=None,
            end_date=None,
            qualities=None,
            time_ordering='ASCENDING',
            next_token=None,
            max_results=100,
            region='us-east-1',
        )

        assert result['success'] is True
        assert len(result['aggregated_values']) == 1

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_get_interpolated_asset_property_values_success(self, mock_boto_client):
        """Test successful interpolated values retrieval."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'interpolatedAssetPropertyValues': [
                {
                    'timestamp': {'timeInSeconds': 1640995200},
                    'value': {'doubleValue': 25.5},
                },
            ],
            'nextToken': 'token-123',
        }
        mock_client.get_interpolated_asset_property_values.return_value = mock_response

        result = get_interpolated_asset_property_values(
            asset_id='test-asset-123',
            property_id='test-property-456',
            start_time_in_seconds=1640995200,
            end_time_in_seconds=1640999000,
            region='us-east-1',
        )

        assert result['success'] is True
        assert len(result['interpolated_asset_property_values']) == 1

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_batch_get_asset_property_value_success(self, mock_boto_client):
        """Test successful batch get property values."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'successEntries': [
                {'entryId': 'entry1', 'propertyValue': {'value': {'doubleValue': 25.5}}}
            ],
            'skippedEntries': [],
            'errorEntries': [],
            'nextToken': 'token-123',
        }
        mock_client.batch_get_asset_property_value.return_value = mock_response

        entries = [{'entryId': 'entry1', 'assetId': 'asset-123', 'propertyId': 'prop-456'}]
        result = batch_get_asset_property_value(entries=entries, region='us-east-1')

        assert result['success'] is True
        assert len(result['success_entries']) == 1

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_batch_get_asset_property_value_history_success(self, mock_boto_client):
        """Test successful batch get property value history."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'successEntries': [{'entryId': 'entry1', 'assetPropertyValueHistory': []}],
            'skippedEntries': [],
            'errorEntries': [],
        }
        mock_client.batch_get_asset_property_value_history.return_value = mock_response

        entries = [{'entryId': 'entry1', 'assetId': 'asset-123', 'propertyId': 'prop-456'}]
        result = batch_get_asset_property_value_history(entries=entries, region='us-east-1')

        assert result['success'] is True
        assert len(result['success_entries']) == 1

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_batch_get_asset_property_aggregates_success(self, mock_boto_client):
        """Test successful batch get property aggregates."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'successEntries': [{'entryId': 'entry1', 'aggregatedValues': []}],
            'skippedEntries': [],
            'errorEntries': [],
        }
        mock_client.batch_get_asset_property_aggregates.return_value = mock_response

        entries = [{'entryId': 'entry1', 'assetId': 'asset-123', 'propertyId': 'prop-456'}]
        result = batch_get_asset_property_aggregates(entries=entries, region='us-east-1')

        assert result['success'] is True
        assert len(result['success_entries']) == 1

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_execute_query_success(self, mock_boto_client):
        """Test successful query execution."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'columns': [{'name': 'asset_id', 'type': {'scalarType': 'VARCHAR'}}],
            'rows': [{'data': [{'scalarValue': 'asset-123'}]}],
            'nextToken': 'token-123',
            'queryStatistics': {'queryExecutionTime': 100},
            'queryStatus': 'COMPLETED',
        }
        mock_client.execute_query.return_value = mock_response

        result = execute_query(
            query_statement='SELECT asset_id FROM asset',
            region='us-east-1',
            next_token=None,
            max_results=100,
        )

        assert result['success'] is True
        assert len(result['columns']) == 1
        assert len(result['rows']) == 1
        assert result['query_status'] == 'COMPLETED'

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_execute_query_validation_errors(self, mock_boto_client):
        """Test validation errors in execute_query."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        # Test empty query
        result = execute_query(query_statement='', region='us-east-1')
        assert result['success'] is False
        assert result['error_code'] == 'ValidationException'

        # Test query too long
        result = execute_query(query_statement='a' * 70000, region='us-east-1')
        assert result['success'] is False
        assert result['error_code'] == 'ValidationException'

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_client_error_handling(self, mock_boto_client):
        """Test ClientError handling."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        error_response = {'Error': {'Code': 'InvalidRequestException', 'Message': 'Invalid query'}}
        mock_client.execute_query.side_effect = ClientError(error_response, 'ExecuteQuery')

        result = execute_query(
            query_statement='SELECT * FROM invalid_table',
            region='us-east-1',
            next_token=None,
            max_results=100,
        )

        assert result['success'] is False
        assert result['error_code'] == 'InvalidRequestException'

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_get_asset_property_value_with_all_params(self, mock_boto_client):
        """Test get asset property value with all optional parameters."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'propertyValue': {
                'value': {'doubleValue': 42.5},
                'timestamp': {'timeInSeconds': 1609459200, 'offsetInNanos': 0},
                'quality': 'GOOD',
            }
        }
        mock_client.get_asset_property_value.return_value = mock_response

        # Test with asset_id and property_id
        result = get_asset_property_value(
            asset_id='test-asset-123',
            property_id='test-prop-456',
            property_alias=None,
            region='us-west-2',
        )

        assert result['success'] is True
        mock_client.get_asset_property_value.assert_called_once_with(
            assetId='test-asset-123', propertyId='test-prop-456'
        )

        # Test with property_alias only
        mock_client.reset_mock()
        result = get_asset_property_value(
            asset_id=None,
            property_id=None,
            property_alias='/company/plant/temperature',
            region='us-east-1',
        )

        assert result['success'] is True
        mock_client.get_asset_property_value.assert_called_once_with(
            propertyAlias='/company/plant/temperature'
        )

        # Test with all parameters
        mock_client.reset_mock()
        result = get_asset_property_value(
            asset_id='test-asset-123',
            property_id='test-prop-456',
            property_alias='/company/plant/temperature',
            region='us-west-2',
        )

        assert result['success'] is True
        mock_client.get_asset_property_value.assert_called_once_with(
            assetId='test-asset-123',
            propertyId='test-prop-456',
            propertyAlias='/company/plant/temperature',
        )

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_get_asset_property_value_history_with_all_params(self, mock_boto_client):
        """Test get asset property value history with all optional parameters."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'assetPropertyValueHistory': [
                {
                    'value': {'doubleValue': 42.5},
                    'timestamp': {'timeInSeconds': 1609459200, 'offsetInNanos': 0},
                    'quality': 'GOOD',
                }
            ],
            'nextToken': 'next-token-123',
        }
        mock_client.get_asset_property_value_history.return_value = mock_response

        result = get_asset_property_value_history(
            asset_id='test-asset-123',
            property_id='test-prop-456',
            property_alias='/company/plant/temperature',
            start_date='2021-01-01T00:00:00Z',
            end_date='2021-01-02T00:00:00Z',
            qualities=['GOOD', 'BAD'],
            time_ordering='DESCENDING',
            next_token='prev-token',
            max_results=200,
            region='us-west-2',
        )

        assert result['success'] is True
        assert len(result['asset_property_value_history']) == 1
        assert result['next_token'] == 'next-token-123'

        # Verify datetime parsing and all parameters were passed
        call_args = mock_client.get_asset_property_value_history.call_args[1]
        assert call_args['assetId'] == 'test-asset-123'
        assert call_args['propertyId'] == 'test-prop-456'
        assert call_args['propertyAlias'] == '/company/plant/temperature'
        assert call_args['qualities'] == ['GOOD', 'BAD']
        assert call_args['timeOrdering'] == 'DESCENDING'
        assert call_args['nextToken'] == 'prev-token'
        assert call_args['maxResults'] == 200

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_get_asset_property_aggregates_with_all_params(self, mock_boto_client):
        """Test get asset property aggregates with all optional parameters."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'aggregatedValues': [
                {
                    'timestamp': {'timeInSeconds': 1609459200, 'offsetInNanos': 0},
                    'quality': 'GOOD',
                    'value': {'average': 42.5, 'count': 10},
                }
            ],
            'nextToken': 'next-token-123',
        }
        mock_client.get_asset_property_aggregates.return_value = mock_response

        # Test with custom aggregate types
        result = get_asset_property_aggregates(
            asset_id='test-asset-123',
            property_id='test-prop-456',
            property_alias='/company/plant/temperature',
            aggregate_types=['AVERAGE', 'MAXIMUM', 'MINIMUM'],
            resolution='15m',
            start_date='2021-01-01T00:00:00Z',
            end_date='2021-01-02T00:00:00Z',
            qualities=['GOOD'],
            time_ordering='DESCENDING',
            next_token='prev-token',
            max_results=500,
            region='us-west-2',
        )

        assert result['success'] is True
        assert len(result['aggregated_values']) == 1

        # Test with default aggregate types (None)
        mock_client.reset_mock()
        result = get_asset_property_aggregates(
            asset_id='test-asset-123',
            property_id='test-prop-456',
            property_alias=None,
            aggregate_types=None,  # Should default to ["AVERAGE"]
            resolution='1h',
            start_date=None,
            end_date=None,
            qualities=None,
            time_ordering='ASCENDING',
            next_token=None,
            max_results=100,
            region='us-east-1',
        )

        assert result['success'] is True
        call_args = mock_client.get_asset_property_aggregates.call_args[1]
        assert call_args['aggregateTypes'] == ['AVERAGE']

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_get_interpolated_asset_property_values_with_all_params(self, mock_boto_client):
        """Test get interpolated asset property values with all optional parameters."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'interpolatedAssetPropertyValues': [
                {
                    'timestamp': {'timeInSeconds': 1609459200, 'offsetInNanos': 0},
                    'value': {'doubleValue': 42.5},
                }
            ],
            'nextToken': 'next-token-123',
        }
        mock_client.get_interpolated_asset_property_values.return_value = mock_response

        result = get_interpolated_asset_property_values(
            asset_id='test-asset-123',
            property_id='test-prop-456',
            property_alias='/company/plant/temperature',
            start_time_in_seconds=1609459200,
            end_time_in_seconds=1609545600,
            quality='GOOD',
            interval_in_seconds=1800,
            next_token='prev-token',
            max_results=250,
            interpolation_type='LOCF_INTERPOLATION',
            interval_window_in_seconds=900,
            region='us-west-2',
        )

        assert result['success'] is True
        assert len(result['interpolated_asset_property_values']) == 1

        # Verify all parameters were passed correctly
        call_args = mock_client.get_interpolated_asset_property_values.call_args[1]
        assert call_args['assetId'] == 'test-asset-123'
        assert call_args['propertyId'] == 'test-prop-456'
        assert call_args['propertyAlias'] == '/company/plant/temperature'
        assert call_args['startTimeInSeconds'] == 1609459200
        assert call_args['endTimeInSeconds'] == 1609545600
        assert call_args['quality'] == 'GOOD'
        assert call_args['intervalInSeconds'] == 1800
        assert call_args['nextToken'] == 'prev-token'
        assert call_args['maxResults'] == 250
        assert call_args['type'] == 'LOCF_INTERPOLATION'
        assert call_args['intervalWindowInSeconds'] == 900

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_batch_get_asset_property_value_with_next_token(self, mock_boto_client):
        """Test batch get asset property value with next token."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'successEntries': [{'entryId': 'entry1'}],
            'skippedEntries': [],
            'errorEntries': [],
            'nextToken': 'next-token-123',
        }
        mock_client.batch_get_asset_property_value.return_value = mock_response

        entries = [{'entryId': 'entry1', 'assetId': 'asset-123', 'propertyId': 'prop-456'}]

        # Test with next_token
        result = batch_get_asset_property_value(
            entries=entries, next_token='prev-token', region='us-west-2'
        )

        assert result['success'] is True
        mock_client.batch_get_asset_property_value.assert_called_once_with(
            entries=entries, nextToken='prev-token'
        )

        # Test without next_token
        mock_client.reset_mock()
        result = batch_get_asset_property_value(
            entries=entries,
            next_token=None,
            region='us-east-1',
        )

        assert result['success'] is True
        mock_client.batch_get_asset_property_value.assert_called_once_with(entries=entries)

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_batch_get_asset_property_value_history_with_next_token(self, mock_boto_client):
        """Test batch get asset property value history with next token."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'successEntries': [{'entryId': 'entry1'}],
            'skippedEntries': [],
            'errorEntries': [],
            'nextToken': 'next-token-123',
        }
        mock_client.batch_get_asset_property_value_history.return_value = mock_response

        entries = [{'entryId': 'entry1', 'assetId': 'asset-123', 'propertyId': 'prop-456'}]

        # Test with next_token
        result = batch_get_asset_property_value_history(
            entries=entries,
            next_token='prev-token',
            max_results=500,
            region='us-west-2',
        )

        assert result['success'] is True
        mock_client.batch_get_asset_property_value_history.assert_called_once_with(
            entries=entries, maxResults=500, nextToken='prev-token'
        )

        # Test without next_token
        mock_client.reset_mock()
        result = batch_get_asset_property_value_history(
            entries=entries,
            next_token=None,
            max_results=200,
            region='us-east-1',
        )

        assert result['success'] is True
        mock_client.batch_get_asset_property_value_history.assert_called_once_with(
            entries=entries, maxResults=200
        )

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_batch_get_asset_property_aggregates_with_next_token(self, mock_boto_client):
        """Test batch get asset property aggregates with next token."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'successEntries': [{'entryId': 'entry1'}],
            'skippedEntries': [],
            'errorEntries': [],
            'nextToken': 'next-token-123',
        }
        mock_client.batch_get_asset_property_aggregates.return_value = mock_response

        entries = [{'entryId': 'entry1', 'assetId': 'asset-123', 'propertyId': 'prop-456'}]

        # Test with next_token
        result = batch_get_asset_property_aggregates(
            entries=entries,
            next_token='prev-token',
            max_results=750,
            region='us-west-2',
        )

        assert result['success'] is True
        mock_client.batch_get_asset_property_aggregates.assert_called_once_with(
            entries=entries, maxResults=750, nextToken='prev-token'
        )

        # Test without next_token
        mock_client.reset_mock()
        result = batch_get_asset_property_aggregates(
            entries=entries,
            next_token=None,
            max_results=300,
            region='us-east-1',
        )

        assert result['success'] is True
        mock_client.batch_get_asset_property_aggregates.assert_called_once_with(
            entries=entries, maxResults=300
        )

    def test_execute_query_additional_validation_errors(self):
        """Test execute query validation error cases."""
        # Test empty query
        result = execute_query(
            query_statement='',
            region='us-east-1',
            next_token=None,
            max_results=100,
        )
        assert result['success'] is False
        assert 'Query statement cannot be empty' in result['error']

        # Test whitespace-only query
        result = execute_query(
            query_statement='   ',
            region='us-east-1',
            next_token=None,
            max_results=100,
        )
        assert result['success'] is False
        assert 'Query statement cannot be empty' in result['error']

        # Test query too long (over 64KB)
        long_query = "SELECT * FROM asset WHERE asset_name = '" + 'x' * 65537 + "'"
        result = execute_query(
            query_statement=long_query,
            region='us-east-1',
            next_token=None,
            max_results=100,
        )
        assert result['success'] is False
        assert 'Query statement cannot exceed 64KB' in result['error']

        # Test next token too long
        result = execute_query(
            query_statement='SELECT asset_id FROM asset',
            region='us-east-1',
            next_token='x' * 4097,  # Exceeds 4096 character limit
            max_results=100,
        )
        assert result['success'] is False
        assert 'Next token too long' in result['error']

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_execute_query_with_all_params(self, mock_boto_client):
        """Test execute query with all optional parameters."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'columns': [{'name': 'asset_id', 'type': {'scalarType': 'VARCHAR'}}],
            'rows': [{'data': [{'scalarValue': 'asset-123'}]}],
            'nextToken': 'next-token-123',
            'queryStatistics': {'scannedRows': 100, 'executionTimeInMillis': 250},
            'queryStatus': 'COMPLETED',
        }
        mock_client.execute_query.return_value = mock_response

        query = "SELECT asset_id, asset_name FROM asset WHERE asset_name LIKE 'Test%'"
        result = execute_query(
            query_statement=query,
            region='us-west-2',
            next_token='prev-token',
            max_results=2000,
        )

        assert result['success'] is True
        assert len(result['columns']) == 1
        assert len(result['rows']) == 1
        assert result['next_token'] == 'next-token-123'
        assert result['query_statistics']['scannedRows'] == 100
        assert result['query_status'] == 'COMPLETED'

        mock_client.execute_query.assert_called_once_with(
            queryStatement=query, maxResults=2000, nextToken='prev-token'
        )

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_execute_query_without_optional_params(self, mock_boto_client):
        """Test execute query without optional parameters."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_response = {
            'columns': [],
            'rows': [],
            'queryStatistics': {},
            'queryStatus': 'COMPLETED',
        }
        mock_client.execute_query.return_value = mock_response

        query = 'SELECT COUNT(*) FROM asset'
        result = execute_query(
            query_statement=query,
            region='us-east-1',
            next_token=None,
            max_results=100,
        )

        assert result['success'] is True

        # Verify only required parameters were passed
        mock_client.execute_query.assert_called_once_with(queryStatement=query, maxResults=100)

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_all_functions_client_error_handling(self, mock_boto_client):
        """Test that all functions handle ClientError exceptions properly."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        error_response = {
            'Error': {
                'Code': 'InternalFailureException',
                'Message': 'Internal server error',
            }
        }

        # Test batch_put_asset_property_value error handling
        mock_client.batch_put_asset_property_value.side_effect = ClientError(
            error_response, 'BatchPutAssetPropertyValue'
        )
        result = batch_put_asset_property_value(entries=[{'entryId': 'test'}])
        assert result['success'] is False
        assert result['error_code'] == 'InternalFailureException'

        # Test get_asset_property_value error handling
        mock_client.get_asset_property_value.side_effect = ClientError(
            error_response, 'GetAssetPropertyValue'
        )
        result = get_asset_property_value(
            asset_id='test-123',
            property_id=None,
            property_alias=None,
            region='us-east-1',
        )
        assert result['success'] is False
        assert result['error_code'] == 'InternalFailureException'

        # Test get_asset_property_value_history error handling
        mock_client.get_asset_property_value_history.side_effect = ClientError(
            error_response, 'GetAssetPropertyValueHistory'
        )
        result = get_asset_property_value_history(
            asset_id='test-123',
            property_id=None,
            property_alias=None,
            start_date=None,
            end_date=None,
            qualities=None,
            time_ordering='ASCENDING',
            next_token=None,
            max_results=100,
            region='us-east-1',
        )
        assert result['success'] is False
        assert result['error_code'] == 'InternalFailureException'

        # Test get_asset_property_aggregates error handling
        mock_client.get_asset_property_aggregates.side_effect = ClientError(
            error_response, 'GetAssetPropertyAggregates'
        )
        result = get_asset_property_aggregates(
            asset_id='test-123',
            property_id=None,
            property_alias=None,
            aggregate_types=None,
            resolution='1h',
            start_date=None,
            end_date=None,
            qualities=None,
            time_ordering='ASCENDING',
            next_token=None,
            max_results=100,
            region='us-east-1',
        )
        assert result['success'] is False
        assert result['error_code'] == 'InternalFailureException'

        # Test get_interpolated_asset_property_values error handling
        mock_client.get_interpolated_asset_property_values.side_effect = ClientError(
            error_response, 'GetInterpolatedAssetPropertyValues'
        )
        result = get_interpolated_asset_property_values(
            asset_id='test-123',
            start_time_in_seconds=1609459200,
            end_time_in_seconds=1609545600,
        )
        assert result['success'] is False
        assert result['error_code'] == 'InternalFailureException'

        # Test batch_get_asset_property_value error handling
        mock_client.batch_get_asset_property_value.side_effect = ClientError(
            error_response, 'BatchGetAssetPropertyValue'
        )
        result = batch_get_asset_property_value(
            entries=[{'entryId': 'test'}],
            next_token=None,
            region='us-east-1',
        )
        assert result['success'] is False
        assert result['error_code'] == 'InternalFailureException'

        # Test batch_get_asset_property_value_history error handling
        mock_client.batch_get_asset_property_value_history.side_effect = ClientError(
            error_response, 'BatchGetAssetPropertyValueHistory'
        )
        result = batch_get_asset_property_value_history(
            entries=[{'entryId': 'test'}],
            next_token=None,
            max_results=100,
            region='us-east-1',
        )
        assert result['success'] is False
        assert result['error_code'] == 'InternalFailureException'

        # Test batch_get_asset_property_aggregates error handling
        mock_client.batch_get_asset_property_aggregates.side_effect = ClientError(
            error_response, 'BatchGetAssetPropertyAggregates'
        )
        result = batch_get_asset_property_aggregates(
            entries=[{'entryId': 'test'}],
            next_token=None,
            max_results=100,
            region='us-east-1',
        )
        assert result['success'] is False
        assert result['error_code'] == 'InternalFailureException'

        # Test execute_query error handling
        mock_client.execute_query.side_effect = ClientError(error_response, 'ExecuteQuery')
        result = execute_query(
            query_statement='SELECT asset_id FROM asset',
            region='us-east-1',
            next_token=None,
            max_results=100,
        )
        assert result['success'] is False
        assert result['error_code'] == 'InternalFailureException'

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_iam_client')
    def test_create_bulk_import_iam_role_success(self, mock_create_iam_client):
        """Test successful IAM role creation for bulk import."""
        mock_iam_client = Mock()
        mock_create_iam_client.return_value = mock_iam_client

        mock_iam_client.create_role.return_value = {
            'Role': {'Arn': 'arn:aws:iam::123456789012:role/TestRole'}
        }

        result = create_bulk_import_iam_role(
            role_name='TestRole',
            data_bucket_names=['test-data-bucket'],
            error_bucket_name='test-error-bucket',
            region='us-east-1',
        )

        assert result['success'] is True
        assert result['role_arn'] == 'arn:aws:iam::123456789012:role/TestRole'
        assert result['role_name'] == 'TestRole'
        mock_iam_client.create_role.assert_called_once()
        mock_iam_client.put_role_policy.assert_called_once()

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_iam_client')
    def test_create_bulk_import_iam_role_error(self, mock_create_iam_client):
        """Test IAM role creation error handling."""
        mock_iam_client = Mock()
        mock_create_iam_client.return_value = mock_iam_client

        error_response = {
            'Error': {'Code': 'EntityAlreadyExistsException', 'Message': 'Role already exists'}
        }
        mock_iam_client.create_role.side_effect = ClientError(error_response, 'CreateRole')

        result = create_bulk_import_iam_role(
            role_name='ExistingRole',
            data_bucket_names=['test-bucket'],
            error_bucket_name='error-bucket',
        )

        assert result['success'] is False
        assert 'error' in result

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_create_bulk_import_job_success(self, mock_boto_client):
        """Test successful bulk import job creation."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_client.create_bulk_import_job.return_value = {
            'jobId': 'test-job-id',
            'jobName': 'test-job',
            'jobStatus': 'PENDING',
        }

        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {
                    'csv': {'columnNames': ['ALIAS', 'VALUE', 'DATA_TYPE', 'TIMESTAMP_SECONDS']}
                }
            },
            adaptive_ingestion=True,
        )

        assert result['success'] is True
        assert result['job_id'] == 'test-job-id'
        assert result['job_name'] == 'test-job'
        mock_client.create_bulk_import_job.assert_called_once()

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_create_buffered_ingestion_job_success(self, mock_boto_client):
        """Test successful buffered ingestion job creation."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_client.create_bulk_import_job.return_value = {
            'jobId': 'buffered-job-id',
            'jobName': 'buffered-job',
            'jobStatus': 'PENDING',
        }

        result = create_buffered_ingestion_job(
            job_name='buffered-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {
                    'csv': {'columnNames': ['ALIAS', 'VALUE', 'DATA_TYPE', 'TIMESTAMP_SECONDS']}
                }
            },
        )

        assert result['success'] is True
        assert result['job_id'] == 'buffered-job-id'
        mock_client.create_bulk_import_job.assert_called_once()
        # Verify adaptive_ingestion was set to True
        call_args = mock_client.create_bulk_import_job.call_args[1]
        assert call_args['adaptiveIngestion'] is True

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_describe_bulk_import_job_success(self, mock_boto_client):
        """Test successful bulk import job description."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_client.describe_bulk_import_job.return_value = {
            'jobId': '12345678-1234-1234-1234-123456789012',
            'jobName': 'test-job',
            'jobStatus': 'COMPLETED',
            'jobRoleArn': 'arn:aws:iam::123456789012:role/TestRole',
        }

        result = describe_bulk_import_job(job_id='12345678-1234-1234-1234-123456789012')

        assert result['success'] is True
        assert result['job_id'] == '12345678-1234-1234-1234-123456789012'
        assert result['job_status'] == 'COMPLETED'
        mock_client.describe_bulk_import_job.assert_called_once_with(
            jobId='12345678-1234-1234-1234-123456789012'
        )

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_list_bulk_import_jobs_success(self, mock_boto_client):
        """Test successful bulk import jobs listing."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        mock_client.list_bulk_import_jobs.return_value = {
            'jobSummaries': [
                {'jobId': 'job1', 'jobName': 'test-job-1', 'jobStatus': 'COMPLETED'},
                {'jobId': 'job2', 'jobName': 'test-job-2', 'jobStatus': 'PENDING'},
            ]
        }

        result = list_bulk_import_jobs()

        assert result['success'] is True
        assert len(result['job_summaries']) == 2
        assert result['job_summaries'][0]['jobId'] == 'job1'
        mock_client.list_bulk_import_jobs.assert_called_once()

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_bulk_import_job_error_handling(self, mock_boto_client):
        """Test bulk import job error handling."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client

        error_response = {'Error': {'Code': 'ValidationException', 'Message': 'Invalid job name'}}
        mock_client.create_bulk_import_job.side_effect = ClientError(
            error_response, 'CreateBulkImportJob'
        )

        result = create_bulk_import_job(
            job_name='',  # Invalid empty name
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={'fileFormat': {'csv': {'columnNames': ['ALIAS', 'VALUE']}}},
            adaptive_ingestion=True,
        )

        assert result['success'] is False
        assert result['error_code'] == 'ValidationException'

    def test_bulk_import_csv_validation_missing_column_names(self):
        """Test CSV validation fails when columnNames is missing."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={'fileFormat': {'csv': {}}},
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'CSV configuration must have "columnNames" field' in result['error']

    def test_bulk_import_csv_validation_empty_column_names(self):
        """Test CSV validation fails when columnNames is empty."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={'fileFormat': {'csv': {'columnNames': []}}},
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'CSV columnNames must be a non-empty list' in result['error']

    def test_bulk_import_csv_validation_invalid_column_name(self):
        """Test CSV validation fails with invalid column name."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={'fileFormat': {'csv': {'columnNames': ['INVALID_COLUMN']}}},
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Invalid column name: INVALID_COLUMN' in result['error']

    def test_bulk_import_csv_validation_all_three_identifiers(self):
        """Test CSV validation fails when ASSET_ID, PROPERTY_ID, and ALIAS are all present."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {
                    'csv': {
                        'columnNames': [
                            'ASSET_ID',
                            'PROPERTY_ID',
                            'ALIAS',
                            'TIMESTAMP_SECONDS',
                            'VALUE',
                            'DATA_TYPE',
                        ]
                    }
                }
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'CSV cannot include ASSET_ID, PROPERTY_ID, and ALIAS together' in result['error']

    def test_bulk_import_csv_validation_asset_id_without_property_id(self):
        """Test CSV validation fails when ASSET_ID is present without PROPERTY_ID."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {
                    'csv': {'columnNames': ['ASSET_ID', 'TIMESTAMP_SECONDS', 'VALUE', 'DATA_TYPE']}
                }
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'CSV with ASSET_ID must also include PROPERTY_ID' in result['error']

    def test_bulk_import_csv_validation_property_id_without_asset_id(self):
        """Test CSV validation fails when PROPERTY_ID is present without ASSET_ID."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {
                    'csv': {
                        'columnNames': ['PROPERTY_ID', 'TIMESTAMP_SECONDS', 'VALUE', 'DATA_TYPE']
                    }
                }
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'CSV with PROPERTY_ID must also include ASSET_ID' in result['error']

    def test_bulk_import_csv_validation_no_identifier_columns(self):
        """Test CSV validation fails when no identifier columns are present."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {'csv': {'columnNames': ['TIMESTAMP_SECONDS', 'VALUE', 'DATA_TYPE']}}
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'CSV must include either ALIAS or both ASSET_ID and PROPERTY_ID' in result['error']

    def test_bulk_import_csv_validation_missing_required_columns(self):
        """Test CSV validation fails when required columns are missing."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS']}}
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'CSV missing required columns' in result['error']

    def test_bulk_import_invalid_file_format(self):
        """Test validation fails when neither CSV nor Parquet is specified."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.txt'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={'fileFormat': {'invalid': {}}},
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'File format must specify either "csv" or "parquet"' in result['error']

    def test_bulk_import_missing_file_format(self):
        """Test validation fails when fileFormat is missing."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={},
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Job configuration must have "fileFormat" field' in result['error']

    def test_bulk_import_invalid_file_format_type(self):
        """Test validation fails when fileFormat is not a dictionary."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={'fileFormat': 'invalid'},
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'File format must be a dictionary' in result['error']

    def test_describe_bulk_import_job_empty_job_id(self):
        """Test validation fails with empty job ID."""
        result = describe_bulk_import_job(job_id='')
        assert result['success'] is False
        assert 'Job ID must be a non-empty string' in result['error']

    def test_describe_bulk_import_job_invalid_uuid_length(self):
        """Test validation fails with incorrect UUID length."""
        result = describe_bulk_import_job(job_id='12345678-1234-1234-1234-12345678901')  # 35 chars
        assert result['success'] is False
        assert 'Job ID must be in UUID format' in result['error']

    def test_describe_bulk_import_job_invalid_uuid_hyphens(self):
        """Test validation fails with incorrect number of hyphens."""
        result = describe_bulk_import_job(
            job_id='123456781234123412341234567890123456'
        )  # 36 chars, no hyphens
        assert result['success'] is False
        assert 'Job ID must be in UUID format' in result['error']

    def test_describe_bulk_import_job_invalid_uuid_format(self):
        """Test validation fails with wrong hyphen positions."""
        result = describe_bulk_import_job(
            job_id='1234567-8123-1234-1234-567890123456',  # 37 chars - too long
            region='us-east-1',
        )
        assert result['success'] is False
        assert 'Job ID must be in UUID format' in result['error']

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_bulk_import_csv_validation_valid_asset_property_combo(self, mock_boto_client):
        """Test CSV validation passes with valid ASSET_ID + PROPERTY_ID combination."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client
        mock_client.describe_storage_configuration.return_value = {
            'storageType': 'SITEWISE_DEFAULT_STORAGE',
            'warmTier': {'state': 'ENABLED'},
        }
        mock_client.create_bulk_import_job.return_value = {
            'jobId': 'test-job-id',
            'jobName': 'test-job',
            'jobStatus': 'PENDING',
        }

        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {
                    'csv': {
                        'columnNames': [
                            'ASSET_ID',
                            'PROPERTY_ID',
                            'TIMESTAMP_SECONDS',
                            'VALUE',
                            'DATA_TYPE',
                        ]
                    }
                }
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is True

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_bulk_import_parquet_validation_valid(self, mock_boto_client):
        """Test Parquet validation passes with valid configuration."""
        mock_client = Mock()
        mock_boto_client.return_value = mock_client
        mock_client.describe_storage_configuration.return_value = {
            'storageType': 'SITEWISE_DEFAULT_STORAGE',
            'warmTier': {'state': 'ENABLED'},
        }
        mock_client.create_bulk_import_job.return_value = {
            'jobId': 'test-job-id',
            'jobName': 'test-job',
            'jobStatus': 'PENDING',
        }

        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.parquet'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={'fileFormat': {'parquet': {}}},
            adaptive_ingestion=True,
        )
        assert result['success'] is True

    def test_buffered_ingestion_job_inherits_csv_validation(self):
        """Test that buffered ingestion job inherits CSV validation from bulk import."""
        result = create_buffered_ingestion_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={'fileFormat': {'csv': {'columnNames': ['INVALID_COLUMN']}}},
        )
        assert result['success'] is False
        assert 'Invalid column name: INVALID_COLUMN' in result['error']

    def test_create_bulk_import_job_adaptive_ingestion_not_boolean(self):
        """Test validation fails when adaptive_ingestion is not boolean."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {
                    'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE', 'DATA_TYPE']}
                }
            },
            adaptive_ingestion='not_boolean',  # Invalid type
            region='us-east-1',
        )
        assert result['success'] is False
        assert 'Please provide a boolean value for adaptive_ingestion' in result['error']

    def test_create_bulk_import_job_control_characters_in_name(self):
        """Test validation fails with control characters in job name."""
        result = create_bulk_import_job(
            job_name='test\x00job',  # Contains null character
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {
                    'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE', 'DATA_TYPE']}
                }
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Job name cannot contain control characters' in result['error']

    def test_create_bulk_import_job_missing_job_role_arn(self):
        """Test validation fails with missing job role ARN."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='',  # Empty ARN
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE']}}
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Job role ARN is required' in result['error']

    def test_create_bulk_import_job_invalid_arn_format(self):
        """Test validation fails with invalid ARN format."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='invalid-arn-format',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE']}}
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Job role ARN must be a valid AWS ARN' in result['error']

    def test_create_bulk_import_job_arn_too_long(self):
        """Test validation fails with ARN too long."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/' + 'a' * 1600,  # Too long
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE']}}
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Job role ARN must be between 1 and 1600 characters' in result['error']

    def test_create_bulk_import_job_files_not_list(self):
        """Test validation fails when files is not a list."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files='not-a-list',  # Invalid type
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE']}}
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Files must be a non-empty list' in result['error']

    def test_create_bulk_import_job_file_not_dict(self):
        """Test validation fails when file is not a dictionary."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=['not-a-dict'],  # Invalid type
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE']}}
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Each file must be a dictionary' in result['error']

    def test_create_bulk_import_job_file_missing_bucket_key(self):
        """Test validation fails when file missing bucket or key."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket'}],  # Missing key
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE']}}
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Each file must have "bucket" and "key" fields' in result['error']

    def test_create_bulk_import_job_bucket_name_too_short(self):
        """Test validation fails with bucket name too short."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'ab', 'key': 'test.csv'}],  # Too short
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE']}}
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'S3 bucket name must be between 3 and 63 characters' in result['error']

    def test_create_bulk_import_job_error_location_not_dict(self):
        """Test validation fails when error report location is not dict."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location='not-a-dict',  # Invalid type
            job_configuration={
                'fileFormat': {'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE']}}
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Error report location must be a dictionary' in result['error']

    def test_create_bulk_import_job_error_location_missing_fields(self):
        """Test validation fails when error location missing fields."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket'},  # Missing prefix
            job_configuration={
                'fileFormat': {'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE']}}
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Error report location must have "bucket" and "prefix" fields' in result['error']

    def test_create_bulk_import_job_error_prefix_no_slash(self):
        """Test validation fails when error prefix doesn't end with slash."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={
                'bucket': 'error-bucket',
                'prefix': 'errors',
            },  # No trailing slash
            job_configuration={
                'fileFormat': {'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE']}}
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Error report prefix must end with a forward slash (/)' in result['error']

    def test_create_bulk_import_job_config_not_dict(self):
        """Test validation fails when job configuration is not dict."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration='not-a-dict',  # Invalid type
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Job configuration must be a dictionary' in result['error']

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_create_bulk_import_job_client_error(self, mock_create_client):
        """Test handling of AWS client errors."""
        mock_client = Mock()
        mock_create_client.return_value = mock_client
        mock_client.describe_storage_configuration.side_effect = ClientError(
            {'Error': {'Code': 'AccessDenied', 'Message': 'Access denied'}},
            'DescribeStorageConfiguration',
        )

        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'error-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {
                    'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE', 'DATA_TYPE']}
                }
            },
            adaptive_ingestion=False,  # This will trigger storage config check
            region='us-east-1',
        )
        assert result['success'] is False
        assert 'Failed to validate storage configuration' in result['error']

    def test_create_bulk_import_job_error_bucket_too_short(self):
        """Test create_bulk_import_job with error bucket name too short."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'ab', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {
                    'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE', 'QUALITY']}
                }
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Error report bucket name must be between 3 and 63 characters' in result['error']

    def test_create_bulk_import_job_prefix_no_slash(self):
        """Test create_bulk_import_job with prefix not ending in slash."""
        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'test-bucket', 'prefix': 'errors'},
            job_configuration={
                'fileFormat': {
                    'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE', 'QUALITY']}
                }
            },
            adaptive_ingestion=True,
        )
        assert result['success'] is False
        assert 'Error report prefix must end with a forward slash' in result['error']

    def test_list_bulk_import_jobs_invalid_filter(self):
        """Test list_bulk_import_jobs with invalid filter."""
        result = list_bulk_import_jobs(filter='INVALID')
        assert result['success'] is False
        assert 'Invalid filter: INVALID' in result['error']

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_list_bulk_import_jobs_client_error(self, mock_client):
        """Test list_bulk_import_jobs with AWS client error."""
        mock_sitewise = Mock()
        mock_client.return_value = mock_sitewise
        mock_sitewise.list_bulk_import_jobs.side_effect = ClientError(
            {'Error': {'Code': 'AccessDenied', 'Message': 'Access denied'}}, 'ListBulkImportJobs'
        )

        result = list_bulk_import_jobs()

        assert result['success'] is False
        assert result['error_code'] == 'AccessDenied'

    @patch(
        'awslabs.aws_iot_sitewise_mcp_server.validation.check_storage_configuration_requirements'
    )
    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_create_bulk_import_job_aws_error(self, mock_client, mock_storage):
        """Test create_bulk_import_job AWS ClientError handling."""
        mock_storage.return_value = None
        mock_sitewise = Mock()
        mock_client.return_value = mock_sitewise
        mock_sitewise.create_bulk_import_job.side_effect = ClientError(
            {'Error': {'Code': 'AccessDenied', 'Message': 'Access denied'}}, 'CreateBulkImportJob'
        )

        result = create_bulk_import_job(
            job_name='test-job',
            job_role_arn='arn:aws:iam::123456789012:role/TestRole',
            files=[{'bucket': 'test-bucket', 'key': 'test.csv'}],
            error_report_location={'bucket': 'test-bucket', 'prefix': 'errors/'},
            job_configuration={
                'fileFormat': {
                    'csv': {'columnNames': ['ALIAS', 'TIMESTAMP_SECONDS', 'VALUE', 'DATA_TYPE']}
                }
            },
            adaptive_ingestion=True,
        )

        assert result['success'] is False
        assert result['error_code'] == 'AccessDenied'

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_list_bulk_import_jobs_aws_error(self, mock_client):
        """Test list_bulk_import_jobs AWS ClientError handling."""
        mock_sitewise = Mock()
        mock_client.return_value = mock_sitewise
        mock_sitewise.list_bulk_import_jobs.side_effect = ClientError(
            {'Error': {'Code': 'ThrottlingException', 'Message': 'Rate exceeded'}},
            'ListBulkImportJobs',
        )

        result = list_bulk_import_jobs()

        assert result['success'] is False
        assert result['error_code'] == 'ThrottlingException'

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_describe_bulk_import_job_aws_error(self, mock_client):
        """Test describe_bulk_import_job AWS ClientError handling."""
        mock_sitewise = Mock()
        mock_client.return_value = mock_sitewise
        mock_sitewise.describe_bulk_import_job.side_effect = ClientError(
            {'Error': {'Code': 'ResourceNotFound', 'Message': 'Job not found'}},
            'DescribeBulkImportJob',
        )

        result = describe_bulk_import_job(job_id='12345678-1234-1234-1234-123456789012')

        assert result['success'] is False
        assert result['error_code'] == 'ResourceNotFound'

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_list_bulk_import_jobs_region_validation_workflow(self, mock_client):
        """Test list_bulk_import_jobs region validation in workflow."""
        result = list_bulk_import_jobs(
            filter='ALL', next_token=None, max_results=50, region='invalid_region!'
        )

        assert result['success'] is False
        assert result['error_code'] == 'ValidationException'
        assert 'Invalid AWS region format' in result['error']

    @patch('awslabs.aws_iot_sitewise_mcp_server.tools.sitewise_data.create_sitewise_client')
    def test_list_bulk_import_jobs_max_results_validation_workflow(self, mock_client):
        """Test list_bulk_import_jobs max_results validation in workflow."""
        result = list_bulk_import_jobs(
            filter='ALL', next_token=None, max_results=0, region='us-east-1'
        )

        assert result['success'] is False
        assert result['error_code'] == 'ValidationException'
        assert 'Max results must be at least 1' in result['error']


if __name__ == '__main__':
    pytest.main([__file__])

```
Page 377/389FirstPrevNextLast