Skip to main content
Glama
AWS Health MCP Server

AWS Health MCP Server

Official
by aws-samples

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

Related MCP server: AWS Pricing Calculator MCP Server

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

Available Tools

18 tools
check_health_accessA
Read-onlyIdempotent

Diagnose whether this server can actually reach the AWS Health API.

Reports the calling identity, whether the account's support plan allows Health API access, and whether organization view is enabled. Run this first when other tools return access errors.

Example prompts:

  • "Why can't you see my AWS health events?"

  • "Is AWS Health set up correctly?"

  • "Do I have organization-wide health access?"

Inputs: no named parameters. Returns: result

count_affected_entitiesA
Read-onlyIdempotent

Count the resources affected by events, without listing them.

Use this before the entity-listing tools when an event could touch thousands of resources.

Args: event_arns: One or more event ARNs.

Example prompts:

  • "How many instances does this retirement event affect?"

  • "What's the blast radius of these events?"

Inputs: event_arns (required). Returns: result

find_events_for_resourcesA
Read-onlyIdempotent

Find which health events affect specific resources of yours.

Answers "is my instance / cluster / database affected by anything?".

Matching goes through DescribeAffectedEntities, where entity values match exactly. The equivalent filter on DescribeEvents cannot be used for this: it also returns events that have no entities at all, so a resource ID that exists nowhere still comes back with matches.

Args: entity_values: Resource identifiers, e.g. ['i-1234567890abcdef0']. include_closed: Also search resolved events, not just open/upcoming.

Example prompts:

  • "Is i-1234567890abcdef0 affected by any AWS issue?"

  • "Do any current events touch my cluster my-prod-cluster?"

Inputs: entity_values (required), include_closed. Returns: result

get_affected_entitiesA
Read-onlyIdempotent

Get affected entities for all open AWS health events.

Shows resources impacted by active health events, grouped by event and status.

Example prompts:

  • "What resources are affected by current AWS issues?"

  • "Show me all impacted AWS entities"

  • "Which AWS resources are experiencing problems?"

Inputs: no named parameters. Returns: result

get_completed_eventsA
Read-onlyIdempotent

Get completed/closed health events.

Args: service: Optional. The AWS service name to filter by. Case insensitive. regions: Optional. Restrict to these AWS regions, e.g. ['us-west-2'].

Example prompts:

  • "Show me recently resolved AWS issues"

  • "What EC2 problems were fixed in us-east-1?"

  • "Get history of resolved incidents"

Inputs: regions, service. Returns: result

get_event_detailsA
Read-onlyIdempotent

Get the full detail of specific AWS health events by ARN.

Use this to drill into events surfaced by the listing tools, instead of pulling every description for every event.

Args: event_arns: One or more event ARNs, as returned by the listing tools.

Example prompts:

  • "Give me the full details of that EC2 retirement event"

  • "What exactly does event arn:aws:health:... say?"

Inputs: event_arns (required). Returns: result

get_org_account_eventsA
Read-onlyIdempotent

Get health events for a specific AWS account in your organization.

Args: account_id: The 12-digit AWS account ID. regions: Optional. Restrict to these AWS regions, e.g. ['us-west-2'].

Example prompts:

  • "What health events are affecting account 123456789012?"

  • "Show me all issues in my account"

Inputs: account_id (required), regions. Returns: result

get_org_affected_entitiesA
Read-onlyIdempotent

Get affected entities for AWS health events across your organization.

Args: account_id: Optional. The AWS account ID to filter events for. event_arn: Optional. The ARN of a specific event to get details for.

Example prompts:

  • "What resources are affected by current AWS issues across my organization?"

  • "Show me impacted entities in account 123456789012"

Inputs: event_arn, account_id. Returns: result

get_org_health_eventsA
Read-onlyIdempotent

Get health events across your AWS Organization.

If no arguments are provided, returns all active org health events.

Args: service: Optional. The AWS service name to filter by. Case insensitive. account_id: Optional. The AWS account ID to filter events for. status: Optional. 'active' (default) or 'closed'. regions: Optional. Restrict to these AWS regions, e.g. ['us-west-2'].

Example prompts:

  • "Show me org-wide AWS health events"

  • "What issues affect account 123456789012?"

  • "Any org-wide events in ap-southeast-2?"

Inputs: status, regions, service, account_id. Returns: result

get_org_scheduled_changesA
Read-onlyIdempotent

Get scheduled changes/maintenance events across your AWS Organization.

Returns upcoming maintenance affecting accounts in your organization.

Example prompts:

  • "What maintenance is planned across my organization?"

  • "Show me upcoming AWS changes affecting my accounts"

Inputs: no named parameters. Returns: result

get_org_service_eventsA
Read-onlyIdempotent

Get health events for a specific AWS service across your organization.

Args: service: The AWS service name (e.g., 'EC2', 'RDS', 'LAMBDA'). Case insensitive. regions: Optional. Restrict to these AWS regions, e.g. ['us-west-2'].

