Skip to main content

AWS Health MCP Server

Disclaimer: This AWS content is provided subject to the terms of the AWS Customer Agreement available at https://aws.amazon.com/agreement or other written agreement between the Customer and Amazon Web Services. This is sample code for demonstration purposes only. It is not intended for production use. You should work with your security and legal teams to meet your organizational security, regulatory, and compliance requirements before any deployment.

MCP server that exposes AWS Health API as tools. Works with Claude Desktop, Kiro or any MCP-compatible client.

📖 Blog: Building an AWS Health MCP Server for Agentic Operations

Prerequisites

  • Python 3.10+
  • AWS credentials configured (aws configure or environment variables)
  • AWS Business or Enterprise Support plan (required for Health API)
  • For org-level tools: AWS Organizations with Health service access enabled

Setup

Add this to your MCP config file:

  • Claude Desktop: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Kiro: ~/.kiro/settings/mcp.json
  • Amazon Q CLI: ~/.aws/amazonq/mcp.json
{
  "mcpServers": {
    "aws-health": {
      "command": "uvx",
      "args": ["aws-health-mcp-server"],
      "env": {
        "AWS_PROFILE": "default"
      }
    }
  }
}

Using pip

pip install aws-health-mcp-server

From a local clone

{
  "mcpServers": {
    "aws-health": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/aws-health-mcp-server", "aws-health-mcp-server"],
      "env": {
        "AWS_PROFILE": "default"
      }
    }
  }
}

That's it. uv handles the venv and dependencies automatically.

Tools

All tools are read-only and annotated as such. The Health API's two mutating operations (EnableHealthServiceAccessForOrganization and DisableHealthServiceAccessForOrganization) are deliberately not exposed.

Start here

Tool Description
summarize_health_events(group_by?, include_closed?) Event counts by service, status, category or region. Cheap overview — the listing tools include full descriptions and can be very large.
get_event_details(event_arns) Full detail for specific events, by ARN
find_events_for_resources(entity_values, include_closed?) Which events affect your resources, e.g. i-1234567890abcdef0
check_health_access() Diagnose credentials, support plan and org access

Account-Level

Tool Description
get_service_health(regions?) All active health events
get_affected_entities Resources impacted by open events
get_service_events(service, regions?) Events for a specific service (e.g., EC2, RDS)
get_completed_events(service?, regions?) Recently resolved events
get_scheduled_changes(regions?) Upcoming maintenance
count_affected_entities(event_arns) How many resources an event hits, without listing them

Organization-Level

Tool Description
get_org_health_events(service?, account_id?, status?, regions?) Events across all accounts
get_org_service_health Active events org-wide
get_org_affected_entities(account_id?, event_arn?) Impacted resources across accounts
get_org_service_events(service, regions?) Service-specific events org-wide
get_org_account_events(account_id, regions?) Events for a specific account
get_org_scheduled_changes Org-wide scheduled maintenance
list_affected_accounts(event_arn) Accounts affected by one event

Discovery

Tool Description
list_event_types(service?, category?) Event types AWS Health reports, and the service codes it uses

Example Prompts

  • "Are there any active AWS health events?"
  • "Give me a summary of current AWS issues by service"
  • "What's happening with EC2 right now?"
  • "What's broken in us-west-2?"
  • "Is instance i-1234567890abcdef0 affected by anything?"
  • "Show me scheduled maintenance across my organization"
  • "What resources are affected by current issues in account 123456789012?"

Service names

Pass service names however you like — EC2, ec2, Step Functions, api gateway all resolve. The valid set comes from the Health API itself, so every service AWS covers is reachable, and names are mapped to the codes AWS actually uses (Step Functions is STATES, EventBridge is EVENTS). Use list_event_types to browse them. Common names resolve in about a second; an unrecognised name (a typo, say) triggers a one-time ~8 second load of the full service list, which is then cached.

Environment Variables

Variable Default Description
AWS_PROFILE none AWS credentials profile
LOG_LEVEL INFO Logging level (DEBUG, INFO, WARNING)
HEALTH_API_TIMEOUT 30 API read timeout in seconds
HEALTH_API_MAX_CONCURRENCY 5 Max concurrent Health API calls
ENABLE_CACHE true Cache event descriptions and affected accounts
CACHE_TTL 300 Cache lifetime in seconds
SERVICE_LIST_TTL 86400 Cache lifetime for the service catalog

