LABSCO SUMMARY
Built for account sprawl, not one account.
Most AWS servers assume one credential and one account; this one starts from AWS Organizations and fans out, which is the shape a security team actually works in. The Athena side is the other half — it reaches history that no describe call can answer, but only if the tables are already built.
What it is
An MCP server that puts AWS security services behind conversational queries. It discovers accounts through organizations:ListAccounts, assumes a named role in each one, and reads live configuration and findings across the security-relevant services — with an optional Athena path for log data already landed in S3.
What you get
- Findings from GuardDuty, SecurityHub and Access Analyzer read together, instead of one console at a time
- Resource and configuration detail across IAM, EC2, S3, Lambda, CloudFront, ELB/ALB/NLB, Route53, WAF, Shield, ECS/ECR and Organizations
- Cross-account reach: accounts discovered from AWS Organizations, then entered by assuming
aws-security-mcp-cross-account-accessin each - Network topology and blast-radius questions answered from live configuration — which resource owns an address, what it can reach
- Athena queries over CloudTrail, VPC Flow Logs, CloudFront, ALB, WAF and Shield logs, correlated across sources
Requirements
AWS credentials with the managed SecurityAudit policy attached — that policy is what the read paths run on. Cross-account discovery additionally needs sts:AssumeRole and organizations:ListAccounts, plus a role named aws-security-mcp-cross-account-access created in each target account. Python 3.11 or higher and uv. Region, profile and cross-account settings live in config.yaml; MCP_LOG_LEVEL, MCP_STARTUP_QUIET and AWS_DEFAULT_REGION override it. The server speaks SSE on port 8000 and clients reach it through mcp-proxy. Athena analysis is optional and needs its own Athena, Glue and S3 permissions plus tables that already exist. Responses can be large — the README recommends a client that handles token sizes greater than 100,000.
Setup effort
Build from source — git clone https://github.com/groovyBugify/aws-security-mcp.git
USE CASES
01
Triaging a week of GuardDuty findings
Pull findings across every connected account and rank them by real exposure rather than by severity label alone.
02
Chasing an IP address across the estate
Ask which resource owns the address and what it can reach, then pull the related CloudTrail and VPC Flow Log activity through Athena.
03
Preparing an IAM access review
List roles with administrative privileges, plus users, policies and access keys, across the whole organization in one pass.
04
Finding secrets left in Lambda configuration
Read Lambda function configurations across accounts and get back both the offending functions and the remediation list.
BEFORE YOU INSTALL
What to know first
Requires
- Python 3.11 or later
- AWS_ACCESS_KEY_ID in your environment
- AWS_SECRET_ACCESS_KEY in your environment
- AWS_SESSION_TOKEN in your environment
Where it runs
The documented client runs the server on your machine.
INSTALLATION
Connect your client
Server setup
TERMINAL
git clone https://github.com/groovyBugify/aws-security-mcp.git
cd aws-security-mcp
uv venv
source .venv/bin/activate
uv pip install -r requirements.txt
python3 aws_security_mcp/main.py sseLeave that server running in its own terminal, with your AWS credentials exported there: it serves SSE on port 8000, which the Claude Desktop entry reaches at http://localhost:8000/sse through mcp-proxy.
TERMINAL
uv tool install mcp-proxy
which mcp-proxyMCP Clients
Claude Desktop
CLAUDE DESKTOP · JSON
{
"mcpServers": {
"aws-security": {
"command": "<YOUR_PATH_TO_MCP_PROXY>",
"args": [
"http://localhost:8000/sse"
]
}
}
}<YOUR_PATH_TO_MCP_PROXY> is the path that which mcp-proxy printed. The server started above has to be running for Claude Desktop to connect.
The configuration on this page does not set AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_SESSION_TOKEN; the project's instructions set them with an export line. That line reaches only programs started from the same terminal, so to supply them, start your client or the server from that terminal.