assume_role
Assume an IAM role in another AWS account for cross-account access
One AWS server instead of fifteen — natural-language queries, cross-service resource discovery, dependency mapping, impact analysis, cost work, and a read-only default.
LABSCO SUMMARY
It starts in READ_ONLY, so the careless configuration is the harmless one, and the denylist stays in force even at the loosest setting — you cannot turn off logging or schedule a KMS key for deletion through it at all. What justifies a unified server rather than a per-service one is discover_resources, map_dependencies and impact_analysis: those questions cross service boundaries by definition, and no single-service server can answer them. Point it at LocalStack while you are learning what it does.
A FastMCP server for AWS that unifies what is normally split across many service-specific servers into 30 tools. Rather than one tool per API call, it takes a natural-language query, validates it against botocore's own service models, and executes it — which is what makes cross-service questions like "what depends on this security group" answerable at all.
aws_query, validate_operation, aws_executeREAD_ONLY by default allowing only list, describe and get; STANDARD adding writes with confirmation; UNRESTRICTED allowing everything except a denylist of 70+ operations that are always blocked, including cloudtrail.delete_trail, kms.schedule_key_deletion and organizations.leave_organization — set_safety_modelist_profiles, select_profile, get_account_infodiscover_resourcesmap_dependencies, impact_analysisinvestigate_incidentfind_idle_resources, get_rightsizing_recommendations, get_cost_breakdown, project_costssearch_docs, get_aws_knowledge, get_best_practices, get_service_limitslist_environments, switch_environment, get_environment_info, check_localstack, compare_environmentsassume_role, list_accounts, switch_accountprod-db defined and listed — get_context, set_alias, list_aliasesAWS credentials already configured on the machine — ~/.aws/credentials or ~/.aws/config; for SSO profiles run aws sso login first. AWS_PROFILE selects the profile and AWS_DEFAULT_REGION the region. Python 3.11+. The published package is aws-sage-mcp (version 1.0.4); the repository installs as aws-sage (version 1.0.0) with pip install . and runs as python -m aws_sage.server. A Docker image mounts ~/.aws read-only for container isolation. AWS_SAGE_SAFETY_MODE defaults to read_only, and AWS_SAGE_LOCALSTACK_ENABLED, AWS_SAGE_LOCALSTACK_HOST and AWS_SAGE_LOCALSTACK_PORT point it at LocalStack.
One command plus credentials — pip install git+https://github.com/arunsanna/aws-sage.git, then supply credentials
USE CASES
Ask for the impact of removing the security group or IAM role, and read what depends on it rather than discovering it in production.
Search by tag across every service at once, instead of opening each console page and filtering separately.
Find idle EC2, RDS, EBS and Elastic IP resources, get rightsizing suggestions, and read the spend breakdown by service to see where the money actually goes.
Run the incident investigation workflow rather than checking logs, metrics and configuration by hand in three consoles.
Project the monthly cost of the instances and storage you are about to create, and decide with a number in front of you.
Assume a role in the other account, switch the active context, and run the same queries without editing your AWS config.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
assume_roleAssume an IAM role in another AWS account for cross-account access
aws_executeExecute AWS operations (requires appropriate safety mode)
aws_queryExecute read-only AWS queries (natural language supported)
check_localstackCheck LocalStack connectivity and available services
compare_environmentsCompare resources between two AWS environments (e.g., localstack vs production)
discover_resourcesFind resources across services by tags
find_idle_resourcesFind potentially idle or underutilized AWS resources
get_account_infoGet current AWS account and session information
get_aws_knowledgeGet AWS best practices and operational knowledge
get_best_practicesGet best practices for an AWS service
get_contextGet current conversation context (recent resources, aliases)
get_cost_breakdownGet cost breakdown by service or tag
get_environment_infoGet detailed information about the current AWS environment
get_rightsizing_recommendationsGet recommendations for right-sizing EC2 and RDS instances
get_service_limitsGet service quotas and limits for an AWS service
impact_analysisAnalyze the impact of modifying or deleting a resource
investigate_incidentRun automated incident investigation workflow
list_accountsList all configured AWS accounts (including assumed roles)
list_aliasesList all defined aliases
list_environmentsList all configured AWS environments (production, localstack)
list_profilesList all available AWS profiles
map_dependenciesMap resource dependencies and relationships
project_costsEstimate costs for proposed AWS resources
search_docsSearch AWS documentation for a service or topic
select_profileSelect an AWS profile to use for operations
set_aliasCreate a shortcut alias for a resource
set_safety_modeChange the safety mode for operations
switch_accountSwitch the active AWS account context
switch_environmentSwitch between AWS environments (production or localstack)
validate_operationCheck if an operation is valid and allowed without executing
BEFORE YOU INSTALL
30 tools when we connected.
Python 3.11+
CONTEXT COST
Rated by the size of the 30 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
# 1. Clone and install
git clone https://github.com/arunsanna/aws-sage
cd aws-sage
pip install .pip install git+https://github.com/arunsanna/aws-sage.git{
"mcpServers": {
"aws-sage": {
"command": "<YOUR_PATH_TO_PYTHON3>",
"args": [
"-m",
"aws_sage.server"
],
"env": {
"AWS_PROFILE": "default"
}
}
}
}{
"mcpServers": {
"aws-sage": {
"command": "python",
"args": [
"-m",
"aws_sage.server"
],
"env": {
"AWS_PROFILE": "default"
}
}
}
}{
"mcpServers": {
"aws-sage": {
"command": "python",
"args": [
"-m",
"aws_sage.server"
],
"env": {
"AWS_PROFILE": "default"
},
"disabled": false
}
}
}{
"context_servers": {
"aws-sage": {
"command": "python",
"args": [
"-m",
"aws_sage.server"
],
"env": {
"AWS_PROFILE": "default"
}
}
}
}{
"servers": {
"aws-sage": {
"command": "python",
"args": [
"-m",
"aws_sage.server"
],
"env": {
"AWS_PROFILE": "default"
}
}
}
}Clone the repository and build the image
git clone https://github.com/arunsanna/aws-sage
cd aws-sage
docker compose build aws-sageAdd this server entry to your client
The build tags the image aws-sage:latest. On Windows, mount %USERPROFILE%\.aws instead of ${HOME}/.aws.
{
"mcpServers": {
"aws-sage": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-v",
"${HOME}/.aws:/home/appuser/.aws:ro",
"-e",
"AWS_PROFILE=default",
"aws-sage:latest"
]
}
}
}Values written as ${…} are filled in only by clients that expand variables.