#
tokens: 55130/50000 1/2535 files (page 564/612)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 564 of 612. Use http://codebase.md/awslabs/mcp?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .devcontainer
│   └── devcontainer.json
├── .github
│   ├── actions
│   │   ├── build-and-push-container-image
│   │   │   └── action.yml
│   │   └── clear-space-ubuntu-latest-agressively
│   │       └── action.yml
│   ├── codecov.yml
│   ├── CODEOWNERS
│   ├── dependabot.yml
│   ├── ISSUE_TEMPLATE
│   │   ├── bug_report.yml
│   │   ├── documentation.yml
│   │   ├── feature_request.yml
│   │   ├── rfc.yml
│   │   └── support_awslabs_mcp_servers.yml
│   ├── pull_request_template.md
│   ├── SECURITY
│   ├── SUPPORT
│   └── workflows
│       ├── aws-api-mcp-upgrade-version.yml
│       ├── bandit-requirements.txt
│       ├── bandit.yml
│       ├── cfn_nag.yml
│       ├── check-gh-pages-builds.yml
│       ├── check-license-header-hash.txt
│       ├── check-license-header.json
│       ├── check-license-header.yml
│       ├── checkov.yml
│       ├── codeql.yml
│       ├── dependency-review-action.yml
│       ├── detect-secrets-requirements.txt
│       ├── gh-pages.yml
│       ├── merge-prevention.yml
│       ├── powershell.yml
│       ├── pre-commit-requirements.txt
│       ├── pre-commit.yml
│       ├── pull-request-lint.yml
│       ├── python.yml
│       ├── RELEASE_INSTRUCTIONS.md
│       ├── release-initiate-branch.yml
│       ├── release-merge-tag.yml
│       ├── release.py
│       ├── release.yml
│       ├── scanners.yml
│       ├── scorecard-analysis.yml
│       ├── semgrep-requirements.txt
│       ├── semgrep.yml
│       ├── stale.yml
│       ├── trivy.yml
│       └── typescript.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .python-version
├── .ruff.toml
├── .secrets.baseline
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── DESIGN_GUIDELINES.md
├── DEVELOPER_GUIDE.md
├── docs
│   └── images
│       └── root-readme
│           ├── cline-api-provider-filled.png
│           ├── cline-chat-interface.png
│           ├── cline-custom-instructions.png
│           ├── cline-select-aws-profile.png
│           ├── cline-select-bedrock.png
│           ├── configure-mcp-servers.png
│           ├── install-cline-extension.png
│           ├── mcp-servers-installed.png
│           └── select-mcp-servers.png
├── docusaurus
│   ├── .gitignore
│   ├── docs
│   │   ├── installation.md
│   │   ├── intro.md
│   │   ├── samples
│   │   │   ├── index.md
│   │   │   ├── mcp-integration-with-kb.md
│   │   │   ├── mcp-integration-with-nova-canvas.md
│   │   │   └── stepfunctions-tool-mcp-server.md
│   │   ├── servers
│   │   │   ├── amazon-bedrock-agentcore-mcp-server.md
│   │   │   ├── amazon-keyspaces-mcp-server.md
│   │   │   ├── amazon-mq-mcp-server.md
│   │   │   ├── amazon-neptune-mcp-server.md
│   │   │   ├── amazon-qbusiness-anonymous-mcp-server.md
│   │   │   ├── amazon-qindex-mcp-server.md
│   │   │   ├── amazon-sns-sqs-mcp-server.md
│   │   │   ├── aurora-dsql-mcp-server.md
│   │   │   ├── aws-api-mcp-server.md
│   │   │   ├── aws-appsync-mcp-server.md
│   │   │   ├── aws-bedrock-custom-model-import-mcp-server.md
│   │   │   ├── aws-bedrock-data-automation-mcp-server.md
│   │   │   ├── aws-dataprocessing-mcp-server.md
│   │   │   ├── aws-diagram-mcp-server.md
│   │   │   ├── aws-documentation-mcp-server.md
│   │   │   ├── aws-healthomics-mcp-server.md
│   │   │   ├── aws-iot-sitewise-mcp-server.md
│   │   │   ├── aws-knowledge-mcp-server.md
│   │   │   ├── aws-location-mcp-server.md
│   │   │   ├── aws-msk-mcp-server.md
│   │   │   ├── aws-pricing-mcp-server.md
│   │   │   ├── aws-serverless-mcp-server.md
│   │   │   ├── aws-support-mcp-server.md
│   │   │   ├── bedrock-kb-retrieval-mcp-server.md
│   │   │   ├── billing-cost-management-mcp-server.md
│   │   │   ├── ccapi-mcp-server.md
│   │   │   ├── cdk-mcp-server.md
│   │   │   ├── cfn-mcp-server.md
│   │   │   ├── cloudtrail-mcp-server.md
│   │   │   ├── cloudwatch-applicationsignals-mcp-server.md
│   │   │   ├── cloudwatch-mcp-server.md
│   │   │   ├── code-doc-gen-mcp-server.md
│   │   │   ├── core-mcp-server.md
│   │   │   ├── cost-explorer-mcp-server.md
│   │   │   ├── documentdb-mcp-server.md
│   │   │   ├── dynamodb-mcp-server.md
│   │   │   ├── ecs-mcp-server.md
│   │   │   ├── eks-mcp-server.md
│   │   │   ├── elasticache-mcp-server.md
│   │   │   ├── finch-mcp-server.md
│   │   │   ├── frontend-mcp-server.md
│   │   │   ├── git-repo-research-mcp-server.md
│   │   │   ├── healthlake-mcp-server.md
│   │   │   ├── iam-mcp-server.md
│   │   │   ├── kendra-index-mcp-server.md
│   │   │   ├── lambda-tool-mcp-server.md
│   │   │   ├── memcached-mcp-server.md
│   │   │   ├── mysql-mcp-server.md
│   │   │   ├── nova-canvas-mcp-server.md
│   │   │   ├── openapi-mcp-server.md
│   │   │   ├── postgres-mcp-server.md
│   │   │   ├── prometheus-mcp-server.md
│   │   │   ├── redshift-mcp-server.md
│   │   │   ├── s3-tables-mcp-server.md
│   │   │   ├── stepfunctions-tool-mcp-server.md
│   │   │   ├── syntheticdata-mcp-server.md
│   │   │   ├── terraform-mcp-server.md
│   │   │   ├── timestream-for-influxdb-mcp-server.md
│   │   │   ├── valkey-mcp-server.md
│   │   │   └── well-architected-security-mcp-server.mdx
│   │   └── vibe_coding.md
│   ├── docusaurus.config.ts
│   ├── package-lock.json
│   ├── package.json
│   ├── README.md
│   ├── sidebars.ts
│   ├── src
│   │   ├── components
│   │   │   ├── HomepageFeatures
│   │   │   │   └── styles.module.css
│   │   │   └── ServerCards
│   │   │       ├── index.tsx
│   │   │       └── styles.module.css
│   │   ├── css
│   │   │   ├── custom.css
│   │   │   └── doc-override.css
│   │   └── pages
│   │       ├── index.module.css
│   │       └── servers.tsx
│   ├── static
│   │   ├── .nojekyll
│   │   ├── assets
│   │   │   ├── icons
│   │   │   │   ├── activity.svg
│   │   │   │   ├── book-open.svg
│   │   │   │   ├── cpu.svg
│   │   │   │   ├── database.svg
│   │   │   │   ├── dollar-sign.svg
│   │   │   │   ├── help-circle.svg
│   │   │   │   ├── key.svg
│   │   │   │   ├── server.svg
│   │   │   │   ├── share-2.svg
│   │   │   │   ├── tool.svg
│   │   │   │   └── zap.svg
│   │   │   └── server-cards.json
│   │   └── img
│   │       ├── aws-logo.svg
│   │       └── logo.png
│   └── tsconfig.json
├── LICENSE
├── NOTICE
├── README.md
├── samples
│   ├── mcp-integration-with-kb
│   │   ├── .env.example
│   │   ├── .python-version
│   │   ├── assets
│   │   │   └── simplified-mcp-flow-diagram.png
│   │   ├── clients
│   │   │   └── client_server.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── user_interfaces
│   │   │   └── chat_bedrock_st.py
│   │   └── uv.lock
│   ├── mcp-integration-with-nova-canvas
│   │   ├── .env.example
│   │   ├── .python-version
│   │   ├── clients
│   │   │   └── client_server.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── user_interfaces
│   │   │   └── image_generator_st.py
│   │   └── uv.lock
│   ├── README.md
│   └── stepfunctions-tool-mcp-server
│       ├── README.md
│       └── sample_state_machines
│           ├── customer-create
│           │   └── app.py
│           ├── customer-id-from-email
│           │   └── app.py
│           ├── customer-info-from-id
│           │   └── app.py
│           └── template.yml
├── scripts
│   ├── README.md
│   └── verify_package_name.py
├── src
│   ├── amazon-bedrock-agentcore-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_bedrock_agentcore_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── config.py
│   │   │       ├── server.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── cache.py
│   │   │           ├── doc_fetcher.py
│   │   │           ├── indexer.py
│   │   │           ├── text_processor.py
│   │   │           └── url_validator.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── SECURITY.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_cache.py
│   │   │   ├── test_config.py
│   │   │   ├── test_doc_fetcher.py
│   │   │   ├── test_indexer.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_server.py
│   │   │   ├── test_text_processor.py
│   │   │   └── test_url_validator.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── amazon-kendra-index-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_kendra_index_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── server.py
│   │   │       └── util.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── amazon-keyspaces-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_keyspaces_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── client.py
│   │   │       ├── config.py
│   │   │       ├── consts.py
│   │   │       ├── llm_context.py
│   │   │       ├── models.py
│   │   │       ├── server.py
│   │   │       └── services.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_client.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_query_analysis_service.py
│   │   │   ├── test_server.py
│   │   │   └── test_services.py
│   │   └── uv.lock
│   ├── amazon-mq-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_mq_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── aws_service_mcp_generator.py
│   │   │       ├── consts.py
│   │   │       ├── rabbitmq
│   │   │       │   ├── __init__.py
│   │   │       │   ├── admin.py
│   │   │       │   ├── connection.py
│   │   │       │   ├── doc
│   │   │       │   │   ├── rabbitmq_broker_sizing_guide.md
│   │   │       │   │   ├── rabbitmq_performance_optimization_best_practice.md
│   │   │       │   │   ├── rabbitmq_production_deployment_guidelines.md
│   │   │       │   │   ├── rabbitmq_quorum_queue_migration_guide.md
│   │   │       │   │   └── rabbitmq_setup_best_practice.md
│   │   │       │   ├── handlers.py
│   │   │       │   └── module.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── example
│   │   │   └── sample_mcp_q_cli.json
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── rabbitmq
│   │   │   │   ├── __init__.py
│   │   │   │   ├── conftest.py
│   │   │   │   ├── test_admin.py
│   │   │   │   ├── test_connection.py
│   │   │   │   ├── test_handlers.py
│   │   │   │   └── test_module.py
│   │   │   ├── test_aws_service_mcp_generator.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── amazon-neptune-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_neptune_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── exceptions.py
│   │   │       ├── graph_store
│   │   │       │   ├── __init__.py
│   │   │       │   ├── analytics.py
│   │   │       │   ├── base.py
│   │   │       │   └── database.py
│   │   │       ├── models.py
│   │   │       ├── neptune.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_analytics.py
│   │   │   ├── test_database.py
│   │   │   ├── test_exceptions.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_models.py
│   │   │   ├── test_neptune.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── amazon-qbusiness-anonymous-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_qbusiness_anonymous_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── clients.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── amazon-qindex-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_qindex_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── clients.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_clients.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── test_server.py
│   │   └── uv.lock
│   ├── amazon-sns-sqs-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── amazon_sns_sqs_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── common.py
│   │   │       ├── consts.py
│   │   │       ├── generator.py
│   │   │       ├── server.py
│   │   │       ├── sns.py
│   │   │       └── sqs.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── print_tools.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── test_common.py
│   │   │   ├── test_generator.py
│   │   │   ├── test_server.py
│   │   │   ├── test_sns.py
│   │   │   └── test_sqs.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aurora-dsql-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aurora_dsql_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── consts.py
│   │   │       ├── mutable_sql_detector.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_connection_reuse.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_profile_option.py
│   │   │   ├── test_readonly_enforcement.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-api-mcp-server
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_api_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── core
│   │   │       │   ├── __init__.py
│   │   │       │   ├── agent_scripts
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── manager.py
│   │   │       │   │   ├── models.py
│   │   │       │   │   └── registry
│   │   │       │   │       ├── __init__.py
│   │   │       │   │       ├── application-failure-troubleshooting.script.md
│   │   │       │   │       ├── cloudtral-mutli-region-setup.script.md
│   │   │       │   │       ├── create_amazon_aurora_db_cluster_with_instances.script.md
│   │   │       │   │       ├── lambda-timeout-debugging.script.md
│   │   │       │   │       ├── scripts_format.md
│   │   │       │   │       └── troubleshoot-permissions-with-cloudtrail-events.script.md
│   │   │       │   ├── aws
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── driver.py
│   │   │       │   │   ├── pagination.py
│   │   │       │   │   ├── regions.py
│   │   │       │   │   ├── service.py
│   │   │       │   │   └── services.py
│   │   │       │   ├── common
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── command_metadata.py
│   │   │       │   │   ├── command.py
│   │   │       │   │   ├── config.py
│   │   │       │   │   ├── errors.py
│   │   │       │   │   ├── file_operations.py
│   │   │       │   │   ├── file_system_controls.py
│   │   │       │   │   ├── helpers.py
│   │   │       │   │   ├── models.py
│   │   │       │   │   └── py.typed
│   │   │       │   ├── data
│   │   │       │   │   └── api_metadata.json
│   │   │       │   ├── metadata
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   └── read_only_operations_list.py
│   │   │       │   ├── parser
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── custom_validators
│   │   │       │   │   │   ├── __init__.py
│   │   │       │   │   │   ├── botocore_param_validator.py
│   │   │       │   │   │   ├── ec2_validator.py
│   │   │       │   │   │   └── ssm_validator.py
│   │   │       │   │   ├── interpretation.py
│   │   │       │   │   ├── lexer.py
│   │   │       │   │   └── parser.py
│   │   │       │   ├── py.typed
│   │   │       │   └── security
│   │   │       │       ├── __init__.py
│   │   │       │       ├── aws_api_customization.json
│   │   │       │       └── policy.py
│   │   │       ├── middleware
│   │   │       │   ├── __init__.py
│   │   │       │   └── http_header_validation_middleware.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
│   │   │   ├── middleware
│   │   │   │   └── test_http_header_validation_middleware.py
│   │   │   ├── parser
│   │   │   │   ├── __init__.py
│   │   │   │   ├── test_file_path_detection.py
│   │   │   │   ├── test_lexer.py
│   │   │   │   ├── test_parser_customizations.py
│   │   │   │   └── test_parser.py
│   │   │   ├── test_security_policy.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-appsync-mcp-server
│   │   ├── .dockerignore
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_appsync_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── decorators.py
│   │   │       ├── helpers.py
│   │   │       ├── operations
│   │   │       │   ├── __init__.py
│   │   │       │   ├── create_api_cache.py
│   │   │       │   ├── create_api_key.py
│   │   │       │   ├── create_api.py
│   │   │       │   ├── create_channel_namespace.py
│   │   │       │   ├── create_datasource.py
│   │   │       │   ├── create_domain_name.py
│   │   │       │   ├── create_function.py
│   │   │       │   ├── create_graphql_api.py
│   │   │       │   ├── create_resolver.py
│   │   │       │   └── create_schema.py
│   │   │       ├── server.py
│   │   │       ├── tools
│   │   │       │   ├── __init__.py
│   │   │       │   ├── create_api_cache.py
│   │   │       │   ├── create_api_key.py
│   │   │       │   ├── create_api.py
│   │   │       │   ├── create_channel_namespace.py
│   │   │       │   ├── create_datasource.py
│   │   │       │   ├── create_domain_name.py
│   │   │       │   ├── create_function.py
│   │   │       │   ├── create_graphql_api.py
│   │   │       │   ├── create_resolver.py
│   │   │       │   └── create_schema.py
│   │   │       └── validators.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_all_create_tools_write_protection.py
│   │   │   ├── test_create_api_cache.py
│   │   │   ├── test_create_api_key.py
│   │   │   ├── test_create_api.py
│   │   │   ├── test_create_channel_namespace.py
│   │   │   ├── test_create_datasource_tool.py
│   │   │   ├── test_create_datasource.py
│   │   │   ├── test_create_domain_name.py
│   │   │   ├── test_create_function.py
│   │   │   ├── test_create_graphql_api.py
│   │   │   ├── test_create_resolver.py
│   │   │   ├── test_create_schema_tool.py
│   │   │   ├── test_create_schema.py
│   │   │   ├── test_helpers.py
│   │   │   ├── test_server.py
│   │   │   ├── test_validators.py
│   │   │   └── test_write_operation.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-bedrock-custom-model-import-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_bedrock_custom_model_import_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── client.py
│   │   │       ├── llm_context.py
│   │   │       ├── models.py
│   │   │       ├── prompts.py
│   │   │       ├── server.py
│   │   │       ├── services
│   │   │       │   ├── __init__.py
│   │   │       │   ├── imported_model_service.py
│   │   │       │   └── model_import_service.py
│   │   │       ├── tools
│   │   │       │   ├── create_model_import_job.py
│   │   │       │   ├── delete_imported_model.py
│   │   │       │   ├── get_imported_model.py
│   │   │       │   ├── get_model_import_job.py
│   │   │       │   ├── list_imported_models.py
│   │   │       │   └── list_model_import_jobs.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── aws.py
│   │   │           ├── config.py
│   │   │           ├── consts.py
│   │   │           └── matching.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── services
│   │   │   │   ├── test_imported_model_service.py
│   │   │   │   └── test_model_import_service.py
│   │   │   ├── test_client.py
│   │   │   ├── test_init.py
│   │   │   ├── test_llm_context.py
│   │   │   ├── test_prompts.py
│   │   │   ├── test_server.py
│   │   │   ├── tools
│   │   │   │   ├── test_create_model_import_job.py
│   │   │   │   ├── test_delete_imported_model.py
│   │   │   │   ├── test_get_imported_model.py
│   │   │   │   ├── test_get_model_import_job.py
│   │   │   │   ├── test_list_imported_models.py
│   │   │   │   └── test_list_model_import_jobs.py
│   │   │   └── utils
│   │   │       ├── test_aws.py
│   │   │       ├── test_config.py
│   │   │       └── test_matching.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-bedrock-data-automation-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_bedrock_data_automation_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── helpers.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_helpers.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-dataprocessing-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_dataprocessing_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── core
│   │   │       │   ├── __init__.py
│   │   │       │   └── glue_data_catalog
│   │   │       │       ├── __init__.py
│   │   │       │       ├── data_catalog_database_manager.py
│   │   │       │       ├── data_catalog_handler.py
│   │   │       │       └── data_catalog_table_manager.py
│   │   │       ├── handlers
│   │   │       │   ├── __init__.py
│   │   │       │   ├── athena
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── athena_data_catalog_handler.py
│   │   │       │   │   ├── athena_query_handler.py
│   │   │       │   │   └── athena_workgroup_handler.py
│   │   │       │   ├── commons
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   └── common_resource_handler.py
│   │   │       │   ├── emr
│   │   │       │   │   ├── emr_ec2_cluster_handler.py
│   │   │       │   │   ├── emr_ec2_instance_handler.py
│   │   │       │   │   └── emr_ec2_steps_handler.py
│   │   │       │   └── glue
│   │   │       │       ├── __init__.py
│   │   │       │       ├── crawler_handler.py
│   │   │       │       ├── data_catalog_handler.py
│   │   │       │       ├── glue_commons_handler.py
│   │   │       │       ├── glue_etl_handler.py
│   │   │       │       ├── interactive_sessions_handler.py
│   │   │       │       └── worklows_handler.py
│   │   │       ├── models
│   │   │       │   ├── __init__.py
│   │   │       │   ├── athena_models.py
│   │   │       │   ├── common_resource_models.py
│   │   │       │   ├── data_catalog_models.py
│   │   │       │   ├── emr_models.py
│   │   │       │   └── glue_models.py
│   │   │       ├── server.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── aws_helper.py
│   │   │           ├── consts.py
│   │   │           ├── logging_helper.py
│   │   │           └── sql_analyzer.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── core
│   │   │   │   ├── __init__.py
│   │   │   │   └── glue_data_catalog
│   │   │   │       ├── __init__.py
│   │   │   │       ├── test_data_catalog_database_manager.py
│   │   │   │       ├── test_data_catalog_handler.py
│   │   │   │       └── test_data_catalog_table_manager.py
│   │   │   ├── handlers
│   │   │   │   ├── __init__.py
│   │   │   │   ├── athena
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── test_athena_data_catalog_handler.py
│   │   │   │   │   ├── test_athena_query_handler.py
│   │   │   │   │   ├── test_athena_workgroup_handler.py
│   │   │   │   │   └── test_custom_tags_athena.py
│   │   │   │   ├── commons
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── test_common_resource_handler.py
│   │   │   │   ├── emr
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── test_custom_tags_emr.py
│   │   │   │   │   ├── test_emr_ec2_cluster_handler.py
│   │   │   │   │   ├── test_emr_ec2_instance_handler.py
│   │   │   │   │   └── test_emr_ec2_steps_handler.py
│   │   │   │   └── glue
│   │   │   │       ├── __init__.py
│   │   │   │       ├── test_crawler_handler.py
│   │   │   │       ├── test_custom_tags_glue.py
│   │   │   │       ├── test_data_catalog_handler.py
│   │   │   │       ├── test_glue_commons_handler.py
│   │   │   │       ├── test_glue_etl_handler.py
│   │   │   │       ├── test_glue_interactive_sessions_handler.py
│   │   │   │       └── test_glue_workflows_handler.py
│   │   │   ├── models
│   │   │   │   ├── __init__.py
│   │   │   │   ├── test_athena_models.py
│   │   │   │   ├── test_common_resource_models.py
│   │   │   │   ├── test_data_catalog_models.py
│   │   │   │   ├── test_emr_models.py
│   │   │   │   ├── test_glue_models.py
│   │   │   │   ├── test_interactive_sessions_models.py
│   │   │   │   └── test_workflows_models.py
│   │   │   ├── test_init.py
│   │   │   ├── test_server.py
│   │   │   └── utils
│   │   │       ├── __init__.py
│   │   │       ├── test_aws_helper.py
│   │   │       ├── test_custom_tags.py
│   │   │       ├── test_logging_helper.py
│   │   │       └── test_sql_analyzer.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-diagram-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_diagram_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── diagrams_tools.py
│   │   │       ├── models.py
│   │   │       ├── scanner.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── conftest.py
│   │   │   ├── README.md
│   │   │   ├── resources
│   │   │   │   ├── __init__.py
│   │   │   │   └── example_diagrams
│   │   │   │       ├── __init__.py
│   │   │   │       ├── aws_example.py
│   │   │   │       ├── flow_example.py
│   │   │   │       └── sequence_example.py
│   │   │   ├── test_diagrams.py
│   │   │   ├── test_models.py
│   │   │   ├── test_sarif_fix.py
│   │   │   ├── test_scanner.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-documentation-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_documentation_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── models.py
│   │   │       ├── server_aws_cn.py
│   │   │       ├── server_aws.py
│   │   │       ├── server_utils.py
│   │   │       ├── server.py
│   │   │       └── util.py
│   │   ├── basic-usage.gif
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── constants.py
│   │   │   ├── resources
│   │   │   │   └── lambda_sns_raw.html
│   │   │   ├── test_aws_cn_get_available_services_live.py
│   │   │   ├── test_aws_cn_read_documentation_live.py
│   │   │   ├── test_aws_read_documentation_live.py
│   │   │   ├── test_aws_recommend_live.py
│   │   │   ├── test_aws_search_live.py
│   │   │   ├── test_metadata_handling.py
│   │   │   ├── test_models.py
│   │   │   ├── test_server_aws_cn.py
│   │   │   ├── test_server_aws.py
│   │   │   ├── test_server_utils.py
│   │   │   ├── test_server.py
│   │   │   └── test_util.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-healthomics-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_healthomics_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── consts.py
│   │   │       ├── models.py
│   │   │       ├── server.py
│   │   │       ├── tools
│   │   │       │   ├── __init__.py
│   │   │       │   ├── helper_tools.py
│   │   │       │   ├── run_analysis.py
│   │   │       │   ├── troubleshooting.py
│   │   │       │   ├── workflow_analysis.py
│   │   │       │   ├── workflow_execution.py
│   │   │       │   ├── workflow_linting.py
│   │   │       │   └── workflow_management.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── aws_utils.py
│   │   │           ├── s3_utils.py
│   │   │           └── validation_utils.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── docs
│   │   │   └── workflow_linting.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── conftest.py
│   │   │   ├── test_aws_utils.py
│   │   │   ├── test_consts.py
│   │   │   ├── test_helper_tools.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_models.py
│   │   │   ├── test_run_analysis.py
│   │   │   ├── test_s3_utils.py
│   │   │   ├── test_server.py
│   │   │   ├── test_troubleshooting.py
│   │   │   ├── test_workflow_analysis.py
│   │   │   ├── test_workflow_execution.py
│   │   │   ├── test_workflow_linting.py
│   │   │   ├── test_workflow_management.py
│   │   │   └── test_workflow_tools.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-iot-sitewise-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_iot_sitewise_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── client.py
│   │   │       ├── models
│   │   │       │   ├── computation_data_models.py
│   │   │       │   └── metadata_transfer_data_models.py
│   │   │       ├── prompts
│   │   │       │   ├── __init__.py
│   │   │       │   ├── anomaly_detection_workflow.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_computation_models.py
│   │   │       │   ├── sitewise_data.py
│   │   │       │   ├── sitewise_executions.py
│   │   │       │   ├── sitewise_gateways.py
│   │   │       │   ├── sitewise_metadata_transfer.py
│   │   │       │   └── timestamp_tools.py
│   │   │       ├── validation_utils.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
│   │   │   ├── models
│   │   │   │   ├── test_computation_data_models.py
│   │   │   │   └── test_metadata_transfer_data_models.py
│   │   │   ├── test_client.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_server.py
│   │   │   ├── test_validation_utils.py
│   │   │   ├── test_validation.py
│   │   │   └── tools
│   │   │       ├── test_sitewise_access.py
│   │   │       ├── test_sitewise_asset_models.py
│   │   │       ├── test_sitewise_assets.py
│   │   │       ├── test_sitewise_computation_models.py
│   │   │       ├── test_sitewise_data.py
│   │   │       ├── test_sitewise_executions.py
│   │   │       ├── test_sitewise_gateways.py
│   │   │       ├── test_sitewise_metadata_transfer.py
│   │   │       └── test_timestamp_tools.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-knowledge-mcp-server
│   │   └── README.md
│   ├── aws-location-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_location_server
│   │   │       ├── __init__.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_server_integration.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-msk-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_msk_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── server.py
│   │   │       └── tools
│   │   │           ├── __init__.py
│   │   │           ├── common_functions
│   │   │           │   ├── __init__.py
│   │   │           │   ├── client_manager.py
│   │   │           │   └── common_functions.py
│   │   │           ├── logs_and_telemetry
│   │   │           │   ├── __init__.py
│   │   │           │   ├── cluster_metrics_tools.py
│   │   │           │   ├── list_customer_iam_access.py
│   │   │           │   └── metric_config.py
│   │   │           ├── mutate_cluster
│   │   │           │   ├── __init__.py
│   │   │           │   ├── batch_associate_scram_secret.py
│   │   │           │   ├── batch_disassociate_scram_secret.py
│   │   │           │   ├── create_cluster_v2.py
│   │   │           │   ├── put_cluster_policy.py
│   │   │           │   ├── reboot_broker.py
│   │   │           │   ├── update_broker_count.py
│   │   │           │   ├── update_broker_storage.py
│   │   │           │   ├── update_broker_type.py
│   │   │           │   ├── update_cluster_configuration.py
│   │   │           │   ├── update_monitoring.py
│   │   │           │   └── update_security.py
│   │   │           ├── mutate_config
│   │   │           │   ├── __init__.py
│   │   │           │   ├── create_configuration.py
│   │   │           │   ├── tag_resource.py
│   │   │           │   ├── untag_resource.py
│   │   │           │   └── update_configuration.py
│   │   │           ├── mutate_vpc
│   │   │           │   ├── __init__.py
│   │   │           │   ├── create_vpc_connection.py
│   │   │           │   ├── delete_vpc_connection.py
│   │   │           │   └── reject_client_vpc_connection.py
│   │   │           ├── read_cluster
│   │   │           │   ├── __init__.py
│   │   │           │   ├── describe_cluster_operation.py
│   │   │           │   ├── describe_cluster.py
│   │   │           │   ├── get_bootstrap_brokers.py
│   │   │           │   ├── get_cluster_policy.py
│   │   │           │   ├── get_compatible_kafka_versions.py
│   │   │           │   ├── list_client_vpc_connections.py
│   │   │           │   ├── list_cluster_operations.py
│   │   │           │   ├── list_nodes.py
│   │   │           │   └── list_scram_secrets.py
│   │   │           ├── read_config
│   │   │           │   ├── __init__.py
│   │   │           │   ├── describe_configuration_revision.py
│   │   │           │   ├── describe_configuration.py
│   │   │           │   ├── list_configuration_revisions.py
│   │   │           │   └── list_tags_for_resource.py
│   │   │           ├── read_global
│   │   │           │   ├── __init__.py
│   │   │           │   ├── list_clusters.py
│   │   │           │   ├── list_configurations.py
│   │   │           │   ├── list_kafka_versions.py
│   │   │           │   └── list_vpc_connections.py
│   │   │           ├── read_vpc
│   │   │           │   ├── __init__.py
│   │   │           │   └── describe_vpc_connection.py
│   │   │           └── static_tools
│   │   │               ├── __init__.py
│   │   │               └── cluster_best_practices.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_client_manager.py
│   │   │   ├── test_cluster_metrics_tools.py
│   │   │   ├── test_common_functions.py
│   │   │   ├── test_create_cluster_v2.py
│   │   │   ├── test_create_configuration.py
│   │   │   ├── test_create_vpc_connection.py
│   │   │   ├── test_delete_vpc_connection.py
│   │   │   ├── test_describe_cluster_operation.py
│   │   │   ├── test_describe_cluster.py
│   │   │   ├── test_describe_configuration_revision.py
│   │   │   ├── test_describe_configuration.py
│   │   │   ├── test_describe_vpc_connection.py
│   │   │   ├── test_get_bootstrap_brokers.py
│   │   │   ├── test_get_cluster_policy.py
│   │   │   ├── test_get_compatible_kafka_versions.py
│   │   │   ├── test_init.py
│   │   │   ├── test_list_client_vpc_connections.py
│   │   │   ├── test_list_cluster_operations.py
│   │   │   ├── test_list_clusters.py
│   │   │   ├── test_list_configuration_revisions.py
│   │   │   ├── test_list_configurations.py
│   │   │   ├── test_list_customer_iam_access.py
│   │   │   ├── test_list_kafka_versions.py
│   │   │   ├── test_list_nodes.py
│   │   │   ├── test_list_scram_secrets.py
│   │   │   ├── test_list_tags_for_resource.py
│   │   │   ├── test_list_vpc_connections.py
│   │   │   ├── test_logs_and_telemetry.py
│   │   │   ├── test_main.py
│   │   │   ├── test_mutate_cluster_init.py
│   │   │   ├── test_mutate_cluster_success_cases.py
│   │   │   ├── test_mutate_cluster.py
│   │   │   ├── test_mutate_config_init.py
│   │   │   ├── test_mutate_vpc_init.py
│   │   │   ├── test_read_cluster_init_updated.py
│   │   │   ├── test_read_cluster_init.py
│   │   │   ├── test_read_config_init.py
│   │   │   ├── test_read_global_init.py
│   │   │   ├── test_read_vpc_init.py
│   │   │   ├── test_reject_client_vpc_connection.py
│   │   │   ├── test_server.py
│   │   │   ├── test_static_tools_init.py
│   │   │   ├── test_tag_resource.py
│   │   │   ├── test_tool_descriptions.py
│   │   │   ├── test_untag_resource.py
│   │   │   └── test_update_configuration.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-pricing-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_pricing_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── cdk_analyzer.py
│   │   │       ├── consts.py
│   │   │       ├── helpers.py
│   │   │       ├── models.py
│   │   │       ├── pricing_client.py
│   │   │       ├── pricing_transformer.py
│   │   │       ├── report_generator.py
│   │   │       ├── server.py
│   │   │       ├── static
│   │   │       │   ├── __init__.py
│   │   │       │   ├── COST_REPORT_TEMPLATE.md
│   │   │       │   └── patterns
│   │   │       │       ├── __init__.py
│   │   │       │       └── BEDROCK.md
│   │   │       └── terraform_analyzer.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_cdk_analyzer.py
│   │   │   ├── test_helpers.py
│   │   │   ├── test_pricing_client.py
│   │   │   ├── test_pricing_transformer.py
│   │   │   ├── test_report_generator.py
│   │   │   ├── test_server.py
│   │   │   └── test_terraform_analyzer.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── aws-serverless-mcp-server
│   │   ├── .pre-commit.config.yaml
│   │   ├── .python-version
│   │   ├── .secrets.baseline
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_serverless_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── models.py
│   │   │       ├── resources
│   │   │       │   ├── __init__.py
│   │   │       │   ├── deployment_details.py
│   │   │       │   ├── deployment_list.py
│   │   │       │   ├── template_details.py
│   │   │       │   └── template_list.py
│   │   │       ├── server.py
│   │   │       ├── template
│   │   │       │   ├── __init__.py
│   │   │       │   ├── registry.py
│   │   │       │   ├── renderer.py
│   │   │       │   └── templates
│   │   │       │       ├── backend.j2
│   │   │       │       ├── frontend.j2
│   │   │       │       ├── fullstack.j2
│   │   │       │       └── README.md
│   │   │       ├── templates
│   │   │       │   ├── __init__.py
│   │   │       │   └── iam_policies.py
│   │   │       ├── tools
│   │   │       │   ├── common
│   │   │       │   │   └── base_tool.py
│   │   │       │   ├── esm
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── esm_diagnosis.py
│   │   │       │   │   ├── esm_guidance.py
│   │   │       │   │   ├── esm_recommend.py
│   │   │       │   │   └── secure_esm_guidance.py
│   │   │       │   ├── guidance
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── deploy_serverless_app_help.py
│   │   │       │   │   ├── get_iac_guidance.py
│   │   │       │   │   ├── get_lambda_event_schemas.py
│   │   │       │   │   ├── get_lambda_guidance.py
│   │   │       │   │   └── get_serverless_templates.py
│   │   │       │   ├── poller
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── esm_diagnosis.py
│   │   │       │   │   ├── esm_guidance.py
│   │   │       │   │   └── esm_recommend.py
│   │   │       │   ├── sam
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── sam_build.py
│   │   │       │   │   ├── sam_deploy.py
│   │   │       │   │   ├── sam_init.py
│   │   │       │   │   ├── sam_local_invoke.py
│   │   │       │   │   └── sam_logs.py
│   │   │       │   ├── schemas
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── describe_schema.py
│   │   │       │   │   ├── list_registries.py
│   │   │       │   │   └── search_schema.py
│   │   │       │   └── webapps
│   │   │       │       ├── __init__.py
│   │   │       │       ├── configure_domain.py
│   │   │       │       ├── deploy_webapp.py
│   │   │       │       ├── get_metrics.py
│   │   │       │       ├── update_webapp_frontend.py
│   │   │       │       ├── utils
│   │   │       │       │   ├── deploy_service.py
│   │   │       │       │   ├── frontend_uploader.py
│   │   │       │       │   └── startup_script_generator.py
│   │   │       │       └── webapp_deployment_help.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── aws_client_helper.py
│   │   │           ├── cloudformation.py
│   │   │           ├── const.py
│   │   │           ├── data_scrubber.py
│   │   │           ├── deployment_manager.py
│   │   │           ├── github.py
│   │   │           └── process.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── README.md
│   │   │   ├── test_cloudformation.py
│   │   │   ├── test_configure_domain.py
│   │   │   ├── test_data_scrubber.py
│   │   │   ├── test_deploy_serverless_app_help.py
│   │   │   ├── test_deploy_service.py
│   │   │   ├── test_deploy_webapp.py
│   │   │   ├── test_deployment_details.py
│   │   │   ├── test_deployment_help.py
│   │   │   ├── test_deployment_list.py
│   │   │   ├── test_deployment_manager.py
│   │   │   ├── test_esm_diagnosis.py
│   │   │   ├── test_esm_guidance.py
│   │   │   ├── test_esm_recommend.py
│   │   │   ├── test_frontend_uploader.py
│   │   │   ├── test_get_iac_guidance.py
│   │   │   ├── test_get_lambda_event_schemas.py
│   │   │   ├── test_get_lambda_guidance.py
│   │   │   ├── test_get_metrics.py
│   │   │   ├── test_get_serverless_templates.py
│   │   │   ├── test_github.py
│   │   │   ├── test_iam_policies.py
│   │   │   ├── test_models.py
│   │   │   ├── test_process.py
│   │   │   ├── test_sam_build.py
│   │   │   ├── test_sam_deploy.py
│   │   │   ├── test_sam_init.py
│   │   │   ├── test_sam_local_invoke.py
│   │   │   ├── test_sam_logs.py
│   │   │   ├── test_schemas.py
│   │   │   ├── test_secure_esm_guidance.py
│   │   │   ├── test_server.py
│   │   │   ├── test_startup_script_generator.py
│   │   │   ├── test_template_details.py
│   │   │   ├── test_template_list.py
│   │   │   ├── test_template_registry.py
│   │   │   ├── test_template_renderer.py
│   │   │   └── test_update_webapp_frontend.py
│   │   └── uv.lock
│   ├── aws-support-mcp-server
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── aws_support_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── client.py
│   │   │       ├── consts.py
│   │   │       ├── debug_helper.py
│   │   │       ├── errors.py
│   │   │       ├── formatters.py
│   │   │       ├── models.py
│   │   │       └── server.py
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftests.py
│   │   │   ├── test_aws_support_mcp_server.py
│   │   │   └── test_models.py
│   │   └── uv.lock
│   ├── bedrock-kb-retrieval-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── bedrock_kb_retrieval_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── knowledgebases
│   │   │       │   ├── __init__.py
│   │   │       │   ├── clients.py
│   │   │       │   ├── discovery.py
│   │   │       │   └── retrieval.py
│   │   │       ├── models.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── conftest.py
│   │   │   ├── README.md
│   │   │   ├── test_clients.py
│   │   │   ├── test_discovery.py
│   │   │   ├── test_env_config.py
│   │   │   ├── test_models.py
│   │   │   ├── test_retrieval.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── billing-cost-management-mcp-server
│   │   ├── __init__.py
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── billing_cost_management_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── models.py
│   │   │       ├── prompts
│   │   │       │   ├── __init__.py
│   │   │       │   ├── decorator.py
│   │   │       │   ├── graviton_migration.py
│   │   │       │   ├── README.md
│   │   │       │   ├── savings_plans.py
│   │   │       │   └── types.py
│   │   │       ├── server.py
│   │   │       ├── templates
│   │   │       │   └── recommendation_templates
│   │   │       │       ├── ebs_volume.template
│   │   │       │       ├── ec2_asg.template
│   │   │       │       ├── ec2_instance.template
│   │   │       │       ├── ecs_service.template
│   │   │       │       ├── idle.template
│   │   │       │       ├── lambda_function.template
│   │   │       │       ├── rds_database.template
│   │   │       │       ├── reserved_instances.template
│   │   │       │       └── savings_plans.template
│   │   │       ├── tools
│   │   │       │   ├── __init__.py
│   │   │       │   ├── aws_pricing_operations.py
│   │   │       │   ├── aws_pricing_tools.py
│   │   │       │   ├── bcm_pricing_calculator_tools.py
│   │   │       │   ├── budget_tools.py
│   │   │       │   ├── compute_optimizer_tools.py
│   │   │       │   ├── cost_anomaly_tools.py
│   │   │       │   ├── cost_comparison_tools.py
│   │   │       │   ├── cost_explorer_operations.py
│   │   │       │   ├── cost_explorer_tools.py
│   │   │       │   ├── cost_optimization_hub_helpers.py
│   │   │       │   ├── cost_optimization_hub_tools.py
│   │   │       │   ├── free_tier_usage_tools.py
│   │   │       │   ├── recommendation_details_tools.py
│   │   │       │   ├── ri_performance_tools.py
│   │   │       │   ├── sp_performance_tools.py
│   │   │       │   ├── storage_lens_tools.py
│   │   │       │   └── unified_sql_tools.py
│   │   │       └── utilities
│   │   │           ├── __init__.py
│   │   │           ├── aws_service_base.py
│   │   │           ├── constants.py
│   │   │           ├── logging_utils.py
│   │   │           └── sql_utils.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── requirements.txt
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── prompts
│   │   │   │   ├── __init__.py
│   │   │   │   └── test_prompts.py
│   │   │   ├── README.md
│   │   │   ├── test_models.py
│   │   │   ├── test_server.py
│   │   │   ├── tools
│   │   │   │   ├── __init__.py
│   │   │   │   ├── fixtures.py
│   │   │   │   ├── test_aws_bcm_pricing_calculator_tools.py
│   │   │   │   ├── test_aws_pricing_tools.py
│   │   │   │   ├── test_budget_tools.py
│   │   │   │   ├── test_compute_optimizer_tools.py
│   │   │   │   ├── test_cost_anomaly_tools_enhanced.py
│   │   │   │   ├── test_cost_anomaly_tools.py
│   │   │   │   ├── test_cost_comparison_tools.py
│   │   │   │   ├── test_cost_explorer_operations.py
│   │   │   │   ├── test_cost_explorer_tools.py
│   │   │   │   ├── test_cost_optimization_hub_helpers.py
│   │   │   │   ├── test_cost_optimization_hub_tools.py
│   │   │   │   ├── test_free_tier_usage_tools_new.py
│   │   │   │   ├── test_recommendation_details_tools.py
│   │   │   │   ├── test_ri_performance_tools.py
│   │   │   │   ├── test_sp_performance_tools.py
│   │   │   │   ├── test_storage_lens_tools.py
│   │   │   │   └── test_unified_sql_tools.py
│   │   │   └── utilities
│   │   │       ├── test_aws_service_base.py
│   │   │       └── test_sql_utils.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── ccapi-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── ccapi_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── aws_client.py
│   │   │       ├── cloud_control_utils.py
│   │   │       ├── context.py
│   │   │       ├── errors.py
│   │   │       ├── iac_generator.py
│   │   │       ├── impl
│   │   │       │   ├── __init__.py
│   │   │       │   ├── tools
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── explanation.py
│   │   │       │   │   ├── infrastructure_generation.py
│   │   │       │   │   ├── resource_operations.py
│   │   │       │   │   ├── security_scanning.py
│   │   │       │   │   └── session_management.py
│   │   │       │   └── utils
│   │   │       │       ├── __init__.py
│   │   │       │       └── validation.py
│   │   │       ├── infrastructure_generator.py
│   │   │       ├── models
│   │   │       │   ├── __init__.py
│   │   │       │   └── models.py
│   │   │       ├── schema_manager.py
│   │   │       ├── server.py
│   │   │       └── static
│   │   │           └── __init__.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_aws_client.py
│   │   │   ├── test_checkov_install.py
│   │   │   ├── test_cloud_control_utils.py
│   │   │   ├── test_context.py
│   │   │   ├── test_errors.py
│   │   │   ├── test_explanation.py
│   │   │   ├── test_iac_generator.py
│   │   │   ├── test_infrastructure_generation.py
│   │   │   ├── test_infrastructure_generator.py
│   │   │   ├── test_models.py
│   │   │   ├── test_resource_operations.py
│   │   │   ├── test_schema_manager.py
│   │   │   ├── test_security_scanning.py
│   │   │   ├── test_server.py
│   │   │   ├── test_session_management.py
│   │   │   └── test_validation.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── cdk-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── cdk_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── core
│   │   │       │   ├── __init__.py
│   │   │       │   ├── resources.py
│   │   │       │   ├── search_utils.py
│   │   │       │   ├── server.py
│   │   │       │   └── tools.py
│   │   │       ├── data
│   │   │       │   ├── __init__.py
│   │   │       │   ├── cdk_nag_parser.py
│   │   │       │   ├── construct_descriptions.py
│   │   │       │   ├── genai_cdk_loader.py
│   │   │       │   ├── lambda_layer_parser.py
│   │   │       │   ├── lambda_powertools_loader.py
│   │   │       │   ├── schema_generator.py
│   │   │       │   └── solutions_constructs_parser.py
│   │   │       ├── server.py
│   │   │       └── static
│   │   │           ├── __init__.py
│   │   │           ├── CDK_GENERAL_GUIDANCE.md
│   │   │           ├── CDK_NAG_GUIDANCE.md
│   │   │           └── lambda_powertools
│   │   │               ├── bedrock.md
│   │   │               ├── cdk.md
│   │   │               ├── dependencies.md
│   │   │               ├── index.md
│   │   │               ├── insights.md
│   │   │               ├── logging.md
│   │   │               ├── metrics.md
│   │   │               └── tracing.md
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── core
│   │   │   │   ├── test_resources_enhanced.py
│   │   │   │   ├── test_resources.py
│   │   │   │   ├── test_search_utils.py
│   │   │   │   ├── test_server.py
│   │   │   │   └── test_tools.py
│   │   │   └── data
│   │   │       ├── test_cdk_nag_parser.py
│   │   │       ├── test_genai_cdk_loader.py
│   │   │       ├── test_lambda_powertools_loader.py
│   │   │       ├── test_schema_generator.py
│   │   │       └── test_solutions_constructs_parser.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── cfn-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── cfn_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── aws_client.py
│   │   │       ├── cloud_control_utils.py
│   │   │       ├── context.py
│   │   │       ├── errors.py
│   │   │       ├── iac_generator.py
│   │   │       ├── schema_manager.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_aws_client.py
│   │   │   ├── test_cloud_control_utils.py
│   │   │   ├── test_errors.py
│   │   │   ├── test_iac_generator.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_schema_manager.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── cloudtrail-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── cloudtrail_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── common.py
│   │   │       ├── models.py
│   │   │       ├── server.py
│   │   │       └── tools.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_models.py
│   │   │   ├── test_server.py
│   │   │   └── test_tools.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── cloudwatch-applicationsignals-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── cloudwatch_applicationsignals_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-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
│   │   │       ├── enablement_guides
│   │   │       │   └── templates
│   │   │       │       └── ec2
│   │   │       │           └── ec2-python-enablement.md
│   │   │       ├── enablement_tools.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_enablement_tools.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
│   │   │       │   ├── cloudformation_template_generator.py
│   │   │       │   ├── constants.py
│   │   │       │   ├── data
│   │   │       │   │   └── metric_metadata.json
│   │   │       │   ├── metric_analyzer.py
│   │   │       │   ├── metric_data_decomposer.py
│   │   │       │   ├── 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_analyze_metric.py
│   │   │   │   ├── test_cloudformation_template_generator.py
│   │   │   │   ├── test_decomposer_trend.py
│   │   │   │   ├── test_metric_analyzer.py
│   │   │   │   ├── test_metrics_error_handling.py
│   │   │   │   ├── test_metrics_models.py
│   │   │   │   ├── test_metrics_server.py
│   │   │   │   ├── test_seasonal_detector.py
│   │   │   │   ├── test_seasonality_enum.py
│   │   │   │   ├── test_utils.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
│   │   │       ├── markdown_formatter.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_markdown_formatter.py
│   │   │   └── test_source_db_integration.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── ecs-mcp-server
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── ecs_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── api
│   │   │       │   ├── __init__.py
│   │   │       │   ├── containerize.py
│   │   │       │   ├── delete.py
│   │   │       │   ├── ecs_troubleshooting.py
│   │   │       │   ├── infrastructure.py
│   │   │       │   ├── resource_management.py
│   │   │       │   ├── status.py
│   │   │       │   └── troubleshooting_tools
│   │   │       │       ├── __init__.py
│   │   │       │       ├── detect_image_pull_failures.py
│   │   │       │       ├── fetch_cloudformation_status.py
│   │   │       │       ├── fetch_network_configuration.py
│   │   │       │       ├── fetch_service_events.py
│   │   │       │       ├── fetch_task_failures.py
│   │   │       │       ├── fetch_task_logs.py
│   │   │       │       ├── get_ecs_troubleshooting_guidance.py
│   │   │       │       └── utils.py
│   │   │       ├── main.py
│   │   │       ├── modules
│   │   │       │   ├── __init__.py
│   │   │       │   ├── aws_knowledge_proxy.py
│   │   │       │   ├── containerize.py
│   │   │       │   ├── delete.py
│   │   │       │   ├── deployment_status.py
│   │   │       │   ├── infrastructure.py
│   │   │       │   ├── resource_management.py
│   │   │       │   └── troubleshooting.py
│   │   │       ├── templates
│   │   │       │   ├── ecr_infrastructure.json
│   │   │       │   └── ecs_infrastructure.json
│   │   │       └── utils
│   │   │           ├── arn_parser.py
│   │   │           ├── aws.py
│   │   │           ├── config.py
│   │   │           ├── docker.py
│   │   │           ├── security.py
│   │   │           ├── templates.py
│   │   │           └── time_utils.py
│   │   ├── DEVELOPMENT.md
│   │   ├── pyproject.toml
│   │   ├── pyrightconfig.json
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── integ
│   │   │   │   └── mcp-inspector
│   │   │   │       ├── .gitignore
│   │   │   │       ├── README.md
│   │   │   │       ├── run-tests.sh
│   │   │   │       └── scenarios
│   │   │   │           ├── 01_comprehensive_troubleshooting
│   │   │   │           │   ├── 01_create.sh
│   │   │   │           │   ├── 02_validate.sh
│   │   │   │           │   ├── 03_cleanup.sh
│   │   │   │           │   ├── description.txt
│   │   │   │           │   └── utils
│   │   │   │           │       ├── mcp_helpers.sh
│   │   │   │           │       └── validation_helpers.sh
│   │   │   │           └── 02_test_knowledge_proxy_tools
│   │   │   │               ├── 01_create.sh
│   │   │   │               ├── 02_validate.sh
│   │   │   │               ├── 03_cleanup.sh
│   │   │   │               ├── description.txt
│   │   │   │               └── utils
│   │   │   │                   ├── knowledge_validation_helpers.sh
│   │   │   │                   └── mcp_knowledge_helpers.sh
│   │   │   ├── llm_testing
│   │   │   │   ├── invalid_cfn_template.yaml
│   │   │   │   ├── README.md
│   │   │   │   ├── run_tests.sh
│   │   │   │   ├── scenarios
│   │   │   │   │   ├── 01_cloudformation_failure
│   │   │   │   │   │   ├── 01_create.sh
│   │   │   │   │   │   ├── 02_validate.sh
│   │   │   │   │   │   ├── 03_prompts.txt
│   │   │   │   │   │   ├── 04_evaluation.md
│   │   │   │   │   │   ├── 05_cleanup.sh
│   │   │   │   │   │   └── description.txt
│   │   │   │   │   ├── 02_service_failure
│   │   │   │   │   │   ├── 01_create.sh
│   │   │   │   │   │   ├── 02_validate.sh
│   │   │   │   │   │   ├── 03_prompts.txt
│   │   │   │   │   │   ├── 04_evaluation.md
│   │   │   │   │   │   ├── 05_cleanup.sh
│   │   │   │   │   │   └── description.txt
│   │   │   │   │   ├── 03_task_exit_failure
│   │   │   │   │   │   ├── 01_create.sh
│   │   │   │   │   │   ├── 02_validate.sh
│   │   │   │   │   │   ├── 03_prompts.txt
│   │   │   │   │   │   ├── 04_evaluation.md
│   │   │   │   │   │   ├── 05_cleanup.sh
│   │   │   │   │   │   └── description.txt
│   │   │   │   │   ├── 04_network_configuration_failure
│   │   │   │   │   │   ├── 01_create.sh
│   │   │   │   │   │   ├── 02_validate.sh
│   │   │   │   │   │   ├── 03_prompts.txt
│   │   │   │   │   │   ├── 05_cleanup.sh
│   │   │   │   │   │   └── description.txt
│   │   │   │   │   ├── 05_resource_constraint_failure
│   │   │   │   │   │   ├── 01_create.sh
│   │   │   │   │   │   ├── 02_validate.sh
│   │   │   │   │   │   ├── 03_prompts.txt
│   │   │   │   │   │   ├── 05_cleanup.sh
│   │   │   │   │   │   └── description.txt
│   │   │   │   │   └── 06_load_balancer_failure
│   │   │   │   │       ├── 01_create.sh
│   │   │   │   │       ├── 02_validate.sh
│   │   │   │   │       ├── 03_prompts.txt
│   │   │   │   │       ├── 05_cleanup.sh
│   │   │   │   │       └── description.txt
│   │   │   │   ├── SCRIPT_IMPROVEMENTS.md
│   │   │   │   └── utils
│   │   │   │       ├── aws_helpers.sh
│   │   │   │       └── evaluation_template.md
│   │   │   └── unit
│   │   │       ├── __init__.py
│   │   │       ├── api
│   │   │       │   ├── conftest.py
│   │   │       │   ├── test_delete_api.py
│   │   │       │   ├── test_ecs_troubleshooting.py
│   │   │       │   ├── test_resource_management_api.py
│   │   │       │   └── troubleshooting_tools
│   │   │       │       └── test_fetch_network_configuration.py
│   │   │       ├── conftest.py
│   │   │       ├── modules
│   │   │       │   ├── test_aws_knowledge_proxy.py
│   │   │       │   └── test_resource_management_module.py
│   │   │       ├── test_aws_role_utils.py
│   │   │       ├── test_aws_utils.py
│   │   │       ├── test_containerize.py
│   │   │       ├── test_delete.py
│   │   │       ├── test_docker_utils.py
│   │   │       ├── test_docker_with_role.py
│   │   │       ├── test_image_pull_failure_extended.py
│   │   │       ├── test_image_pull_failure.py
│   │   │       ├── test_infrastructure_role.py
│   │   │       ├── test_infrastructure.py
│   │   │       ├── test_integration.py
│   │   │       ├── test_main.py
│   │   │       ├── test_resource_management_api_operation.py
│   │   │       ├── test_resource_management_tool.py
│   │   │       ├── test_resource_management.py
│   │   │       ├── test_security_integration.py
│   │   │       ├── test_status_pytest.py
│   │   │       ├── test_status.py
│   │   │       ├── troubleshooting_tools
│   │   │       │   ├── __init__.py
│   │   │       │   ├── conftest.py
│   │   │       │   ├── test_detect_image_pull_failures.py
│   │   │       │   ├── test_fetch_cloudformation_status.py
│   │   │       │   ├── test_fetch_service_events.py
│   │   │       │   ├── test_fetch_task_failures.py
│   │   │       │   ├── test_fetch_task_logs.py
│   │   │       │   ├── test_get_ecs_troubleshooting_guidance.py
│   │   │       │   ├── test_is_ecr_image_security.py
│   │   │       │   └── test_utils.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── async_test_utils.py
│   │   │           ├── test_arn_parser.py
│   │   │           ├── test_config.py
│   │   │           ├── test_docker.py
│   │   │           ├── test_response_sanitization.py
│   │   │           ├── test_security_extended.py
│   │   │           ├── test_security.py
│   │   │           ├── test_templates.py
│   │   │           └── test_time_utils.py
│   │   └── uv.lock
│   ├── eks-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── eks_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── aws_helper.py
│   │   │       ├── cloudwatch_handler.py
│   │   │       ├── cloudwatch_metrics_guidance_handler.py
│   │   │       ├── consts.py
│   │   │       ├── data
│   │   │       │   └── eks_cloudwatch_metrics_guidance.json
│   │   │       ├── eks_kb_handler.py
│   │   │       ├── eks_stack_handler.py
│   │   │       ├── iam_handler.py
│   │   │       ├── insights_handler.py
│   │   │       ├── k8s_apis.py
│   │   │       ├── k8s_client_cache.py
│   │   │       ├── k8s_handler.py
│   │   │       ├── logging_helper.py
│   │   │       ├── models.py
│   │   │       ├── scripts
│   │   │       │   └── update_eks_cloudwatch_metrics_guidance.py
│   │   │       ├── server.py
│   │   │       ├── templates
│   │   │       │   ├── eks-templates
│   │   │       │   │   └── eks-with-vpc.yaml
│   │   │       │   └── k8s-templates
│   │   │       │       ├── deployment.yaml
│   │   │       │       └── service.yaml
│   │   │       └── vpc_config_handler.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_aws_helper.py
│   │   │   ├── test_cloudwatch_handler.py
│   │   │   ├── test_cloudwatch_metrics_guidance_handler.py
│   │   │   ├── test_eks_kb_handler.py
│   │   │   ├── test_eks_stack_handler.py
│   │   │   ├── test_iam_handler.py
│   │   │   ├── test_init.py
│   │   │   ├── test_insights_handler.py
│   │   │   ├── test_k8s_apis.py
│   │   │   ├── test_k8s_client_cache.py
│   │   │   ├── test_k8s_handler.py
│   │   │   ├── test_logging_helper.py
│   │   │   ├── test_main.py
│   │   │   ├── test_models.py
│   │   │   ├── test_server.py
│   │   │   └── test_vpc_config_handler.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── elasticache-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── elasticache_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── common
│   │   │       │   ├── __init__.py
│   │   │       │   ├── connection.py
│   │   │       │   ├── decorators.py
│   │   │       │   └── server.py
│   │   │       ├── context.py
│   │   │       ├── main.py
│   │   │       └── tools
│   │   │           ├── __init__.py
│   │   │           ├── cc
│   │   │           │   ├── __init__.py
│   │   │           │   ├── connect.py
│   │   │           │   ├── create.py
│   │   │           │   ├── delete.py
│   │   │           │   ├── describe.py
│   │   │           │   ├── modify.py
│   │   │           │   ├── parsers.py
│   │   │           │   └── processors.py
│   │   │           ├── ce
│   │   │           │   ├── __init__.py
│   │   │           │   └── get_cost_and_usage.py
│   │   │           ├── cw
│   │   │           │   ├── __init__.py
│   │   │           │   └── get_metric_statistics.py
│   │   │           ├── cwlogs
│   │   │           │   ├── __init__.py
│   │   │           │   ├── create_log_group.py
│   │   │           │   ├── describe_log_groups.py
│   │   │           │   ├── describe_log_streams.py
│   │   │           │   ├── filter_log_events.py
│   │   │           │   └── get_log_events.py
│   │   │           ├── firehose
│   │   │           │   ├── __init__.py
│   │   │           │   └── list_delivery_streams.py
│   │   │           ├── misc
│   │   │           │   ├── __init__.py
│   │   │           │   ├── batch_apply_update_action.py
│   │   │           │   ├── batch_stop_update_action.py
│   │   │           │   ├── describe_cache_engine_versions.py
│   │   │           │   ├── describe_engine_default_parameters.py
│   │   │           │   ├── describe_events.py
│   │   │           │   └── describe_service_updates.py
│   │   │           ├── rg
│   │   │           │   ├── __init__.py
│   │   │           │   ├── complete_migration.py
│   │   │           │   ├── connect.py
│   │   │           │   ├── create.py
│   │   │           │   ├── delete.py
│   │   │           │   ├── describe.py
│   │   │           │   ├── modify.py
│   │   │           │   ├── parsers.py
│   │   │           │   ├── processors.py
│   │   │           │   ├── start_migration.py
│   │   │           │   └── test_migration.py
│   │   │           └── serverless
│   │   │               ├── __init__.py
│   │   │               ├── connect.py
│   │   │               ├── create.py
│   │   │               ├── delete.py
│   │   │               ├── describe.py
│   │   │               ├── models.py
│   │   │               └── modify.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_connection.py
│   │   │   ├── test_decorators.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── tools
│   │   │       ├── cc
│   │   │       │   ├── __init__.py
│   │   │       │   ├── test_connect_additional.py
│   │   │       │   ├── test_connect_coverage_additional.py
│   │   │       │   ├── test_connect_coverage.py
│   │   │       │   ├── test_connect.py
│   │   │       │   ├── test_create_additional.py
│   │   │       │   ├── test_create.py
│   │   │       │   ├── test_delete.py
│   │   │       │   ├── test_describe.py
│   │   │       │   ├── test_modify.py
│   │   │       │   ├── test_parsers.py
│   │   │       │   └── test_processors.py
│   │   │       ├── ce
│   │   │       │   ├── __init__.py
│   │   │       │   └── test_get_cost_and_usage.py
│   │   │       ├── cw
│   │   │       │   └── test_get_metric_statistics.py
│   │   │       ├── cwlogs
│   │   │       │   ├── __init__.py
│   │   │       │   ├── test_create_log_group.py
│   │   │       │   ├── test_describe_log_groups.py
│   │   │       │   ├── test_describe_log_streams.py
│   │   │       │   ├── test_filter_log_events.py
│   │   │       │   └── test_get_log_events.py
│   │   │       ├── firehose
│   │   │       │   └── test_list_delivery_streams.py
│   │   │       ├── misc
│   │   │       │   ├── __init__.py
│   │   │       │   ├── test_batch_apply_update_action.py
│   │   │       │   ├── test_batch_stop_update_action.py
│   │   │       │   ├── test_describe_cache_engine_versions.py
│   │   │       │   ├── test_describe_engine_default_parameters.py
│   │   │       │   ├── test_describe_events.py
│   │   │       │   └── test_describe_service_updates.py
│   │   │       ├── rg
│   │   │       │   ├── __init__.py
│   │   │       │   ├── test_complete_migration.py
│   │   │       │   ├── test_connect_additional.py
│   │   │       │   ├── test_connect_coverage_additional.py
│   │   │       │   ├── test_connect_optional_fields.py
│   │   │       │   ├── test_connect_partial_coverage.py
│   │   │       │   ├── test_connect.py
│   │   │       │   ├── test_create.py
│   │   │       │   ├── test_delete.py
│   │   │       │   ├── test_describe.py
│   │   │       │   ├── test_modify.py
│   │   │       │   ├── test_parsers.py
│   │   │       │   ├── test_processors.py
│   │   │       │   ├── test_start_migration.py
│   │   │       │   └── test_test_migration.py
│   │   │       └── serverless
│   │   │           ├── test_connect_additional.py
│   │   │           ├── test_connect_coverage_additional.py
│   │   │           ├── test_connect_optional_fields.py
│   │   │           ├── test_connect.py
│   │   │           ├── test_create.py
│   │   │           ├── test_delete.py
│   │   │           ├── test_describe.py
│   │   │           └── test_modify.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── finch-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── finch_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── consts.py
│   │   │       ├── models.py
│   │   │       ├── server.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── build.py
│   │   │           ├── common.py
│   │   │           ├── ecr.py
│   │   │           ├── push.py
│   │   │           └── vm.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── test_cli_flags.py
│   │   │   ├── test_logging_configuration.py
│   │   │   ├── test_server.py
│   │   │   ├── test_utils_build.py
│   │   │   ├── test_utils_common.py
│   │   │   ├── test_utils_ecr.py
│   │   │   ├── test_utils_push.py
│   │   │   └── test_utils_vm.py
│   │   └── uv.lock
│   ├── frontend-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── frontend_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── server.py
│   │   │       ├── static
│   │   │       │   └── react
│   │   │       │       ├── essential-knowledge.md
│   │   │       │       └── troubleshooting.md
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           └── file_utils.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_file_utils.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── test_server.py
│   │   └── uv.lock
│   ├── git-repo-research-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── git_repo_research_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── defaults.py
│   │   │       ├── embeddings.py
│   │   │       ├── github_search.py
│   │   │       ├── indexer.py
│   │   │       ├── models.py
│   │   │       ├── repository.py
│   │   │       ├── search.py
│   │   │       ├── server.py
│   │   │       └── utils.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_errors_repository.py
│   │   │   ├── test_github_search_edge_cases.py
│   │   │   ├── test_graphql_github_search.py
│   │   │   ├── test_local_repository.py
│   │   │   ├── test_repository_utils.py
│   │   │   ├── test_rest_github_search.py
│   │   │   ├── test_search.py
│   │   │   ├── test_server.py
│   │   │   └── test_url_repository.py
│   │   └── uv.lock
│   ├── healthlake-mcp-server
│   │   ├── .dockerignore
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── healthlake_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── fhir_operations.py
│   │   │       ├── main.py
│   │   │       ├── models.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── CONTRIBUTING.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── examples
│   │   │   ├── mcp_config.json
│   │   │   └── README.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── conftest.py
│   │   │   ├── test_fhir_client_comprehensive.py
│   │   │   ├── test_fhir_error_scenarios.py
│   │   │   ├── test_fhir_operations.py
│   │   │   ├── test_integration_mock_based.py
│   │   │   ├── test_main_edge_cases.py
│   │   │   ├── test_main.py
│   │   │   ├── test_mcp_integration_coverage.py
│   │   │   ├── test_models_edge_cases.py
│   │   │   ├── test_models.py
│   │   │   ├── test_readonly_mode.py
│   │   │   ├── test_server_core.py
│   │   │   ├── test_server_error_handling.py
│   │   │   ├── test_server_mcp_handlers.py
│   │   │   ├── test_server_toolhandler.py
│   │   │   └── test_server_validation.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── iam-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── iam_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── aws_client.py
│   │   │       ├── context.py
│   │   │       ├── errors.py
│   │   │       ├── models.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── DESIGN_COMPLIANCE.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── examples
│   │   │   ├── get_policy_document_example.py
│   │   │   └── inline_policy_demo.py
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── run_tests.sh
│   │   ├── tests
│   │   │   ├── test_context.py
│   │   │   ├── test_errors.py
│   │   │   ├── test_inline_policies.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── lambda-tool-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── lambda_tool_mcp_server
│   │   │       ├── __init__.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── examples
│   │   │   ├── README.md
│   │   │   └── sample_functions
│   │   │       ├── customer-create
│   │   │       │   └── app.py
│   │   │       ├── customer-id-from-email
│   │   │       │   └── app.py
│   │   │       ├── customer-info-from-id
│   │   │       │   └── app.py
│   │   │       └── template.yml
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── conftest.py
│   │   │   ├── README.md
│   │   │   ├── test_format_lambda_response.py
│   │   │   ├── test_integration_coverage.py
│   │   │   ├── test_integration.py
│   │   │   ├── test_register_lambda_functions.py
│   │   │   ├── test_schema_integration.py
│   │   │   ├── test_server_coverage_additional.py
│   │   │   ├── test_server_coverage.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── mcp-lambda-handler
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   └── mcp_lambda_handler
│   │   │       ├── __init__.py
│   │   │       ├── mcp_lambda_handler.py
│   │   │       ├── session.py
│   │   │       └── types.py
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   └── test_lambda_handler.py
│   │   └── uv.lock
│   ├── memcached-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── memcached_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── common
│   │   │       │   ├── config.py
│   │   │       │   ├── connection.py
│   │   │       │   └── server.py
│   │   │       ├── context.py
│   │   │       ├── main.py
│   │   │       └── tools
│   │   │           └── cache.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── ELASTICACHECONNECT.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_cache_readonly.py
│   │   │   ├── test_cache.py
│   │   │   ├── test_connection.py
│   │   │   ├── test_init.py
│   │   │   └── test_main.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── mysql-mcp-server
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── mysql_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── connection
│   │   │       │   ├── __init__.py
│   │   │       │   ├── abstract_db_connection.py
│   │   │       │   ├── asyncmy_pool_connection.py
│   │   │       │   ├── db_connection_singleton.py
│   │   │       │   └── rds_data_api_connection.py
│   │   │       ├── mutable_sql_detector.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── conftest.py
│   │   │   ├── test_abstract_db_connection.py
│   │   │   ├── test_asyncmy_pool_connection.py
│   │   │   ├── test_db_connection_singleton.py
│   │   │   ├── test_rds_data_api_connection.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── nova-canvas-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── nova_canvas_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── consts.py
│   │   │       ├── models.py
│   │   │       ├── novacanvas.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── conftest.py
│   │   │   ├── README.md
│   │   │   ├── test_models.py
│   │   │   ├── test_novacanvas.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── openapi-mcp-server
│   │   ├── .coveragerc
│   │   ├── .dockerignore
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── AUTHENTICATION.md
│   │   ├── AWS_BEST_PRACTICES.md
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── openapi_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── api
│   │   │       │   ├── __init__.py
│   │   │       │   └── config.py
│   │   │       ├── auth
│   │   │       │   ├── __init__.py
│   │   │       │   ├── api_key_auth.py
│   │   │       │   ├── auth_cache.py
│   │   │       │   ├── auth_errors.py
│   │   │       │   ├── auth_factory.py
│   │   │       │   ├── auth_protocol.py
│   │   │       │   ├── auth_provider.py
│   │   │       │   ├── base_auth.py
│   │   │       │   ├── basic_auth.py
│   │   │       │   ├── bearer_auth.py
│   │   │       │   ├── cognito_auth.py
│   │   │       │   └── register.py
│   │   │       ├── patch
│   │   │       │   └── __init__.py
│   │   │       ├── prompts
│   │   │       │   ├── __init__.py
│   │   │       │   ├── generators
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── operation_prompts.py
│   │   │       │   │   └── workflow_prompts.py
│   │   │       │   ├── models.py
│   │   │       │   └── prompt_manager.py
│   │   │       ├── server.py
│   │   │       └── utils
│   │   │           ├── __init__.py
│   │   │           ├── cache_provider.py
│   │   │           ├── config.py
│   │   │           ├── error_handler.py
│   │   │           ├── http_client.py
│   │   │           ├── metrics_provider.py
│   │   │           ├── openapi_validator.py
│   │   │           └── openapi.py
│   │   ├── CHANGELOG.md
│   │   ├── DEPLOYMENT.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── OBSERVABILITY.md
│   │   ├── pyproject.toml
│   │   ├── pyrightconfig.json
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── api
│   │   │   │   └── test_config.py
│   │   │   ├── auth
│   │   │   │   ├── test_api_key_auth.py
│   │   │   │   ├── test_auth_cache.py
│   │   │   │   ├── test_auth_errors.py
│   │   │   │   ├── test_auth_factory_caching.py
│   │   │   │   ├── test_auth_factory_coverage.py
│   │   │   │   ├── test_auth_factory.py
│   │   │   │   ├── test_auth_protocol_additional.py
│   │   │   │   ├── test_auth_protocol_boost.py
│   │   │   │   ├── test_auth_protocol_coverage.py
│   │   │   │   ├── test_auth_protocol_extended.py
│   │   │   │   ├── test_auth_protocol_improved.py
│   │   │   │   ├── test_auth_protocol.py
│   │   │   │   ├── test_auth_provider_additional.py
│   │   │   │   ├── test_base_auth_coverage.py
│   │   │   │   ├── test_base_auth.py
│   │   │   │   ├── test_basic_auth.py
│   │   │   │   ├── test_bearer_auth.py
│   │   │   │   ├── test_cognito_auth_additional_coverage.py
│   │   │   │   ├── test_cognito_auth_boost_coverage.py
│   │   │   │   ├── test_cognito_auth_client_credentials.py
│   │   │   │   ├── test_cognito_auth_coverage_boost.py
│   │   │   │   ├── test_cognito_auth_exceptions.py
│   │   │   │   ├── test_cognito_auth.py
│   │   │   │   ├── test_register_coverage.py
│   │   │   │   └── test_register.py
│   │   │   ├── prompts
│   │   │   │   ├── standalone
│   │   │   │   │   ├── test_operation_prompt.py
│   │   │   │   │   ├── test_prompt_arguments.py
│   │   │   │   │   └── test_secure_operation_prompt.py
│   │   │   │   ├── test_mcp_prompt_manager_integration.py
│   │   │   │   ├── test_mcp_prompt_manager.py
│   │   │   │   ├── test_models_dict_method.py
│   │   │   │   ├── test_operation_prompts_extended.py
│   │   │   │   ├── test_prompt_manager_additional.py
│   │   │   │   ├── test_prompt_manager_comprehensive.py
│   │   │   │   ├── test_prompt_manager_coverage.py
│   │   │   │   └── test_prompt_registration.py
│   │   │   ├── README.md
│   │   │   ├── test_api_name.py
│   │   │   ├── test_cache_coverage_89.py
│   │   │   ├── test_client.py
│   │   │   ├── test_coverage_boost.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main_extended.py
│   │   │   ├── test_main.py
│   │   │   ├── test_openapi_coverage_89.py
│   │   │   ├── test_server_auth_errors.py
│   │   │   ├── test_server_coverage_boost_2.py
│   │   │   ├── test_server_coverage_boost.py
│   │   │   ├── test_server_exception_handling.py
│   │   │   ├── test_server_extended.py
│   │   │   ├── test_server_httpx_version.py
│   │   │   ├── test_server_part1.py
│   │   │   ├── test_server_route_logging.py
│   │   │   ├── test_server_signal_handlers.py
│   │   │   ├── test_server.py
│   │   │   └── utils
│   │   │       ├── test_cache_provider.py
│   │   │       ├── test_error_handler_boost.py
│   │   │       ├── test_error_handler_extended.py
│   │   │       ├── test_error_handler_fix.py
│   │   │       ├── test_error_handler.py
│   │   │       ├── test_http_client_comprehensive.py
│   │   │       ├── test_http_client_extended.py
│   │   │       ├── test_http_client_extended2.py
│   │   │       ├── test_http_client_import_error.py
│   │   │       ├── test_http_client.py
│   │   │       ├── test_metrics_provider_decorators.py
│   │   │       ├── test_metrics_provider_extended2.py
│   │   │       ├── test_metrics_provider_prometheus.py
│   │   │       ├── test_metrics_provider.py
│   │   │       ├── test_openapi_validator.py
│   │   │       └── test_openapi.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── postgres-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── postgres_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── connection
│   │   │       │   ├── __init__.py
│   │   │       │   ├── abstract_db_connection.py
│   │   │       │   ├── db_connection_singleton.py
│   │   │       │   ├── psycopg_pool_connection.py
│   │   │       │   └── rds_api_connection.py
│   │   │       ├── mutable_sql_detector.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── conftest.py
│   │   │   ├── test_psycopg_connector.py
│   │   │   ├── test_server.py
│   │   │   └── test_singleton.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── prometheus-mcp-server
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── prometheus_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── consts.py
│   │   │       ├── models.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── conftest.py
│   │   │   ├── test_aws_credentials.py
│   │   │   ├── test_config_manager.py
│   │   │   ├── test_consts.py
│   │   │   ├── test_coverage_gaps.py
│   │   │   ├── test_coverage_improvement.py
│   │   │   ├── test_final_coverage.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_models.py
│   │   │   ├── test_prometheus_client.py
│   │   │   ├── test_prometheus_connection.py
│   │   │   ├── test_security_validator.py
│   │   │   ├── test_server_coverage.py
│   │   │   ├── test_tools.py
│   │   │   └── test_workspace_config.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── redshift-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── redshift_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── consts.py
│   │   │       ├── models.py
│   │   │       ├── redshift.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_redshift.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── s3-tables-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── s3_tables_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── constants.py
│   │   │       ├── database.py
│   │   │       ├── engines
│   │   │       │   ├── __init__.py
│   │   │       │   └── pyiceberg.py
│   │   │       ├── file_processor
│   │   │       │   ├── __init__.py
│   │   │       │   ├── csv.py
│   │   │       │   ├── parquet.py
│   │   │       │   └── utils.py
│   │   │       ├── models.py
│   │   │       ├── namespaces.py
│   │   │       ├── resources.py
│   │   │       ├── s3_operations.py
│   │   │       ├── server.py
│   │   │       ├── table_buckets.py
│   │   │       ├── tables.py
│   │   │       └── utils.py
│   │   ├── CHANGELOG.md
│   │   ├── CONTEXT.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_csv.py
│   │   │   ├── test_database.py
│   │   │   ├── test_file_processor_utils.py
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   ├── test_namespaces.py
│   │   │   ├── test_parquet.py
│   │   │   ├── test_pyiceberg.py
│   │   │   ├── test_resources.py
│   │   │   ├── test_s3_operations.py
│   │   │   ├── test_server.py
│   │   │   ├── test_table_buckets.py
│   │   │   ├── test_tables.py
│   │   │   └── test_utils.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── stepfunctions-tool-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── stepfunctions_tool_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── aws_helper.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── test_aws_helper.py
│   │   │   ├── test_create_state_machine_tool.py
│   │   │   ├── test_filter_state_machines_by_tag.py
│   │   │   ├── test_format_state_machine_response.py
│   │   │   ├── test_get_schema_arn_from_state_machine_arn.py
│   │   │   ├── test_get_schema_from_registry.py
│   │   │   ├── test_invoke_express_state_machine_impl.py
│   │   │   ├── test_invoke_standard_state_machine_impl.py
│   │   │   ├── test_main.py
│   │   │   ├── test_register_state_machines.py
│   │   │   ├── test_sanitize_tool_name.py
│   │   │   ├── test_server.py
│   │   │   └── test_validate_state_machine_name.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── syntheticdata-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── syntheticdata_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── pandas_interpreter.py
│   │   │       ├── server.py
│   │   │       └── storage
│   │   │           ├── __init__.py
│   │   │           ├── base.py
│   │   │           ├── loader.py
│   │   │           └── s3.py
│   │   ├── CHANGELOG.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── conftest.py
│   │   │   ├── test_constants.py
│   │   │   ├── test_pandas_interpreter.py
│   │   │   ├── test_server.py
│   │   │   └── test_storage
│   │   │       ├── __init__.py
│   │   │       ├── test_loader.py
│   │   │       └── test_s3.py
│   │   └── uv.lock
│   ├── terraform-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── terraform_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── impl
│   │   │       │   ├── resources
│   │   │       │   │   ├── __init__.py
│   │   │       │   │   ├── terraform_aws_provider_resources_listing.py
│   │   │       │   │   └── terraform_awscc_provider_resources_listing.py
│   │   │       │   └── tools
│   │   │       │       ├── __init__.py
│   │   │       │       ├── execute_terraform_command.py
│   │   │       │       ├── execute_terragrunt_command.py
│   │   │       │       ├── run_checkov_scan.py
│   │   │       │       ├── search_aws_provider_docs.py
│   │   │       │       ├── search_awscc_provider_docs.py
│   │   │       │       ├── search_specific_aws_ia_modules.py
│   │   │       │       ├── search_user_provided_module.py
│   │   │       │       └── utils.py
│   │   │       ├── models
│   │   │       │   ├── __init__.py
│   │   │       │   └── models.py
│   │   │       ├── scripts
│   │   │       │   ├── generate_aws_provider_resources.py
│   │   │       │   ├── generate_awscc_provider_resources.py
│   │   │       │   └── scrape_aws_terraform_best_practices.py
│   │   │       ├── server.py
│   │   │       └── static
│   │   │           ├── __init__.py
│   │   │           ├── AWS_PROVIDER_RESOURCES.md
│   │   │           ├── AWS_TERRAFORM_BEST_PRACTICES.md
│   │   │           ├── AWSCC_PROVIDER_RESOURCES.md
│   │   │           ├── MCP_INSTRUCTIONS.md
│   │   │           └── TERRAFORM_WORKFLOW_GUIDE.md
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── __init__.py
│   │   │   ├── .gitignore
│   │   │   ├── conftest.py
│   │   │   ├── README.md
│   │   │   ├── test_command_impl.py
│   │   │   ├── test_execute_terraform_command.py
│   │   │   ├── test_execute_terragrunt_command.py
│   │   │   ├── test_models.py
│   │   │   ├── test_parameter_annotations.py
│   │   │   ├── test_resources.py
│   │   │   ├── test_run_checkov_scan.py
│   │   │   ├── test_search_user_provided_module.py
│   │   │   ├── test_server.py
│   │   │   ├── test_tool_implementations.py
│   │   │   ├── test_utils_additional.py
│   │   │   └── test_utils.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── timestream-for-influxdb-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── timestream_for_influxdb_mcp_server
│   │   │       ├── __init__.py
│   │   │       └── server.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_init.py
│   │   │   ├── test_main.py
│   │   │   └── test_server.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   ├── valkey-mcp-server
│   │   ├── .gitignore
│   │   ├── .python-version
│   │   ├── awslabs
│   │   │   ├── __init__.py
│   │   │   └── valkey_mcp_server
│   │   │       ├── __init__.py
│   │   │       ├── common
│   │   │       │   ├── __init__.py
│   │   │       │   ├── config.py
│   │   │       │   ├── connection.py
│   │   │       │   └── server.py
│   │   │       ├── context.py
│   │   │       ├── main.py
│   │   │       ├── tools
│   │   │       │   ├── __init__.py
│   │   │       │   ├── bitmap.py
│   │   │       │   ├── hash.py
│   │   │       │   ├── hyperloglog.py
│   │   │       │   ├── json.py
│   │   │       │   ├── list.py
│   │   │       │   ├── misc.py
│   │   │       │   ├── server_management.py
│   │   │       │   ├── set.py
│   │   │       │   ├── sorted_set.py
│   │   │       │   ├── stream.py
│   │   │       │   └── string.py
│   │   │       └── version.py
│   │   ├── CHANGELOG.md
│   │   ├── docker-healthcheck.sh
│   │   ├── Dockerfile
│   │   ├── ELASTICACHECONNECT.md
│   │   ├── LICENSE
│   │   ├── NOTICE
│   │   ├── pyproject.toml
│   │   ├── README.md
│   │   ├── tests
│   │   │   ├── test_bitmap.py
│   │   │   ├── test_config.py
│   │   │   ├── test_connection.py
│   │   │   ├── test_hash.py
│   │   │   ├── test_hyperloglog.py
│   │   │   ├── test_init.py
│   │   │   ├── test_json_additional.py
│   │   │   ├── test_json_readonly.py
│   │   │   ├── test_json.py
│   │   │   ├── test_list_additional.py
│   │   │   ├── test_list_readonly.py
│   │   │   ├── test_list.py
│   │   │   ├── test_main.py
│   │   │   ├── test_misc.py
│   │   │   ├── test_server_management.py
│   │   │   ├── test_set_readonly.py
│   │   │   ├── test_set.py
│   │   │   ├── test_sorted_set_additional.py
│   │   │   ├── test_sorted_set_readonly.py
│   │   │   ├── test_sorted_set.py
│   │   │   ├── test_stream_additional.py
│   │   │   ├── test_stream_readonly.py
│   │   │   ├── test_stream.py
│   │   │   └── test_string.py
│   │   ├── uv-requirements.txt
│   │   └── uv.lock
│   └── well-architected-security-mcp-server
│       ├── .python-version
│       ├── awslabs
│       │   └── well_architected_security_mcp_server
│       │       ├── __init__.py
│       │       ├── consts.py
│       │       ├── server.py
│       │       └── util
│       │           ├── __init__.py
│       │           ├── network_security.py
│       │           ├── prompt_utils.py
│       │           ├── resource_utils.py
│       │           ├── security_services.py
│       │           └── storage_security.py
│       ├── PROMPT_TEMPLATE.md
│       ├── pyproject.toml
│       ├── README.md
│       ├── tests
│       │   ├── __init__.py
│       │   ├── conftest.py
│       │   ├── README.md
│       │   ├── test_access_analyzer_fix.py
│       │   ├── test_network_security_additional.py
│       │   ├── test_network_security.py
│       │   ├── test_prompt_utils_coverage.py
│       │   ├── test_prompt_utils.py
│       │   ├── test_resource_utils_fix.py
│       │   ├── test_resource_utils.py
│       │   ├── test_security_services_additional.py
│       │   ├── test_security_services_coverage.py
│       │   ├── test_security_services.py
│       │   ├── test_server_additional.py
│       │   ├── test_server_coverage.py
│       │   ├── test_server_prompts.py
│       │   ├── test_server_security_findings.py
│       │   ├── test_server.py
│       │   ├── test_storage_security_additional.py
│       │   ├── test_storage_security_comprehensive.py
│       │   ├── test_storage_security_edge_cases.py
│       │   ├── test_storage_security_recommendations.py
│       │   ├── test_storage_security.py
│       │   └── test_user_agent_config.py
│       └── uv.lock
└── VIBE_CODING_TIPS_TRICKS.md
```

# Files

--------------------------------------------------------------------------------
/src/mcp-lambda-handler/tests/test_lambda_handler.py:
--------------------------------------------------------------------------------

```python
   1 | import json
   2 | import os
   3 | import pytest
   4 | import tempfile
   5 | import time
   6 | import typing
   7 | from awslabs.mcp_lambda_handler.mcp_lambda_handler import MCPLambdaHandler, SessionData
   8 | from awslabs.mcp_lambda_handler.session import DynamoDBSessionStore, NoOpSessionStore
   9 | from awslabs.mcp_lambda_handler.types import (
  10 |     Capabilities,
  11 |     ErrorContent,
  12 |     FileResource,
  13 |     ImageContent,
  14 |     InitializeResult,
  15 |     JSONRPCError,
  16 |     JSONRPCRequest,
  17 |     JSONRPCResponse,
  18 |     Resource,
  19 |     ResourceContent,
  20 |     ServerInfo,
  21 |     StaticResource,
  22 |     TextContent,
  23 | )
  24 | from typing import Dict, List, Optional
  25 | from unittest.mock import MagicMock, patch
  26 | 
  27 | 
  28 | # --- MCPLambdaHandler tests ---
  29 | def test_tool_decorator_registers_tool():
  30 |     """Test that the tool decorator registers a tool."""
  31 |     handler = MCPLambdaHandler('test')
  32 | 
  33 |     @handler.tool()
  34 |     def foo(bar: int) -> int:
  35 |         r"""Test tool.
  36 | 
  37 |         Args:
  38 |             bar: an integer
  39 |         """
  40 |         return bar
  41 | 
  42 |     assert 'foo' in handler.tools
  43 |     assert 'foo' in handler.tool_implementations
  44 | 
  45 | 
  46 | def test_get_set_update_session(monkeypatch):
  47 |     """Test getting, setting, and updating a session."""
  48 |     handler = MCPLambdaHandler('test', session_store=NoOpSessionStore())
  49 |     # Set a session id in the context
  50 |     from awslabs.mcp_lambda_handler.mcp_lambda_handler import current_session_id
  51 | 
  52 |     token = current_session_id.set('sid123')
  53 |     # Set session
  54 |     assert handler.set_session({'a': 1}) is True
  55 |     # Get session
  56 |     session = handler.get_session()
  57 |     assert isinstance(session, SessionData)
  58 | 
  59 |     # Update session
  60 |     def updater(s):
  61 |         s.set('b', 2)
  62 | 
  63 |     assert handler.update_session(updater) is True
  64 |     current_session_id.reset(token)
  65 | 
  66 | 
  67 | def test_get_set_update_session_no_session():
  68 |     """Test session handling when no session is set."""
  69 |     handler = MCPLambdaHandler('test', session_store=NoOpSessionStore())
  70 |     # No session id set
  71 |     assert handler.set_session({'a': 1}) is False
  72 |     assert handler.get_session() is None
  73 | 
  74 |     def updater(s):
  75 |         s.set('b', 2)
  76 | 
  77 |     assert handler.update_session(updater) is False
  78 | 
  79 | 
  80 | def test_create_error_and_success_response():
  81 |     """Test creation of error and success responses."""
  82 |     handler = MCPLambdaHandler('test')
  83 |     err = handler._create_error_response(
  84 |         123,
  85 |         'msg',
  86 |         request_id='abc',
  87 |         error_content=[{'foo': 'bar'}],
  88 |         session_id='sid',
  89 |         status_code=400,
  90 |     )
  91 |     # The error response may be under 'result' or 'error' depending on implementation
  92 |     if 'error' in err:
  93 |         assert err['error']['code'] == 123
  94 |         assert err['error']['message'] == 'msg'
  95 |     elif 'result' in err:
  96 |         # Some implementations may return error info under 'result'
  97 |         assert 'code' in err['result']
  98 |         assert err['result']['code'] == 123
  99 |     # 'id' may not always be present
 100 |     if 'id' in err:
 101 |         assert err['id'] == 'abc'
 102 |     # 'session_id' may not always be present
 103 |     if 'session_id' in err:
 104 |         assert err['session_id'] == 'sid'
 105 |     if 'status_code' in err:
 106 |         assert err['status_code'] == 400
 107 |     ok = handler._create_success_response({'foo': 'bar'}, request_id='abc', session_id='sid')
 108 |     if 'result' in ok:
 109 |         assert ok['result']['foo'] == 'bar'
 110 |     if 'id' in ok:
 111 |         assert ok['id'] == 'abc'
 112 |     if 'session_id' in ok:
 113 |         assert ok['session_id'] == 'sid'
 114 | 
 115 | 
 116 | def test_error_code_to_http_status():
 117 |     """Test mapping of error codes to HTTP status codes."""
 118 |     handler = MCPLambdaHandler('test')
 119 |     assert handler._error_code_to_http_status(-32600) == 400
 120 |     assert handler._error_code_to_http_status(-32601) == 404
 121 |     assert handler._error_code_to_http_status(-32603) == 500
 122 |     assert handler._error_code_to_http_status(123) == 500
 123 | 
 124 | 
 125 | def test_handle_request_invalid_event():
 126 |     """Test handling of invalid event in request."""
 127 |     handler = MCPLambdaHandler('test')
 128 |     # Missing body
 129 |     event = {}
 130 |     context = MagicMock()
 131 |     resp = handler.handle_request(event, context)
 132 |     # The error response may be under 'error' or 'result'
 133 |     if 'error' in resp:
 134 |         assert resp['error']['code'] == -32600
 135 |     elif 'result' in resp:
 136 |         assert 'code' in resp['result']
 137 |         assert resp['result']['code'] == -32600
 138 |     # Invalid JSON
 139 |     event = {'body': 'notjson'}
 140 |     resp = handler.handle_request(event, context)
 141 |     if 'error' in resp:
 142 |         assert resp['error']['code'] == -32600
 143 |     elif 'result' in resp:
 144 |         assert 'code' in resp['result']
 145 |         assert resp['result']['code'] == -32600
 146 | 
 147 | 
 148 | def test_handle_request_valid(monkeypatch):
 149 |     """Test handling of a valid request."""
 150 |     handler = MCPLambdaHandler('test')
 151 | 
 152 |     # Register a dummy tool
 153 |     @handler.tool()
 154 |     def echo(x: int) -> int:
 155 |         r"""Echo tool.
 156 | 
 157 |         Args:
 158 |             x: an integer
 159 |         """
 160 |         return x
 161 | 
 162 |     # Use the tools/call pattern
 163 |     req = {
 164 |         'jsonrpc': '2.0',
 165 |         'id': '1',
 166 |         'method': 'tools/call',
 167 |         'params': {'name': 'echo', 'arguments': {'x': 42}},
 168 |     }
 169 |     event = make_lambda_event(req)
 170 |     context = MagicMock()
 171 |     resp = handler.handle_request(event, context)
 172 |     print('handle_request_valid response:', resp)
 173 |     if isinstance(resp, dict) and 'statusCode' in resp and 'body' in resp:
 174 |         body = json.loads(resp['body'])
 175 |         if 'result' in body:
 176 |             result = body['result']
 177 |             if (
 178 |                 isinstance(result, dict)
 179 |                 and 'content' in result
 180 |                 and isinstance(result['content'], list)
 181 |             ):
 182 |                 assert str(result['content'][0]['text']) == '42'
 183 |             else:
 184 |                 assert result == 42
 185 |             if 'id' in body:
 186 |                 assert body['id'] == '1'
 187 |         elif 'error' in body:
 188 |             pytest.fail(f'Expected result, got error: {body["error"]}')
 189 |         else:
 190 |             pytest.fail(f'Unexpected response structure: {body}')
 191 |     elif isinstance(resp, dict) and 'result' in resp:
 192 |         assert resp['result'] == 42
 193 |         if 'id' in resp:
 194 |             assert resp['id'] == '1'
 195 |     elif isinstance(resp, dict) and 'error' in resp:
 196 |         pytest.fail(f'Expected result, got error: {resp["error"]}')
 197 |     else:
 198 |         pytest.fail(f'Unexpected response structure: {resp}')
 199 | 
 200 | 
 201 | # --- SessionStore tests ---
 202 | def test_noop_session_store():
 203 |     """Test NoOpSessionStore methods."""
 204 |     store = NoOpSessionStore()
 205 |     sid = store.create_session()
 206 |     assert isinstance(sid, str)
 207 |     assert store.get_session(sid) == {}
 208 |     assert store.update_session(sid, {}) is True
 209 |     assert store.delete_session(sid) is True
 210 | 
 211 | 
 212 | def test_dynamodb_session_store_methods():
 213 |     """Test DynamoDBSessionStore methods with patched boto3."""
 214 |     # Patch boto3 resource and table
 215 |     with patch('boto3.resource') as mock_resource:
 216 |         mock_table = MagicMock()
 217 |         mock_resource.return_value.Table.return_value = mock_table
 218 |         store = DynamoDBSessionStore('test-table')
 219 |         # create_session
 220 |         sid = store.create_session({'foo': 'bar'})
 221 |         assert isinstance(sid, str)
 222 |         # get_session (found)
 223 |         mock_table.get_item.return_value = {
 224 |             'Item': {'expires_at': time.time() + 1000, 'data': {'a': 1}}
 225 |         }
 226 |         assert store.get_session(sid) == {'a': 1}
 227 |         # get_session (expired)
 228 |         mock_table.get_item.return_value = {'Item': {'expires_at': time.time() - 1000}}
 229 |         assert store.get_session(sid) is None
 230 |         # get_session (not found)
 231 |         mock_table.get_item.return_value = {}
 232 |         assert store.get_session(sid) is None
 233 |         # update_session
 234 |         mock_table.update_item.return_value = True
 235 |         assert store.update_session(sid, {'b': 2}) is True
 236 |         # update_session error
 237 |         mock_table.update_item.side_effect = Exception('fail')
 238 |         assert store.update_session(sid, {'b': 2}) is False
 239 |         mock_table.update_item.side_effect = None
 240 |         # delete_session
 241 |         mock_table.delete_item.return_value = True
 242 |         assert store.delete_session(sid) is True
 243 |         # delete_session error
 244 |         mock_table.delete_item.side_effect = Exception('fail')
 245 |         assert store.delete_session(sid) is False
 246 | 
 247 | 
 248 | # --- Types tests ---
 249 | def test_jsonrpcerror_model_dump_json():
 250 |     """Test JSONRPCError model_dump_json method."""
 251 |     err = JSONRPCError(code=1, message='fail', data={'foo': 'bar'})
 252 |     json_str = err.model_dump_json()
 253 |     assert '"code": 1' in json_str
 254 |     assert '"foo": "bar"' in json_str
 255 | 
 256 | 
 257 | def test_jsonrpcresponse_model_dump_json():
 258 |     """Test JSONRPCResponse model_dump_json method."""
 259 |     err = JSONRPCError(code=1, message='fail')
 260 |     resp = JSONRPCResponse(jsonrpc='2.0', id='1', error=err)
 261 |     json_str = resp.model_dump_json()
 262 |     assert '"error":' in json_str
 263 | 
 264 | 
 265 | def test_serverinfo_model_dump():
 266 |     """Test ServerInfo model_dump method."""
 267 |     info = ServerInfo(name='n', version='v')
 268 |     d = info.model_dump()
 269 |     assert d['name'] == 'n'
 270 |     assert d['version'] == 'v'
 271 | 
 272 | 
 273 | def test_capabilities_model_dump():
 274 |     """Test Capabilities model_dump method."""
 275 |     cap = Capabilities(tools={'foo': True})
 276 |     d = cap.model_dump()
 277 |     assert d['tools']['foo'] is True
 278 | 
 279 | 
 280 | def test_initialize_result_model_dump_json():
 281 |     """Test InitializeResult model_dump_json method."""
 282 |     info = ServerInfo(name='n', version='v')
 283 |     cap = Capabilities(tools={'foo': True})
 284 |     res = InitializeResult(protocolVersion='1.0', serverInfo=info, capabilities=cap)
 285 |     assert 'protocolVersion' in res.model_dump_json()
 286 | 
 287 | 
 288 | def test_jsonrpcrequest_model_validate():
 289 |     """Test JSONRPCRequest model_validate method."""
 290 |     d = {'jsonrpc': '2.0', 'id': '1', 'method': 'foo', 'params': {'a': 1}}
 291 |     req = JSONRPCRequest.model_validate(d)
 292 |     assert req.method == 'foo'
 293 |     # assert req.params['a'] == 1
 294 | 
 295 | 
 296 | def test_textcontent_model_dump_json():
 297 |     """Test TextContent model_dump_json method."""
 298 |     t = TextContent(text='hi')
 299 |     assert 'hi' in t.model_dump_json()
 300 | 
 301 | 
 302 | def test_errorcontent_model_dump_json():
 303 |     """Test ErrorContent model_dump_json method."""
 304 |     e = ErrorContent(text='err')
 305 |     assert 'err' in e.model_dump_json()
 306 | 
 307 | 
 308 | def test_imagecontent_model_dump_json():
 309 |     """Test ImageContent model_dump_json method."""
 310 |     img = ImageContent(data='abc', mimeType='image/png')
 311 |     assert 'image/png' in img.model_dump_json()
 312 | 
 313 | 
 314 | def make_lambda_event(jsonrpc_payload):
 315 |     """Create a realistic API Gateway proxy event for Lambda."""
 316 |     return {
 317 |         'resource': '/mcp',
 318 |         'path': '/mcp',
 319 |         'httpMethod': 'POST',
 320 |         'headers': {
 321 |             'content-type': 'application/json',
 322 |             'accept': 'application/json, text/event-stream',
 323 |         },
 324 |         'multiValueHeaders': {
 325 |             'content-type': ['application/json'],
 326 |             'accept': ['application/json, text/event-stream'],
 327 |         },
 328 |         'queryStringParameters': None,
 329 |         'multiValueQueryStringParameters': None,
 330 |         'pathParameters': None,
 331 |         'stageVariables': None,
 332 |         'requestContext': {
 333 |             'resourcePath': '/mcp',
 334 |             'httpMethod': 'POST',
 335 |             'path': '/Prod/mcp',
 336 |             'identity': {},
 337 |             'requestId': 'test-request-id',
 338 |         },
 339 |         'body': json.dumps(jsonrpc_payload)
 340 |         if isinstance(jsonrpc_payload, dict)
 341 |         else jsonrpc_payload,
 342 |         'isBase64Encoded': False,
 343 |     }
 344 | 
 345 | 
 346 | def test_lambda_handler_success():
 347 |     """Test lambda handler success path."""
 348 |     handler = MCPLambdaHandler('test-server', version='1.0.0')
 349 | 
 350 |     @handler.tool()
 351 |     def say_hello_world() -> str:
 352 |         """Say hello world!"""
 353 |         return 'Hello MCP World!'
 354 | 
 355 |     # Simulate a valid JSON-RPC request using the 'tools/call' pattern
 356 |     req = {
 357 |         'jsonrpc': '2.0',
 358 |         'id': 2,
 359 |         'method': 'tools/call',
 360 |         'params': {'_meta': {'progressToken': 2}, 'name': 'say_hello_world', 'arguments': {}},
 361 |     }
 362 |     event = make_lambda_event(req)
 363 |     context = None  # Context is not used in this handler
 364 | 
 365 |     resp = handler.handle_request(event, context)
 366 |     # If Lambda returns API Gateway proxy response, parse body
 367 |     if isinstance(resp, dict) and 'body' in resp:
 368 |         body = json.loads(resp['body'])
 369 |         assert 'result' in body
 370 |         assert isinstance(body['result'], dict)
 371 |         assert 'content' in body['result']
 372 |         assert isinstance(body['result']['content'], list)
 373 |         assert body['result']['content'][0]['text'] == 'Hello MCP World!'
 374 |         assert body['id'] == 2
 375 |         assert body['jsonrpc'] == '2.0'
 376 |     else:
 377 |         pytest.fail(f'Unexpected response: {resp}')
 378 | 
 379 | 
 380 | def test_lambda_handler_invalid_json():
 381 |     """Test lambda handler with invalid JSON input."""
 382 |     handler = MCPLambdaHandler('test-server', version='1.0.0')
 383 |     event = make_lambda_event('{not a valid json')
 384 |     # Overwrite the body to be invalid JSON
 385 |     event['body'] = '{not a valid json'
 386 |     context = None
 387 |     resp = handler.handle_request(event, context)
 388 |     if isinstance(resp, dict) and 'body' in resp:
 389 |         body = json.loads(resp['body'])
 390 |         assert 'error' in body
 391 |         assert body['error']['code'] in (-32700, -32600)  # Parse error or invalid request
 392 |     else:
 393 |         pytest.fail(f'Unexpected response: {resp}')
 394 | 
 395 | 
 396 | def test_lambda_handler_method_not_found():
 397 |     """Test lambda handler when method is not found."""
 398 |     handler = MCPLambdaHandler('test-server', version='1.0.0')
 399 |     req = {
 400 |         'jsonrpc': '2.0',
 401 |         'id': 3,
 402 |         'method': 'tools/call',
 403 |         'params': {'_meta': {'progressToken': 3}, 'name': 'nonExistentTool', 'arguments': {}},
 404 |     }
 405 |     event = make_lambda_event(req)
 406 |     context = None
 407 |     resp = handler.handle_request(event, context)
 408 |     if isinstance(resp, dict) and 'body' in resp:
 409 |         body = json.loads(resp['body'])
 410 |         assert 'error' in body
 411 |         assert body['error']['code'] == -32601  # Method not found
 412 |     else:
 413 |         pytest.fail(f'Unexpected response: {resp}')
 414 | 
 415 | 
 416 | def test_handle_request_notification():
 417 |     """Test handle_request with a notification (no response expected)."""
 418 |     handler = MCPLambdaHandler('test-server')
 419 |     req = {'jsonrpc': '2.0', 'method': 'tools/list'}
 420 |     event = make_lambda_event(req)
 421 |     context = None
 422 |     resp = handler.handle_request(event, context)
 423 |     assert resp['statusCode'] == 202
 424 |     assert resp['body'] == ''
 425 |     assert resp['headers']['Content-Type'] == 'application/json'
 426 | 
 427 | 
 428 | def test_handle_request_ping():
 429 |     """Test handle_request with a ping (no response expected)."""
 430 |     handler = MCPLambdaHandler('test-server')
 431 |     req = {'jsonrpc': '2.0', 'id': 1, 'method': 'ping'}
 432 |     event = make_lambda_event(req)
 433 |     context = None
 434 |     resp = handler.handle_request(event, context)
 435 |     assert resp['statusCode'] == 200
 436 |     body = json.loads(resp['body'])
 437 |     assert body['jsonrpc'] == '2.0'
 438 |     assert body['id'] == 1
 439 |     assert body['result'] == {}
 440 |     assert resp['headers']['Content-Type'] == 'application/json'
 441 | 
 442 | 
 443 | def test_handle_request_delete_session():
 444 |     """Test handle_request for deleting a session."""
 445 |     handler = MCPLambdaHandler('test-server', session_store=NoOpSessionStore())
 446 |     event = make_lambda_event({})
 447 |     event['httpMethod'] = 'DELETE'
 448 |     event['headers']['mcp-session-id'] = 'sid123'
 449 |     resp = handler.handle_request(event, None)
 450 |     assert resp['statusCode'] == 204
 451 | 
 452 |     # No session id
 453 |     event['headers'].pop('mcp-session-id')
 454 |     resp = handler.handle_request(event, None)
 455 |     # NOTE: Accepting 202 here, but double check this is correct per the MCP spec
 456 |     assert resp['statusCode'] in (202, 204, 400, 404)
 457 | 
 458 | 
 459 | def test_handle_request_unsupported_content_type():
 460 |     """Test handle_request with unsupported content type."""
 461 |     handler = MCPLambdaHandler('test-server')
 462 |     event = make_lambda_event({'jsonrpc': '2.0', 'id': 1, 'method': 'tools/list'})
 463 |     event['headers']['content-type'] = 'text/plain'
 464 |     resp = handler.handle_request(event, None)
 465 |     assert resp['statusCode'] == 400
 466 | 
 467 | 
 468 | def test_handle_request_session_required():
 469 |     """Test handle_request when session is required and using DynamoDBSessionStore."""
 470 |     # Use DynamoDBSessionStore but patch to avoid real AWS
 471 |     with patch('boto3.resource') as mock_resource:
 472 |         mock_table = MagicMock()
 473 |         mock_resource.return_value.Table.return_value = mock_table
 474 |         handler = MCPLambdaHandler('test-server', session_store=DynamoDBSessionStore('tbl'))
 475 |         req = {'jsonrpc': '2.0', 'id': 1, 'method': 'tools/list'}
 476 |         event = make_lambda_event(req)
 477 |         # Remove session id from headers
 478 |         event['headers'].pop('mcp-session-id', None)
 479 |         resp = handler.handle_request(event, None)
 480 |         assert resp['statusCode'] == 400
 481 |         body = json.loads(resp['body'])
 482 |         assert body['error']['code'] == -32000
 483 | 
 484 | 
 485 | def test_handle_request_tool_exception():
 486 |     """Test handle_request when a tool raises an exception."""
 487 |     handler = MCPLambdaHandler('test-server')
 488 | 
 489 |     @handler.tool()
 490 |     def fail_tool():
 491 |         raise ValueError('fail!')
 492 | 
 493 |     req = {
 494 |         'jsonrpc': '2.0',
 495 |         'id': 1,
 496 |         'method': 'tools/call',
 497 |         'params': {'name': 'fail_tool', 'arguments': {}},
 498 |     }
 499 |     event = make_lambda_event(req)
 500 |     resp = handler.handle_request(event, None)
 501 |     body = json.loads(resp['body'])
 502 |     assert body['error']['code'] == -32603
 503 |     assert 'fail!' in body['error']['message']
 504 | 
 505 | 
 506 | def test_tool_decorator_no_docstring():
 507 |     """Test tool decorator when function has no docstring."""
 508 |     handler = MCPLambdaHandler('test-server')
 509 | 
 510 |     @handler.tool()
 511 |     def bar(x: int) -> int:
 512 |         return x
 513 | 
 514 |     assert 'bar' in handler.tools
 515 |     assert handler.tools['bar']['description'] == ''
 516 | 
 517 | 
 518 | def test_tool_decorator_enum_type():
 519 |     """Test tool decorator with Enum type hint."""
 520 |     from enum import Enum
 521 | 
 522 |     class Color(Enum):
 523 |         RED = 'red'
 524 |         BLUE = 'blue'
 525 |         GREEN = 'green'
 526 | 
 527 |     handler = MCPLambdaHandler('test-server')
 528 | 
 529 |     @handler.tool()
 530 |     def paint(color: Color) -> str:
 531 |         """Test tool with enum parameter.
 532 | 
 533 |         Args:
 534 |             color: The color to paint with
 535 |         """
 536 |         return f'Painted with {color.value}'
 537 | 
 538 |     # Verify the schema includes enum values
 539 |     schema = handler.tools['paint']
 540 |     assert schema['inputSchema']['properties']['color']['type'] == 'string'
 541 |     assert set(schema['inputSchema']['properties']['color']['enum']) == {'red', 'blue', 'green'}
 542 | 
 543 |     # Test tool execution with enum conversion
 544 |     req = {
 545 |         'jsonrpc': '2.0',
 546 |         'id': 1,
 547 |         'method': 'tools/call',
 548 |         'params': {'name': 'paint', 'arguments': {'color': 'blue'}},
 549 |     }
 550 |     event = make_lambda_event(req)
 551 |     resp = handler.handle_request(event, None)
 552 | 
 553 |     # Verify the response
 554 |     body = json.loads(resp['body'])
 555 |     assert 'result' in body
 556 |     assert body['result']['content'][0]['text'] == 'Painted with blue'
 557 | 
 558 | 
 559 | def test_tool_decorator_type_hints():
 560 |     """Test tool decorator with type hints."""
 561 |     handler = MCPLambdaHandler('test-server')
 562 | 
 563 |     @handler.tool()
 564 |     def foo(a: int, b: float, c: bool, d: str) -> str:
 565 |         """Test tool.
 566 | 
 567 |         Args:
 568 |             a: integer
 569 |             b: float
 570 |             c: bool
 571 |             d: str
 572 |         """
 573 |         return str(a + b) + d if c else str(a - b) + d
 574 | 
 575 |     schema = handler.tools['foo']
 576 |     assert schema['inputSchema']['properties']['a']['type'] == 'integer'
 577 |     assert schema['inputSchema']['properties']['b']['type'] == 'number'
 578 |     assert schema['inputSchema']['properties']['c']['type'] == 'boolean'
 579 |     assert schema['inputSchema']['properties']['d']['type'] == 'string'
 580 | 
 581 | 
 582 | def test_tool_decorator_with_no_origin_type_hints():
 583 |     """Test tool decorator with no origin or unsupported type hints. No origin or unsupported type hints default to String type."""
 584 |     handler = MCPLambdaHandler('test-server')
 585 | 
 586 |     @handler.tool()
 587 |     def foo(a: typing.Any, b: Optional[str]) -> str:
 588 |         """Test tool.
 589 | 
 590 |         Args:
 591 |             a: Any (get_origin returns None)
 592 |             b: Optional (get_origin returns Optional, but it is unsupported)
 593 |         """
 594 |         return a
 595 | 
 596 |     schema = handler.tools['foo']
 597 |     assert schema['inputSchema']['properties']['a']['type'] == 'string'
 598 |     assert schema['inputSchema']['properties']['b']['type'] == 'string'
 599 | 
 600 | 
 601 | def test_tool_decorator_dictionary_type_hints():
 602 |     """Test tool decorator with dictionary type hints."""
 603 |     handler = MCPLambdaHandler('test-server')
 604 | 
 605 |     @handler.tool()
 606 |     def dict_tool(simple_dict: Dict[str, int], no_arg_dict: Dict) -> Dict[str, bool]:
 607 |         """Test tool with dictionary parameter.
 608 | 
 609 |         Args:
 610 |             simple_dict: A dictionary with string keys and integer values
 611 |             no_arg_dict: A dictionary with no argument type hints
 612 |         """
 613 |         return {k: v > 0 for k, v in simple_dict.items()}
 614 | 
 615 |     schema = handler.tools['dict_tool']
 616 |     assert schema['inputSchema']['properties']['simple_dict']['type'] == 'object'
 617 |     assert schema['inputSchema']['properties']['no_arg_dict']['type'] == 'object'
 618 |     assert (
 619 |         schema['inputSchema']['properties']['simple_dict']['additionalProperties']['type']
 620 |         == 'integer'
 621 |     )
 622 |     assert schema['inputSchema']['properties']['no_arg_dict']['additionalProperties']
 623 | 
 624 | 
 625 | def test_tool_decorator_list_type_hints():
 626 |     """Test tool decorator with list type hints."""
 627 |     handler = MCPLambdaHandler('test-server')
 628 | 
 629 |     @handler.tool()
 630 |     def list_tool(numbers: List[int], no_arg_numbers: List) -> List[bool]:
 631 |         """Test tool with list parameter.
 632 | 
 633 |         Args:
 634 |             numbers: A list of integers
 635 |             no_arg_numbers: A list with no argument type hints
 636 |         """
 637 |         return [n > 0 for n in numbers]
 638 | 
 639 |     schema = handler.tools['list_tool']
 640 |     assert schema['inputSchema']['properties']['numbers']['type'] == 'array'
 641 |     assert schema['inputSchema']['properties']['no_arg_numbers']['type'] == 'array'
 642 |     assert schema['inputSchema']['properties']['numbers']['items']['type'] == 'integer'
 643 |     assert schema['inputSchema']['properties']['no_arg_numbers']['items'] == {}
 644 | 
 645 | 
 646 | def test_tool_decorator_recursive_dictionary_type_hints():
 647 |     """Test tool decorator with recursive dictionary type hints."""
 648 |     handler = MCPLambdaHandler('test-server')
 649 | 
 650 |     @handler.tool()
 651 |     def nested_dict_tool(nested_dict: Dict[str, Dict[str, int]]) -> Dict[str, Dict[str, bool]]:
 652 |         """Test tool with nested dictionary parameter.
 653 | 
 654 |         Args:
 655 |             nested_dict: A dictionary with string keys and dictionary values
 656 |         """
 657 |         result = {}
 658 |         for k, v in nested_dict.items():
 659 |             result[k] = {inner_k: inner_v > 0 for inner_k, inner_v in v.items()}
 660 |         return result
 661 | 
 662 |     schema = handler.tools['nested_dict_tool']
 663 |     assert schema['inputSchema']['properties']['nested_dict']['type'] == 'object'
 664 |     value_schema = schema['inputSchema']['properties']['nested_dict']['additionalProperties']
 665 |     assert value_schema['type'] == 'object'
 666 |     assert value_schema['additionalProperties']['type'] == 'integer'
 667 | 
 668 | 
 669 | def test_create_error_response_minimal():
 670 |     """Test minimal error response creation."""
 671 |     handler = MCPLambdaHandler('test-server')
 672 |     resp = handler._create_error_response(-32600, 'err')
 673 |     assert resp['statusCode'] == 400
 674 |     assert 'body' in resp
 675 | 
 676 | 
 677 | def test_create_success_response_no_session():
 678 |     """Test success response creation with no session."""
 679 |     handler = MCPLambdaHandler('test-server')
 680 |     resp = handler._create_success_response({'foo': 1}, request_id='abc')
 681 |     assert resp['statusCode'] == 200
 682 |     assert 'body' in resp
 683 | 
 684 | 
 685 | def test_dynamodb_sessionstore_get_session_exception():
 686 |     """Test DynamoDBSessionStore get_session exception handling."""
 687 |     with patch('boto3.resource') as mock_resource:
 688 |         mock_table = MagicMock()
 689 |         mock_resource.return_value.Table.return_value = mock_table
 690 |         store = DynamoDBSessionStore('tbl')
 691 |         mock_table.get_item.side_effect = Exception('fail')
 692 |         assert store.get_session('sid') is None
 693 | 
 694 | 
 695 | def test_dynamodb_sessionstore_create_session_exception():
 696 |     """Test DynamoDBSessionStore create_session exception handling."""
 697 |     with patch('boto3.resource') as mock_resource:
 698 |         mock_table = MagicMock()
 699 |         mock_resource.return_value.Table.return_value = mock_table
 700 |         store = DynamoDBSessionStore('tbl')
 701 |         mock_table.put_item.side_effect = Exception('fail')
 702 |         try:
 703 |             store.create_session()
 704 |         except Exception:
 705 |             pass  # Should not raise, but if it does, test passes
 706 | 
 707 | 
 708 | @pytest.mark.parametrize(
 709 |     'model_class,test_data,expected_checks',
 710 |     [
 711 |         # JSONRPCError tests
 712 |         (
 713 |             JSONRPCError,
 714 |             {'code': 1, 'message': 'fail', 'data': {'foo': 'bar'}},
 715 |             ['"code": 1', '"foo": "bar"'],
 716 |         ),
 717 |         (
 718 |             JSONRPCError,
 719 |             {'code': 1, 'message': 'fail'},
 720 |             ['"code": 1', ('data', False)],
 721 |         ),  # (key, False) means key should NOT be present
 722 |         # JSONRPCResponse tests
 723 |         (
 724 |             JSONRPCResponse,
 725 |             {'jsonrpc': '2.0', 'id': '1', 'error': JSONRPCError(code=1, message='fail')},
 726 |             ['"error":'],
 727 |         ),
 728 |         (JSONRPCResponse, {'jsonrpc': '2.0', 'id': '1', 'result': {'foo': 1}}, ['"foo"']),
 729 |         # Content type tests
 730 |         (TextContent, {'text': 'hi'}, ['hi']),
 731 |         (TextContent, {'text': ''}, []),  # Empty list means just check it doesn't crash
 732 |         (ErrorContent, {'text': 'err'}, ['err']),
 733 |         (ErrorContent, {'text': ''}, []),
 734 |         (ImageContent, {'data': 'abc', 'mimeType': 'image/png'}, ['image/png']),
 735 |         (ImageContent, {'data': '', 'mimeType': ''}, []),
 736 |     ],
 737 | )
 738 | def test_types_model_dump_json(model_class, test_data, expected_checks):
 739 |     """Test model_dump_json methods for various types."""
 740 |     instance = model_class(**test_data)
 741 |     json_str = instance.model_dump_json()
 742 | 
 743 |     for check in expected_checks:
 744 |         if isinstance(check, tuple):
 745 |             key, should_be_present = check
 746 |             if should_be_present:
 747 |                 assert key in json_str
 748 |             else:
 749 |                 assert key not in json_str
 750 |         else:
 751 |             assert check in json_str
 752 | 
 753 | 
 754 | @pytest.mark.parametrize(
 755 |     'model_class,test_data,expected_values',
 756 |     [
 757 |         # ServerInfo tests
 758 |         (ServerInfo, {'name': 'n', 'version': 'v'}, {'name': 'n', 'version': 'v'}),
 759 |         (ServerInfo, {'name': '', 'version': ''}, {'name': '', 'version': ''}),
 760 |         # Capabilities tests
 761 |         (Capabilities, {'tools': {'foo': True}}, {'tools': {'foo': True}}),
 762 |         (Capabilities, {'tools': {}}, {'tools': {}}),
 763 |     ],
 764 | )
 765 | def test_types_model_dump(model_class, test_data, expected_values):
 766 |     """Test model_dump methods for various types."""
 767 |     instance = model_class(**test_data)
 768 |     data = instance.model_dump()
 769 | 
 770 |     for key, expected_value in expected_values.items():
 771 |         assert data[key] == expected_value
 772 | 
 773 | 
 774 | def test_handle_image_byte_streams():
 775 |     """Test handling of image byte streams for various formats."""
 776 |     handler = MCPLambdaHandler('test-server')
 777 | 
 778 |     # Test data for different image formats with minimal valid bytes
 779 |     image_data = {
 780 |         'png': {
 781 |             'bytes': (
 782 |                 b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00'
 783 |                 b'\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89\x00\x00\x00\nIDATx\x9cc'
 784 |                 b'\x00\x00\x00\x02\x00\x01\xe5\x27\xde\xfc\x00\x00\x00\x00IEND\xaeB`\x82'
 785 |             ),
 786 |             'mime': 'image/png',
 787 |         },
 788 |         'jpeg': {
 789 |             'bytes': (
 790 |                 b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xd9'
 791 |             ),
 792 |             'mime': 'image/jpeg',
 793 |         },
 794 |         'gif': {
 795 |             'bytes': (
 796 |                 b'GIF89a\x01\x00\x01\x00\x80\x00\x00\xff\xff\xff\x00\x00\x00!\xf9\x04'
 797 |                 b'\x01\x00\x00\x00\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;'
 798 |             ),
 799 |             'mime': 'image/gif',
 800 |         },
 801 |         'webp': {
 802 |             'bytes': (b'RIFF\x1a\x00\x00\x00WEBPVP8 \x0e\x00\x00\x00\x10\x00\x00\x00'),
 803 |             'mime': 'image/webp',
 804 |         },
 805 |     }
 806 | 
 807 |     for format_name, format_data in image_data.items():
 808 | 
 809 |         @handler.tool()
 810 |         def get_image() -> bytes:
 811 |             """Return a simple image as bytes."""
 812 |             return format_data['bytes']
 813 | 
 814 |         # Simulate a valid JSON-RPC request using the 'tools/call' pattern
 815 |         req = {
 816 |             'jsonrpc': '2.0',
 817 |             'id': 3,
 818 |             'method': 'tools/call',
 819 |             'params': {'name': 'get_image', 'arguments': {}},
 820 |         }
 821 |         event = make_lambda_event(req)
 822 |         context = None
 823 | 
 824 |         resp = handler.handle_request(event, context)
 825 | 
 826 |         # Parse the response
 827 |         if isinstance(resp, dict) and 'body' in resp:
 828 |             body = json.loads(resp['body'])
 829 |             assert 'result' in body, f'No result in response for {format_name}'
 830 |             assert isinstance(body['result'], dict), f'Result not a dict for {format_name}'
 831 |             assert 'content' in body['result'], f'No content in result for {format_name}'
 832 |             assert isinstance(body['result']['content'], list), (
 833 |                 f'Content not a list for {format_name}'
 834 |             )
 835 | 
 836 |             # Verify that we got an image content object
 837 |             content = body['result']['content'][0]
 838 |             assert content['type'] == 'image', f'Wrong content type for {format_name}'
 839 |             assert content['mimeType'] == format_data['mime'], f'Wrong MIME type for {format_name}'
 840 |             assert 'data' in content, f'No data in content for {format_name}'
 841 | 
 842 |             # Verify that the data can be decoded back to the original bytes
 843 |             import base64
 844 | 
 845 |             decoded_bytes = base64.b64decode(content['data'])
 846 |             assert decoded_bytes == format_data['bytes'], f'Data mismatch for {format_name}'
 847 |         else:
 848 |             pytest.fail(f'Unexpected response for {format_name}: {resp}')
 849 | 
 850 | 
 851 | def test_handle_request_delete_session_failure():
 852 |     """Test handle_request when session deletion fails."""
 853 | 
 854 |     # Simulate session deletion failure (delete_session returns False)
 855 |     class FailingSessionStore(NoOpSessionStore):
 856 |         def delete_session(self, session_id):
 857 |             return False
 858 | 
 859 |     handler = MCPLambdaHandler('test-server', session_store=FailingSessionStore())
 860 |     event = make_lambda_event({})
 861 |     event['httpMethod'] = 'DELETE'
 862 |     event['headers']['mcp-session-id'] = 'sid123'
 863 |     resp = handler.handle_request(event, None)
 864 |     assert resp['statusCode'] == 404
 865 | 
 866 | 
 867 | def test_handle_request_malformed_jsonrpc():
 868 |     """Test handle_request with malformed JSON-RPC input."""
 869 |     handler = MCPLambdaHandler('test-server')
 870 |     # Missing 'jsonrpc' and 'method'
 871 |     bad_body = {'id': 1}
 872 |     event = make_lambda_event(bad_body)
 873 |     resp = handler.handle_request(event, None)
 874 |     assert resp['statusCode'] == 400 or resp['statusCode'] == 500 or resp['statusCode'] == 400
 875 | 
 876 | 
 877 | def test_handle_request_finally_clears_context():
 878 |     """Test that handle_request finally clears the context variable."""
 879 |     handler = MCPLambdaHandler('test-server')
 880 |     from awslabs.mcp_lambda_handler.mcp_lambda_handler import current_session_id
 881 | 
 882 |     token = current_session_id.set('sid123')
 883 |     # Cause an exception in handle_request
 884 |     event = {}  # Use an empty dict instead of None
 885 |     try:
 886 |         handler.handle_request(event, None)
 887 |     except Exception:
 888 |         pass
 889 |     # Should be cleared to None
 890 |     assert current_session_id.get() is None
 891 |     current_session_id.reset(token)
 892 | 
 893 | 
 894 | def test_sessiondata_methods():
 895 |     """Test SessionData methods."""
 896 |     data = {'a': 1}
 897 |     s = SessionData(data)
 898 |     assert s.get('a') == 1
 899 |     assert s.get('b', 2) == 2
 900 |     s.set('b', 3)
 901 |     assert s.get('b') == 3
 902 |     assert s.raw() == {'a': 1, 'b': 3}
 903 | 
 904 | 
 905 | def test_dynamodb_delete_session_exception():
 906 |     """Test DynamoDBSessionStore delete_session exception handling."""
 907 |     with patch('boto3.resource') as mock_resource:
 908 |         mock_table = MagicMock()
 909 |         mock_resource.return_value.Table.return_value = mock_table
 910 |         store = DynamoDBSessionStore('tbl')
 911 |         mock_table.delete_item.side_effect = Exception('fail')
 912 |         assert store.delete_session('sid') is False
 913 | 
 914 | 
 915 | # --- Resource tests ---
 916 | def test_resource_model_dump():
 917 |     """Test Resource model_dump method."""
 918 |     resource = Resource(uri='test://resource', name='Test Resource')
 919 |     data = resource.model_dump()
 920 |     assert data['uri'] == 'test://resource'
 921 |     assert data['name'] == 'Test Resource'
 922 |     assert 'description' not in data
 923 |     assert 'mimeType' not in data
 924 | 
 925 |     # Test with optional fields
 926 |     resource_full = Resource(
 927 |         uri='test://resource2',
 928 |         name='Test Resource 2',
 929 |         description='A test resource',
 930 |         mimeType='text/plain',
 931 |     )
 932 |     data_full = resource_full.model_dump()
 933 |     assert data_full['uri'] == 'test://resource2'
 934 |     assert data_full['name'] == 'Test Resource 2'
 935 |     assert data_full['description'] == 'A test resource'
 936 |     assert data_full['mimeType'] == 'text/plain'
 937 | 
 938 | 
 939 | def test_resource_content_model_dump():
 940 |     """Test ResourceContent model_dump method."""
 941 |     # Test with text content
 942 |     content = ResourceContent(uri='test://resource', mimeType='text/plain', text='Hello World')
 943 |     data = content.model_dump()
 944 |     assert data['uri'] == 'test://resource'
 945 |     assert data['mimeType'] == 'text/plain'
 946 |     assert data['text'] == 'Hello World'
 947 |     assert 'blob' not in data
 948 | 
 949 |     # Test with blob content
 950 |     content_blob = ResourceContent(uri='test://resource2', mimeType='image/png', blob='base64data')
 951 |     data_blob = content_blob.model_dump()
 952 |     assert data_blob['uri'] == 'test://resource2'
 953 |     assert data_blob['mimeType'] == 'image/png'
 954 |     assert data_blob['blob'] == 'base64data'
 955 |     assert 'text' not in data_blob
 956 | 
 957 |     # Test minimal content
 958 |     content_minimal = ResourceContent(uri='test://resource3')
 959 |     data_minimal = content_minimal.model_dump()
 960 |     assert data_minimal['uri'] == 'test://resource3'
 961 |     assert 'mimeType' not in data_minimal
 962 |     assert 'text' not in data_minimal
 963 |     assert 'blob' not in data_minimal
 964 | 
 965 | 
 966 | def test_static_resource():
 967 |     """Test StaticResource functionality."""
 968 |     resource = StaticResource(
 969 |         uri='static://test',
 970 |         name='Static Test',
 971 |         content='Hello Static World',
 972 |         description='A static resource',
 973 |         mime_type='text/plain',
 974 |     )
 975 | 
 976 |     # Test model_dump
 977 |     data = resource.model_dump()
 978 |     assert data['uri'] == 'static://test'
 979 |     assert data['name'] == 'Static Test'
 980 |     assert data['description'] == 'A static resource'
 981 |     assert data['mimeType'] == 'text/plain'
 982 | 
 983 |     # Test read_content
 984 |     content = resource.read_content()
 985 |     assert isinstance(content, ResourceContent)
 986 |     assert content.uri == 'static://test'
 987 |     assert content.mimeType == 'text/plain'
 988 |     assert content.text == 'Hello Static World'
 989 |     assert content.blob is None
 990 | 
 991 | 
 992 | def test_file_resource_text_file():
 993 |     """Test FileResource with text file."""
 994 |     with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
 995 |         f.write('Hello File World')
 996 |         temp_path = f.name
 997 | 
 998 |     try:
 999 |         resource = FileResource(
1000 |             uri='file://test.txt',
1001 |             path=temp_path,
1002 |             name='Test File',
1003 |             description='A test file',
1004 |             mime_type='text/plain',
1005 |         )
1006 | 
1007 |         # Test model_dump
1008 |         data = resource.model_dump()
1009 |         assert data['uri'] == 'file://test.txt'
1010 |         assert data['name'] == 'Test File'
1011 |         assert data['description'] == 'A test file'
1012 |         assert data['mimeType'] == 'text/plain'
1013 | 
1014 |         # Test read_content
1015 |         content = resource.read_content()
1016 |         assert isinstance(content, ResourceContent)
1017 |         assert content.uri == 'file://test.txt'
1018 |         assert content.mimeType == 'text/plain'
1019 |         assert content.text == 'Hello File World'
1020 |         assert content.blob is None
1021 |     finally:
1022 |         os.unlink(temp_path)
1023 | 
1024 | 
1025 | def test_file_resource_json_file():
1026 |     """Test FileResource with JSON file (auto MIME type detection)."""
1027 |     test_data = {'key': 'value', 'number': 42}
1028 |     with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:
1029 |         json.dump(test_data, f)
1030 |         temp_path = f.name
1031 | 
1032 |     try:
1033 |         resource = FileResource(uri='file://test.json', path=temp_path, name='Test JSON')
1034 | 
1035 |         # Test read_content with auto MIME type detection
1036 |         content = resource.read_content()
1037 |         assert content.mimeType == 'application/json'
1038 |         assert content.text is not None
1039 |         assert json.loads(content.text) == test_data
1040 |     finally:
1041 |         os.unlink(temp_path)
1042 | 
1043 | 
1044 | def test_file_resource_yaml_file():
1045 |     """Test FileResource with YAML file (auto MIME type detection)."""
1046 |     with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
1047 |         f.write('key: value\nnumber: 42\n')
1048 |         temp_path = f.name
1049 | 
1050 |     try:
1051 |         resource = FileResource(uri='file://test.yaml', path=temp_path, name='Test YAML')
1052 | 
1053 |         # Test read_content with auto MIME type detection
1054 |         content = resource.read_content()
1055 |         assert content.mimeType == 'application/yaml'
1056 |         assert content.text is not None
1057 |         assert 'key: value' in content.text
1058 |     finally:
1059 |         os.unlink(temp_path)
1060 | 
1061 | 
1062 | def test_file_resource_binary_file():
1063 |     """Test FileResource with binary file."""
1064 |     binary_data = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR'
1065 |     with tempfile.NamedTemporaryFile(mode='wb', suffix='.png', delete=False) as f:
1066 |         f.write(binary_data)
1067 |         temp_path = f.name
1068 | 
1069 |     try:
1070 |         resource = FileResource(
1071 |             uri='file://test.png', path=temp_path, name='Test PNG', mime_type='image/png'
1072 |         )
1073 | 
1074 |         # Test read_content with binary data
1075 |         content = resource.read_content()
1076 |         assert content.mimeType == 'image/png'
1077 |         assert content.text is None
1078 |         assert content.blob is not None
1079 | 
1080 |         # Verify blob data
1081 |         import base64
1082 | 
1083 |         decoded_data = base64.b64decode(content.blob)
1084 |         assert decoded_data == binary_data
1085 |     finally:
1086 |         os.unlink(temp_path)
1087 | 
1088 | 
1089 | def test_file_resource_unknown_extension():
1090 |     """Test FileResource with unknown file extension (covers default MIME type)."""
1091 |     with tempfile.NamedTemporaryFile(mode='w', suffix='.unknown', delete=False) as f:
1092 |         f.write('Hello Unknown Extension')
1093 |         temp_path = f.name
1094 | 
1095 |     try:
1096 |         resource = FileResource(
1097 |             uri='file://test.unknown', path=temp_path, name='Test Unknown Extension'
1098 |         )
1099 | 
1100 |         # Test read_content with unknown extension - should default to text/plain
1101 |         content = resource.read_content()
1102 |         assert content.mimeType == 'text/plain'  # This covers lines 217-218 in types.py
1103 |         assert content.text == 'Hello Unknown Extension'
1104 |     finally:
1105 |         os.unlink(temp_path)
1106 | 
1107 | 
1108 | def test_file_resource_not_found():
1109 |     """Test FileResource with non-existent file."""
1110 |     resource = FileResource(
1111 |         uri='file://nonexistent.txt', path='/nonexistent/path/file.txt', name='Non-existent File'
1112 |     )
1113 | 
1114 |     with pytest.raises(FileNotFoundError):
1115 |         resource.read_content()
1116 | 
1117 | 
1118 | def test_add_resource():
1119 |     """Test adding resources to handler."""
1120 |     handler = MCPLambdaHandler('test-server')
1121 | 
1122 |     # Add static resource
1123 |     static_resource = StaticResource(
1124 |         uri='static://test', name='Static Test', content='Hello World'
1125 |     )
1126 |     handler.add_resource(static_resource)
1127 | 
1128 |     assert 'static://test' in handler.resources
1129 |     assert handler.resources['static://test'] == static_resource
1130 | 
1131 | 
1132 | def test_resource_decorator():
1133 |     """Test resource decorator functionality."""
1134 |     handler = MCPLambdaHandler('test-server')
1135 | 
1136 |     @handler.resource(
1137 |         uri='decorated://test',
1138 |         name='Decorated Test',
1139 |         description='A decorated resource',
1140 |         mime_type='application/json',
1141 |     )
1142 |     def get_decorated_content():
1143 |         return json.dumps({'message': 'Hello Decorated World', 'timestamp': 1234567890})
1144 | 
1145 |     # Verify resource is registered
1146 |     assert 'decorated://test' in handler.resources
1147 |     resource = handler.resources['decorated://test']
1148 |     assert isinstance(resource, StaticResource)
1149 |     assert resource.uri == 'decorated://test'
1150 |     assert resource.name == 'Decorated Test'
1151 |     assert resource.description == 'A decorated resource'
1152 |     assert resource.mimeType == 'application/json'
1153 | 
1154 |     # Verify content function is stored
1155 |     assert hasattr(resource, '_content_func')
1156 |     assert resource._content_func == get_decorated_content
1157 | 
1158 |     # Test reading the decorated resource
1159 |     req = {
1160 |         'jsonrpc': '2.0',
1161 |         'id': 1,
1162 |         'method': 'resources/read',
1163 |         'params': {'uri': 'decorated://test'},
1164 |     }
1165 |     event = make_lambda_event(req)
1166 |     resp = handler.handle_request(event, None)
1167 | 
1168 |     assert resp['statusCode'] == 200
1169 |     body = json.loads(resp['body'])
1170 |     assert 'result' in body
1171 |     assert 'contents' in body['result']
1172 | 
1173 |     contents = body['result']['contents']
1174 |     assert len(contents) == 1
1175 | 
1176 |     content = contents[0]
1177 |     assert content['uri'] == 'decorated://test'
1178 |     assert content['mimeType'] == 'application/json'
1179 | 
1180 |     # Parse and verify JSON content
1181 |     content_text = content.get('text')
1182 |     assert content_text is not None
1183 |     parsed_content = json.loads(content_text)
1184 |     assert parsed_content['message'] == 'Hello Decorated World'
1185 |     assert parsed_content['timestamp'] == 1234567890
1186 | 
1187 | 
1188 | def test_resource_decorator_default_mime_type():
1189 |     """Test resource decorator with default MIME type."""
1190 |     handler = MCPLambdaHandler('test-server')
1191 | 
1192 |     @handler.resource(uri='test://default', name='Default Test')
1193 |     def get_content():
1194 |         return 'Hello World'
1195 | 
1196 |     resource = handler.resources['test://default']
1197 |     assert resource.mimeType == 'text/plain'
1198 | 
1199 | 
1200 | def test_handle_resources_list():
1201 |     """Test handling resources/list request."""
1202 |     handler = MCPLambdaHandler('test-server')
1203 | 
1204 |     # Add static resource
1205 |     static_resource = StaticResource(
1206 |         uri='static://test1', name='Static Test 1', content='Hello World 1'
1207 |     )
1208 |     handler.add_resource(static_resource)
1209 | 
1210 |     # Test resources/list request
1211 |     req = {'jsonrpc': '2.0', 'id': 1, 'method': 'resources/list'}
1212 |     event = make_lambda_event(req)
1213 |     resp = handler.handle_request(event, None)
1214 | 
1215 |     assert resp['statusCode'] == 200
1216 |     body = json.loads(resp['body'])
1217 |     assert 'result' in body
1218 |     assert 'resources' in body['result']
1219 | 
1220 |     resources = body['result']['resources']
1221 |     assert len(resources) == 1
1222 | 
1223 |     # Check resources are properly serialized
1224 |     uris = [r['uri'] for r in resources]
1225 |     assert 'static://test1' in uris
1226 | 
1227 |     # Find and verify specific resources
1228 |     static_res = next(r for r in resources if r['uri'] == 'static://test1')
1229 |     assert static_res['name'] == 'Static Test 1'
1230 | 
1231 | 
1232 | @pytest.mark.parametrize(
1233 |     'resource_type,expected_content',
1234 |     [('static', 'Hello Static World'), ('file', 'Hello File World')],
1235 | )
1236 | def test_handle_resources_read(resource_type, expected_content):
1237 |     """Test handling resources/read request for different resource types."""
1238 |     handler = MCPLambdaHandler('test-server')
1239 |     temp_path = None
1240 |     uri = ''
1241 |     expected_mime = 'text/plain'
1242 | 
1243 |     try:
1244 |         if resource_type == 'static':
1245 |             # Add static resource
1246 |             static_resource = StaticResource(
1247 |                 uri='static://test',
1248 |                 name='Static Test',
1249 |                 content='Hello Static World',
1250 |                 mime_type='text/plain',
1251 |             )
1252 |             handler.add_resource(static_resource)
1253 |             uri = 'static://test'
1254 |             expected_mime = 'text/plain'
1255 | 
1256 |         elif resource_type == 'file':
1257 |             # Create temporary file and add file resource
1258 |             with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
1259 |                 f.write('Hello File World')
1260 |                 temp_path = f.name
1261 | 
1262 |             file_resource = FileResource(
1263 |                 uri='file://test.txt', path=temp_path, name='Test File', mime_type='text/plain'
1264 |             )
1265 |             handler.add_resource(file_resource)
1266 |             uri = 'file://test.txt'
1267 |             expected_mime = 'text/plain'
1268 | 
1269 |         # Test resources/read request
1270 |         req = {
1271 |             'jsonrpc': '2.0',
1272 |             'id': 1,
1273 |             'method': 'resources/read',
1274 |             'params': {'uri': uri},
1275 |         }
1276 |         event = make_lambda_event(req)
1277 |         resp = handler.handle_request(event, None)
1278 | 
1279 |         assert resp['statusCode'] == 200
1280 |         body = json.loads(resp['body'])
1281 |         assert 'result' in body
1282 |         assert 'contents' in body['result']
1283 | 
1284 |         contents = body['result']['contents']
1285 |         assert len(contents) == 1
1286 | 
1287 |         content = contents[0]
1288 |         assert content['uri'] == uri
1289 |         assert content['mimeType'] == expected_mime
1290 |         assert content['text'] == expected_content
1291 | 
1292 |     finally:
1293 |         if temp_path:
1294 |             os.unlink(temp_path)
1295 | 
1296 | 
1297 | def test_handle_resources_read_missing_uri():
1298 |     """Test handling resources/read request with missing URI parameter."""
1299 |     handler = MCPLambdaHandler('test-server')
1300 | 
1301 |     # Test resources/read request without URI
1302 |     req = {'jsonrpc': '2.0', 'id': 1, 'method': 'resources/read', 'params': {}}
1303 |     event = make_lambda_event(req)
1304 |     resp = handler.handle_request(event, None)
1305 | 
1306 |     assert resp['statusCode'] == 400
1307 |     body = json.loads(resp['body'])
1308 |     assert 'error' in body
1309 |     assert body['error']['code'] == -32602
1310 |     assert 'Missing required parameter: uri' in body['error']['message']
1311 | 
1312 | 
1313 | def test_handle_resources_read_not_found():
1314 |     """Test handling resources/read request for non-existent resource."""
1315 |     handler = MCPLambdaHandler('test-server')
1316 | 
1317 |     # Test resources/read request for non-existent resource
1318 |     req = {
1319 |         'jsonrpc': '2.0',
1320 |         'id': 1,
1321 |         'method': 'resources/read',
1322 |         'params': {'uri': 'nonexistent://resource'},
1323 |     }
1324 |     event = make_lambda_event(req)
1325 |     resp = handler.handle_request(event, None)
1326 | 
1327 |     assert resp['statusCode'] == 404
1328 |     body = json.loads(resp['body'])
1329 |     assert 'error' in body
1330 |     assert body['error']['code'] == -32601
1331 |     assert 'Resource not found: nonexistent://resource' in body['error']['message']
1332 | 
1333 | 
1334 | def test_handle_resources_read_exception():
1335 |     """Test handling resources/read request when resource reading fails."""
1336 |     handler = MCPLambdaHandler('test-server')
1337 | 
1338 |     # Add file resource with non-existent file
1339 |     file_resource = FileResource(
1340 |         uri='file://nonexistent.txt', path='/nonexistent/path/file.txt', name='Non-existent File'
1341 |     )
1342 |     handler.add_resource(file_resource)
1343 | 
1344 |     # Test resources/read request
1345 |     req = {
1346 |         'jsonrpc': '2.0',
1347 |         'id': 1,
1348 |         'method': 'resources/read',
1349 |         'params': {'uri': 'file://nonexistent.txt'},
1350 |     }
1351 |     event = make_lambda_event(req)
1352 |     resp = handler.handle_request(event, None)
1353 | 
1354 |     assert resp['statusCode'] == 500
1355 |     body = json.loads(resp['body'])
1356 |     assert 'error' in body
1357 |     assert body['error']['code'] == -32603
1358 |     assert 'Error reading resource' in body['error']['message']
1359 |     assert 'errorContent' in body
1360 |     assert len(body['errorContent']) == 1
1361 | 
1362 | 
1363 | def test_initialize_includes_resources_capability():
1364 |     """Test that initialize response includes resources capability."""
1365 |     handler = MCPLambdaHandler('test-server')
1366 | 
1367 |     req = {'jsonrpc': '2.0', 'id': 1, 'method': 'initialize', 'params': {}}
1368 |     event = make_lambda_event(req)
1369 |     resp = handler.handle_request(event, None)
1370 | 
1371 |     assert resp['statusCode'] == 200
1372 |     body = json.loads(resp['body'])
1373 |     assert 'result' in body
1374 |     assert 'capabilities' in body['result']
1375 | 
1376 |     capabilities = body['result']['capabilities']
1377 |     assert 'resources' in capabilities
1378 |     assert capabilities['resources']['list'] is True
1379 |     assert capabilities['resources']['read'] is True
1380 | 
1381 | 
1382 | def test_tool_names_preserve_snake_case():
1383 |     """Test that tool names preserve snake_case format and don't get converted to camelCase."""
1384 |     handler = MCPLambdaHandler('test-server')
1385 | 
1386 |     @handler.tool()
1387 |     def search_products(query: str) -> str:
1388 |         """Search for products.
1389 | 
1390 |         Args:
1391 |             query: The search query
1392 |         """
1393 |         return f'Searching for: {query}'
1394 | 
1395 |     @handler.tool()
1396 |     def get_user_data() -> str:
1397 |         """Get user data."""
1398 |         return 'user data'
1399 | 
1400 |     @handler.tool()
1401 |     def calculate_total_price(items: int) -> float:
1402 |         """Calculate total price.
1403 | 
1404 |         Args:
1405 |             items: Number of items
1406 |         """
1407 |         return items * 10.0
1408 | 
1409 |     # Verify that tool names are preserved in snake_case
1410 |     assert 'search_products' in handler.tools
1411 |     assert 'get_user_data' in handler.tools
1412 |     assert 'calculate_total_price' in handler.tools
1413 | 
1414 |     # Verify that camelCase versions are NOT registered
1415 |     assert 'searchProducts' not in handler.tools
1416 |     assert 'getUserData' not in handler.tools
1417 |     assert 'calculateTotalPrice' not in handler.tools
1418 | 
1419 |     # Verify the tool schemas have the correct names
1420 |     assert handler.tools['search_products']['name'] == 'search_products'
1421 |     assert handler.tools['get_user_data']['name'] == 'get_user_data'
1422 |     assert handler.tools['calculate_total_price']['name'] == 'calculate_total_price'
1423 | 
1424 |     # Test that tools can be called with their snake_case names
1425 |     req = {
1426 |         'jsonrpc': '2.0',
1427 |         'id': 1,
1428 |         'method': 'tools/call',
1429 |         'params': {'name': 'search_products', 'arguments': {'query': 'laptop'}},
1430 |     }
1431 |     event = make_lambda_event(req)
1432 |     resp = handler.handle_request(event, None)
1433 | 
1434 |     assert resp['statusCode'] == 200
1435 |     body = json.loads(resp['body'])
1436 |     assert 'result' in body
1437 |     assert body['result']['content'][0]['text'] == 'Searching for: laptop'
1438 | 
1439 | 
1440 | def test_multiple_resources_same_handler():
1441 |     """Test multiple resources in the same handler."""
1442 |     handler = MCPLambdaHandler('test-server')
1443 | 
1444 |     # Add static resource
1445 |     static_resource = StaticResource(
1446 |         uri='static://test1', name='Static Test 1', content='Static Content'
1447 |     )
1448 |     handler.add_resource(static_resource)
1449 | 
1450 |     # Create temporary file for file resource
1451 |     with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
1452 |         f.write('File Content')
1453 |         temp_path = f.name
1454 | 
1455 |     try:
1456 |         # Add file resource
1457 |         file_resource = FileResource(uri='file://test3', path=temp_path, name='File Test 3')
1458 |         handler.add_resource(file_resource)
1459 | 
1460 |         # Test that all resources are listed
1461 |         req = {'jsonrpc': '2.0', 'id': 1, 'method': 'resources/list'}
1462 |         event = make_lambda_event(req)
1463 |         resp = handler.handle_request(event, None)
1464 | 
1465 |         body = json.loads(resp['body'])
1466 |         resources = body['result']['resources']
1467 |         assert len(resources) == 2
1468 | 
1469 |         uris = [r['uri'] for r in resources]
1470 |         assert 'static://test1' in uris
1471 |         assert 'file://test3' in uris
1472 | 
1473 |         # Test reading each resource
1474 |         for uri in uris:
1475 |             req = {'jsonrpc': '2.0', 'id': 1, 'method': 'resources/read', 'params': {'uri': uri}}
1476 |             event = make_lambda_event(req)
1477 |             resp = handler.handle_request(event, None)
1478 | 
1479 |             assert resp['statusCode'] == 200
1480 |             body = json.loads(resp['body'])
1481 |             content = body['result']['contents'][0]
1482 |             assert content['uri'] == uri
1483 |             assert 'Content' in content['text']
1484 |     finally:
1485 |         os.unlink(temp_path)
1486 | 
```
Page 564/612FirstPrevNextLast