AWS Resource MCP
You can inspect AWS account resources and costs read-only, with consent-gated metered operations, plus diagnostics and Free Tier review.
Run health checks (optional guarded STS call)
List AWS resources via adapters (Lambda, S3, EC2, RDS, etc.) with filters, regions, and consent for billable enumerations
Analyze resource activity using CloudTrail and service fields, distinguishing functional usage from administrative events
Diagnose AWS coverage (permissions, regions, Resource Explorer, activity sources) without inventorying
Assess cost risk based on resource indicators and optional activity
Review AWS Free Tier usage and account plan state (free APIs)
Query Cost Explorer with exact, single-use ephemeral consent after preparing a request
All operations are read-only, respect least-privilege IAM, and never modify resources
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AWS Resource MCPlist my Lambda functions"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AWS Resource MCP
Local MCP server, developed in Python, for querying real resources from an AWS account in read-only mode.
Status
Phase 9 is implemented. The server combines uniform inventory, conservative activity analysis, explicit diagnostics, economic analysis, and least-privilege IAM policies generated from the actual operations log.
Related MCP server: aws-mcp-server
Planned scope
Local MCP transport via
stdio.Primary region:
eu-west-1.AWS queries exclusively read-only and least-privilege.
Available tools:
health_check(),listar_recursos_aws(),analizar_actividad_recursos(),diagnosticar_cobertura_aws(),analizar_riesgo_costes(),revisar_free_tier(), andconsultar_costes_aws().Cost Explorer is blocked until ephemeral consent is received for an exact request.
No deployment on AWS or CD.
Reliability
Phase 10 incorporates local integration, contract, security, performance, and MCP protocol tests. The inventory also applies AWS_MCP_MAX_REQUESTS_PER_TOOL (250 by default) before each SDK call; when exhausted, it preserves the result and returns partial_request_budget_exhausted.
Continuous integration runs formatting, linting, compilation, deterministic IAM validation, and local tests on every pull request. It does not configure AWS credentials or run AWS operations.
Using with Codex
Codex is the primary client. Use the package entry point uv run aws-resource-mcp over stdio, configure any AWS profile outside the repository, and begin with natural-language questions such as "What resources do I have in eu-west-1?". When a response is partial_pending_consent, Codex must explain the exact operation and wait for explicit approval; it never creates persistent consent. See Codex integration and the demo.
Release v0.1.0
The first version is ready for review: it includes the read-only guard, ephemeral consent, Codex integration, and CI. See the release checklist to verify it locally and run the safe demo.
Development
The project is managed with uv and Python 3.12 or later.
Install dependencies
uv syncRun the server
uv run aws-resource-mcpFor diagnostics it can also be run as a module:
uv run python -m aws_resource_mcp.serverThe server uses stdio: it expects an MCP client to exchange messages over standard input and output. It can be opened with MCP Inspector using the tools included in the SDK:
uv run mcp dev src/aws_resource_mcp/server.pyRun the tests
uv run pytestGenerate and validate IAM policies
uv run aws-resource-mcp-generate-iam
uv run aws-resource-mcp-generate-iam --checkGeneration is local, deterministic, and uses no credentials. The project does not create or modify roles or policies in AWS. The policies separate free operations, reads that require consent, and the combined maximum; IAM permission never replaces application consent.
Run the AWS inventory
Before the real diagnostic, check which identity the local configuration will resolve:
aws sts get-caller-identityThen run the inventory in the default region eu-west-1:
uv run python -m aws_resource_mcp.aws.inventoryThe region and shared profile are optional:
uv run python -m aws_resource_mcp.aws.inventory --region eu-central-1 --profile exampleNo keys are stored in the project. Boto3 uses its standard credential resolution chain; if AWS_PROFILE or --profile is specified, it only selects a profile that must already exist outside the repository.
MCP Tools
health_check
health_check(check_aws=True) separates local health from AWS accessibility. Without arguments it makes at most one protected STS call; with check_aws=false it uses no network. It returns version, transport, tools, and registered adapters, region, cost policy, and zero billable operations. Its states are:
ok: server and configuration valid; STS responded when requested.degraded: the server works, but credentials are missing or STS is not accessible.error: the secure configuration or internal registries cannot be initialized.
Identity is anonymized: only the general principal type and, when present, a masked account are kept. It does not run inventory, Resource Explorer, adapters, CloudTrail, or CloudWatch.
listar_recursos_aws
Queries the AWS inventory available to the local credentials without modifying resources. Parameters:
region: limits the search to one region; without a value it uses all available coverage.services: filters by services such aslambda,s3,ec2, orrds.include_account_id: allows omitting the account ID from the response to make it easier to anonymize.resource_types: filters by dynamic types such asec2:instance.query: searches by text or name.all_regions: uses enabled regions whenregionis not specified.include_details: includes service-specific metadata insidedetails.include_cost_indicators: includes potential cost signals without asserting actual spend.confirm_potentially_billable_operations: legacy parameter that no longer grants permissions.include_activity_summary: adds a brief summary using only fields already obtained; it does not query CloudTrail or CloudWatch.consent_request_id,consent_action, andapproved_services: resume or cancel an ephemeral, scoped request.timeout_seconds: configurable budget between 1 and 120 seconds.
Example of arguments sent by an MCP client:
{
"region": "eu-west-1",
"services": ["lambda", "s3"],
"include_account_id": false,
"all_regions": true
}The first call returns the resources obtained through allowed operations. If completing S3, SQS, or SNS requires billable operations, it returns partial_pending_consent, pending_operations, and a request that expires in five minutes. It does not run those operations until an explicit second call:
{
"consent_request_id": "<id devuelto por la primera llamada>",
"consent_action": "approve",
"approved_services": ["s3"]
}Approval is single-use, tied to the original identity and scope, and limits operations, regions, and requests. Discovery and enrichment are authorized separately; an additional page requires a new request. consent_action: "cancel" does not run the AWS inventory.
The states distinguish complete_for_requested_scope, partial_pending_consent, partial_timeout, partial_permission_denied, partial_unavailable, consent_cancelled, and error. An empty list only means the service was empty when queried.
resources, all_resources, and resources_by_service represent the same deduplicated inventory. Each resource contains id, arn, name, service, resource_type, region, account_id, state, created_at, sources, details, cost_indicators, and activity. The tool does not calculate costs, does not query Free Tier, and does not perform write operations.
analizar_actividad_recursos
Analyzes the last known signal using the same log and model for all resources. It accepts filters by services, regions, and resource_ids, plus inactive_days, lookback_days, include_administrative_events, and configurable limits. The CloudTrail history is limited to 90 days and is queried per region, not once per resource.
The response separates last_functional_usage_at, last_administrative_activity_at, last_configuration_change_at, and last_state_change_at. best_known_activity_at always also indicates the signal type. An active state, a Describe* call, or a modification date is not presented as functional usage.
Per-resource states are active, inactive_candidate, unknown, not_supported, or error. An inactive candidate is only an item for review: it requires sufficient age, a relevant source queried, and no recent contradictory evidence. Missing permissions, insufficient sources, or ambiguous relationships produce unknown, not a false certainty of inactivity.
CloudWatch could provide functional metrics, but GetMetricData, GetMetricStatistics, and ListMetrics are registered as potentially billable and blocked. include_paid_sources=true only requests the structured explanation; it does not constitute consent and never runs those operations in this phase.
diagnosticar_cobertura_aws
Explains what the MCP can actually query without enumerating resources. It accepts services and regions filters and allows omitting the permissions, activity, or cost policy sections.
It checks STS, enabled regions, existing Resource Explorer indexes, adapter registration and capabilities, free activity sources, and blocked operations. Checks are limited to five regions per run, one CloudTrail sample, and no CloudWatch calls.
Coverage states distinguish available, partial, unavailable, not_configured, permission_denied, blocked_by_cost_policy, not_supported, not_checked, and error. An operation declared as allowed by the policy is not presented as proven IAM permission: the diagnostic does not run service inventories to test it.
Example:
{
"services": ["ec2", "rds"],
"regions": ["eu-west-1"],
"include_activity_sources": true
}Limitations indicate impact, whether the MCP can continue, whether permissions are missing, whether resolving them would require writes, and whether cost could exist. The diagnostic never performs the suggested action.
analizar_riesgo_costes
Prioritizes resources using inventory indicators and, optionally, the common activity pipeline. It returns none_detected, low, medium, high, critical, or unknown, an explainable score, and non-executable recommendations. A signal does not confirm spend, and none_detected does not mean zero cost.
include_free_tier=true adds official Free Tier data. include_actual_cost=true only prepares a Cost Explorer consent: it does not perform the query.
revisar_free_tier
Queries GetFreeTierUsage and GetAccountPlanState, operations AWS documents as free. It separates monthly limits, forecast, plan, and credits. It may return partial or unknown information due to permissions, update lag, an exhausted offer, or eligibility differences. It does not claim that a specific resource is free.
consultar_costes_aws
Prepares an aggregated GetCostAndUsage query for an exact period and filters. The first call runs zero AWS operations and returns an ephemeral request with the published price of 0.01 USD per request on the primary view. A second call with consent_action="approve" runs at most one page; each additional page requires new consent. cancel does not call AWS.
Granularity can be MONTHLY or DAILY; end_date is exclusive. Forecast, per-resource detail, linked accounts, and custom billing views are not implemented in this phase.
AWS Inventory
Boto3 is the official AWS SDK for Python. The inventory layer uses:
STS
GetCallerIdentityto identify the account and effective identity.EC2
DescribeRegionsto discover only enabled regions.Resource Explorer to dynamically discover resources and supported types through existing indexes and views.
A common adapter registry for Lambda, S3, EC2/EBS/VPC, RDS/Aurora, DynamoDB, ECS/Fargate, API Gateway, CloudFormation, SQS, SNS, IAM, CloudFront, and Route 53.
CloudTrail
LookupEventsfor the free regional management event history of the last 90 days.
Lambda and S3 were the first implemented services, but they no longer keep special architectural paths. All adapters declare metadata, Boto3 operations, scope, types, details, and indicators through the same contract. Service-specific details live only inside details.
Results are deduplicated by ARN or, if missing, by type, region, and identifier/name. An aggregator index is preferred; with local indexes, results are combined and coverage is partial. If Resource Explorer is unavailable, all selected adapters that support discovery are run.
The absence of credentials or the inability to identify the account is a global error for inventory, but only a degraded state for local health. The diagnosis preserves its local checks and safely omits AWS-dependent ones.
All Boto3 calls first pass through a central log. Unregistered, write, or unknown-cost operations are blocked. The free-only mode remains active throughout the process. S3, SQS, and SNS can count requests: their enumerations are presented as pending, and only an exact ephemeral grant allows them to be executed. The guard counts unique operations and real requests separately.
Examples for an MCP client: "What resources are in my account?", "List EC2 instances in eu-west-1", "Search for resources named web" or "Show me deployed RDS types". Resource Explorer offers broad, not universal, coverage.
Documentation
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA minimal, production-ready MCP server running on AWS Lambda with Streamable HTTP transport, enabling deployment of custom tools behind API Gateway.1MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that provides tools for creating and managing AWS resources using boto3, including EC2, S3, VPC, subnets, security groups, and RDS.MIT
- FlicenseNot gradedqualityCmaintenanceA stateless Python MCP server packaged as a custom AWS Lambda container image, exposing basic tools like hello, add, and current_time through an API Gateway HTTP API.
- AlicenseNot gradedqualityCmaintenanceThis MCP server provides tools for inspecting AWS cloud infrastructure, including listing S3 buckets, EC2 instances, and fetching CloudWatch logs using your local AWS credentials.4MIT
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Hosted Amazon Seller and Vendor MCP server for Claude, ChatGPT, Cursor, Codex, Gemini, Copilot.
An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/herrerogusano/aws-resource-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server