The region is not configurable; see Regions and availability.

Regions and availability

The AWS Health API runs as an active-passive pair: us-east-1 (active) and us-east-2 (passive), behind a single global endpoint, global.health.amazonaws.com, whose DNS (10 second TTL) points at whichever region is currently active.

  • Which endpoint this server uses. The client is created for us-east-1, which boto3/botocore resolve to https://global.health.amazonaws.com. This holds for every botocore release this package supports (checked on 1.34.162 and 1.43.89). The server therefore follows AWS's DNS failover; there is no region setting because the global endpoint chooses for you.
  • No client-side failover. The server does not detect a failover itself or retry against us-east-2. Recovery relies on DNS re-resolution and botocore's retries (3 attempts, adaptive), so requests made during the switch can fail and a long-running server may need a call or two to pick up the new region. Restart the server if calls keep failing after AWS reports the Health API has failed over.
  • Passive data can lag. AWS notes that only the active endpoint has the latest data; the passive endpoint is eventually consistent. During an incident, treat results as potentially slightly behind.
  • Not verified. Requests to the global endpoint are signed for us-east-1 (botocore's rule). AWS documents the signing region as that of the active endpoint, so it is not confirmed that requests signed for us-east-1 are accepted after a failover to us-east-2. A real failover could not be tested. Calling health.us-east-2.amazonaws.com directly requires signing for us-east-2; a us-east-1 signature is rejected with InvalidSignatureException.

Pinning the server to us-east-2 is not supported. Overriding the endpoint alone (for example with AWS_ENDPOINT_URL_HEALTH) still signs requests for us-east-1 and is rejected with InvalidSignatureException.

Errors and partial results

Failures are reported, never turned into an empty answer:

  • Tool errors (no Health access, API rejection, throttling that stops a request) are returned with the MCP isError flag set, so clients and agents can tell a failure from a result.
  • Partial results: when one lookup inside a larger answer fails (for example the affected accounts of a single event), the rest is still returned with a "Warning: partial results" footer naming what is missing.
  • Searches: find_events_for_resources returns an error rather than "no event affects it" if some events could not be checked.

Troubleshooting

"SubscriptionRequiredException" — You need AWS Business or Enterprise Support.

"AccessDeniedException" — Your IAM user/role needs health:Describe* permissions.

Org tools return access error — Enable Health service access from your management account:

aws health enable-health-service-access-for-organization

Server not starting — Check the MCP client logs. Common issues:

  • Wrong Python path in config (use the full .venv/bin/python path)
  • Missing dependencies (run pip install -e . in the venv)

Development

git clone https://github.com/aws-samples/sample-health-mcp-server.git
cd aws-health-mcp-server
uv sync --extra dev
uv run pytest tests/ -v

License

MIT-0

Metadata

Release files for aws-health-mcp-server 2.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aws-health-mcp-server 2.1.1
File Size Uploaded Provenance Actions
aws_health_mcp_server-2.1.1.tar.gz 37.4 kB Without provenance Details for aws_health_mcp_server-2.1.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for aws-health-mcp-server 2.1.1
File Interpreter ABI Platform Actions
aws_health_mcp_server-2.1.1-py3-none-any.whl Python 3 none any Details for aws_health_mcp_server-2.1.1-py3-none-any.whl

Total release size: 64.7 kB

Release files / aws_health_mcp_server-2.1.1.tar.gz

Download URL aws_health_mcp_server-2.1.1.tar.gz
Size 37.4 kB
Tags Source
SHA-256 checksum
How to use checksums
a522d1211106b506a8784025415b95cf316dac32ac84aad2808782c422eaaa26
BLAKE2b-256 checksum
How to use checksums
5deb5660b5b9d7c0f7e581557389425aeb84c9c2da9d3d9aff3300dca793045b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.5

Release files / aws_health_mcp_server-2.1.1-py3-none-any.whl

Download URL aws_health_mcp_server-2.1.1-py3-none-any.whl
Size 27.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
64a2f2dab9e0921de3ac6b7226c0d58b0546aebecff7e93fb929ce147d10c65f
BLAKE2b-256 checksum
How to use checksums
6d7ab12c02c707f02bbe35666643cfc0dfa97b91094c20598319a298bec3acec
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.5

Security for aws-health-mcp-server 2.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page