Example prompts:

  • "What's happening with EC2 across my organization?"

  • "Show me all RDS issues affecting my AWS accounts"

Inputs: service (required), regions. Returns: result

get_org_service_healthA
Read-onlyIdempotent

Get current AWS service health events across your organization.

Provides a comprehensive overview of active health events across all accounts in your AWS Organization.

Example prompts:

  • "Show me all current AWS service health issues across my organization"

  • "Are there any active AWS service disruptions affecting multiple accounts?"

Inputs: no named parameters. Returns: result

get_scheduled_changesA
Read-onlyIdempotent

Get all scheduled changes/maintenance events across AWS services.

Returns upcoming maintenance windows, planned updates, and infrastructure improvements.

Args: regions: Optional. Restrict to these AWS regions, e.g. ['us-west-2'].

Example prompts:

  • "What maintenance is planned for AWS services?"

  • "Any upcoming maintenance in eu-west-1?"

  • "When is the next AWS maintenance?"

Inputs: regions. Returns: result

get_service_eventsA
Read-onlyIdempotent

Get health events for a specific AWS service.

Args: service: The AWS service name (e.g., 'EC2', 'RDS', 'LAMBDA'). Case insensitive. Use list_event_types to discover the codes AWS Health uses. regions: Optional. Restrict to these AWS regions, e.g. ['us-west-2'].

Example prompts:

  • "What's happening with EC2 right now?"

  • "Any RDS issues in eu-west-1?"

  • "Are there any problems with S3?"

Inputs: service (required), regions. Returns: result

get_service_healthA
Read-onlyIdempotent

Get current AWS service health events.

Returns active and upcoming AWS health events with descriptions and timelines. Consider summarize_health_events first: this returns full descriptions and can be very large on a busy account.

Args: regions: Optional. Restrict to these AWS regions, e.g. ['us-west-2'].

Example prompts:

  • "Show me all current AWS service health issues"

  • "What's broken in us-west-2?"

  • "Are there any active AWS service disruptions?"

Inputs: regions. Returns: result

list_affected_accountsB
Read-onlyIdempotent

List the organization accounts affected by a single health event.

Args: event_arn: The ARN of an organization health event.

Example prompts:

  • "Which accounts does this event affect?"

  • "How wide is the blast radius of this event across my organization?"

Inputs: event_arn (required). Returns: result

list_event_typesA
Read-onlyIdempotent

List the event types AWS Health can report, optionally for one service.

Also the way to discover valid service names: the service codes AWS Health uses do not always match the marketing name (Step Functions is 'STATES', EventBridge is 'EVENTS').

Args: service: Optional. Restrict to one AWS service. Case insensitive. category: Optional. One of 'issue', 'accountNotification', 'scheduledChange', 'investigation'.

Example prompts:

  • "What service names does AWS Health use?"

  • "What kinds of EC2 events can AWS Health report?"

Inputs: service, category. Returns: result

summarize_health_eventsA
Read-onlyIdempotent

Count active AWS health events without returning their descriptions.

A cheap overview for "is anything wrong?" questions. Listing tools return full descriptions and can run to tens of thousands of tokens; this returns counts only.

Args: group_by: One of 'service', 'status', 'category' or 'region'. include_closed: Include resolved events as well as open/upcoming ones.

Example prompts:

  • "How many AWS health events are open, by service?"

  • "Give me a summary of current AWS issues"

  • "Which regions have active events?"

Inputs: group_by, include_closed. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 18 tools

    Disambiguation3/5

    There are systematic org/non-org pairs (get_service_health vs get_org_service_health, get_affected_entities vs get_org_affected_entities, etc.) which are nameable-apart, but the fuzzy boundaries between get_service_health and get_service_events, and between the several overlapping event-listing tools, create real misselection risk.

    Naming Consistency5/5

    All names follow a consistent snake_case verb_noun pattern (get_, list_, count_, summarize_, find_, check_) with predictable prefixes for org-scoped variants.

    Tool Count4/5

    18 tools is at the upper end but justified by the read-only domain spanning single-account, org-wide, entity, and summary operations. It is slightly heavy but each tool earns a place.

    Completeness4/5

    The surface covers listing, drilling into details, affected entities, counts, summaries, event-type discovery, org-wide views, and an access diagnostic — strong lifecycle coverage for a read-only API. Minor gaps around pagination/continuation handling keep it from a 5.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      MCP server for running infrastructure health checks with TIBET provenance. It enables users to define, execute, and audit process health checks with dependency chaining and drift tracking.
      6
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      This MCP server provides tools for inspecting AWS cloud infrastructure, including listing S3 buckets, EC2 instances, and fetching CloudWatch logs using your local AWS credentials.
      9 npm
      MIT
    • F
      license
      A
      quality
      C
      maintenance
      A local MCP server for read-only querying of AWS resources (Lambda, S3) via Boto3, currently exposing a health check tool with planned tools for listing resources and checking free tier.
      7
      -