Skip to main content
Glama
README.md
# โ˜๏ธ AWS MCP Server

> **Read-only Model Context Protocol server for AWS resources โ€” multi-region, caching, audit, and AI-ready.**

---

## ๐Ÿ“‹ Overview

This MCP server exposes **60+ read-only tools** across AWS services: identity, EC2, S3, IAM, Cost Explorer, CloudWatch, GuardDuty, CloudTrail, ELB, WAF, Route53, ECS, EKS, RDS, Lambda, and more.

| Flow | Description |
|------|-------------|
| ๐Ÿ”Œ | MCP client connects to this server |
| ๐Ÿ› ๏ธ | Server invokes AWS APIs (read-only) |
| ๐Ÿ“ค | Returns resources, metrics, cost data to the AI agent |

---

## ๐Ÿ› ๏ธ Tech Stack

| Layer | Technology | Purpose |
|-------|------------|---------|
| โ˜๏ธ **MCP Server** | TypeScript, AWS SDK v3 | Protocol handler, tool dispatch |
| ๐Ÿ“ฆ **Runtime** | Node.js (v18+) | Execution |
| ๐Ÿ” **Auth** | AWS credentials (keys, profiles, SSO) | AWS API calls |

---

## ๐Ÿ—ฃ๏ธ Languages

| Language | Used In |
|----------|---------|
| **TypeScript** | MCP server, tools, CLI, libs |
| **JSON** | Config (`mcp-config.json`), MCP schema |

---

## ๐Ÿ“ Project Structure

```
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ index.ts          # MCP server entry, tool dispatch, resources, prompts
โ”‚   โ”œโ”€โ”€ load-env.ts       # Loads .env before other modules
โ”‚   โ”œโ”€โ”€ clients.ts        # Shared AWS clients (one per service)
โ”‚   โ”œโ”€โ”€ cli.ts            # Local CLI for testing tools
โ”‚   โ”œโ”€โ”€ integration.test.ts
โ”‚   โ””โ”€โ”€ lib/              # config, cache, retry, audit, rate-limit, webhook, etc.
โ”œโ”€โ”€ docs/                 # TOOLS.md, IAM_PERMISSIONS.md, CONFIG.md, TROUBLESHOOTING.md
โ”œโ”€โ”€ mcp-config.json.example   # Optional: webhook, rate limit, defaults (copy to mcp-config.json)
โ”œโ”€โ”€ Dockerfile            # Container image for running the server
โ””โ”€โ”€ .env                  # AWS credentials (copy from .env.example)
```

---

## โšก Capabilities

| Feature | Description |
|---------|-------------|
| **Multi-region** | `region` parameter on EC2, VPCs, RDS, Lambda tools |
| **Pagination** | `max_results` on list_iam_users, list_s3_buckets, list_ecs_clusters, list_dynamodb_tables, list_cloudformation_stacks |
| **MCP resources** | Browse `aws://region/service/id` (identity, EC2, S3, cost, RDS, Lambda, GuardDuty) |
| **MCP prompts** | AI guidance for cost, security, and resource-list queries |
| **Caching** | Optional in-memory cache (TTL via `MCP_AWS_CACHE_TTL`) |
| **Retry** | Exponential backoff for throttled AWS calls |
| **Audit log** | Log tool invocations when `MCP_AWS_AUDIT_LOG=true` |
| **Dry-run** | Mock data when `MCP_AWS_DRY_RUN=true` (no AWS calls) |
| **LocalStack** | Set `AWS_ENDPOINT_URL=http://localhost:4566` |
| **Health check** | `aws_health_check` tool to verify credentials |
| **IAM policy** | `get_iam_policy_for_tools` generates least-privilege policy |
| **CLI** | `npm run cli -- get_aws_caller_identity` for local testing |
| **Config file** | `mcp-config.json` for webhook, rate limit, defaults |
| **estimate_cost** | Rough cost estimate for EC2, Lambda, RDS, S3 |
| **scan_secrets_risks** | Find Secrets Manager secrets needing attention |
| **Tag filter** | `tag_filter` on list_ec2_instances, list_rds_instances |
| **SSO / cross-account** | See [docs/SSO_AND_CROSS_ACCOUNT.md](docs/SSO_AND_CROSS_ACCOUNT.md) |

๐Ÿ“– **Documentation:** [TOOLS.md](docs/TOOLS.md) ยท [IAM_PERMISSIONS.md](docs/IAM_PERMISSIONS.md) ยท [CONFIG.md](docs/CONFIG.md) ยท [TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md)

---

## ๐Ÿš€ Quick Start

```bash
# 1. Configure environment
cp .env.example .env   # Add AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION

# 2. Install and build
npm install
npm run build

# 3. Test locally (dry-run, no AWS calls)
MCP_AWS_DRY_RUN=true npm run cli -- get_aws_caller_identity
```

### MCP Client Configuration

```json
{
  "mcpServers": {
    "aws-mcp": {
      "command": "node",
      "args": ["/absolute/path/to/dist/index.js"],
      "env": {
        "AWS_ACCESS_KEY_ID": "YOUR_ACCESS_KEY",
        "AWS_SECRET_ACCESS_KEY": "YOUR_SECRET_KEY",
        "AWS_REGION": "us-east-1"
      }
    }
  }
}
```

---

## ๐Ÿ“ฆ Sharing with Your Team

### Option A: Git

1. Push to a private repo.
2. Team clones, runs `npm install && npm run build`.
3. Point MCP client at `dist/index.js` (absolute path).

### Option B: Package (.tgz)

```bash
npm pack   # Creates mcp-server-aws-1.0.0.tgz
npm install -g mcp-server-aws-1.0.0.tgz
```

Then configure MCP client with `"command": "mcp-server-aws"`.

### Option C: Docker

```bash
docker build -t mcp-server-aws .
docker run -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_REGION mcp-server-aws
```

---

## ๐Ÿ”ง Development

```bash
npm run dev        # Watch mode
npm run typecheck  # TypeScript check (no emit)
npm run cli -- <tool> [--arg key=value]   # Test tools locally
npm run lint       # ESLint
npm run format     # Prettier
npm test           # Unit + integration tests (28 tests)
```

**Release:** Push a tag (e.g. `v1.0.1`) to trigger a GitHub release with built artifacts.

---

## ๐Ÿ‘ค Author

**Sergio Sediq**

- ๐Ÿ”— [GitHub](https://github.com/SergioSediq)
- ๐Ÿ’ผ [LinkedIn](https://www.linkedin.com/in/sedyagho/)
- โœ‰๏ธ sediqsergio@gmail.com