内容
# MCP AWS 工具包
MCP 服务器,暴露 AWS 操作为 AI 可调用的工具,兼容 Claude Desktop、Claude Code 和任何 MCP 兼容的客户端。
```
"列出我所有的 ECS 集群并显示生产集群中的服务"
"跟踪 /ecs/my-api 的最后 50 条错误日志"
"显示所有 ALARM 状态的 CloudWatch 警报"
"强制部署我的生产 ECS 集群中的支付服务"
"调用数据处理器 Lambda 并显示响应"
"显示谁可以调用支付 Lambda 函数"
"本月到目前为止我在 AWS 上花费了多少钱,按服务分类?"
"预测我未来 30 天的 AWS 成本"
"过去 30 天哪些服务花费最多?"
"显示过去 2 周的每日支出趋势"
```
---
## 工具列表(共 43 个)
### ECS
| 工具 | 描述 |
|------|-------------|
| `ecs_list_clusters` | 列出所有 ECS 集群,包含状态和任务数 |
| `ecs_describe_cluster` | 集群详细信息,包括统计数据和标签 |
| `ecs_list_services` | 列出集群中的服务,包含期望/运行计数 |
| `ecs_describe_service` | 服务详细信息 — 部署、事件、任务定义 |
| `ecs_list_tasks` | 按状态筛选任务(运行中/待处理/停止) |
| `ecs_update_service` | 更改期望计数或强制新部署 |
### CloudWatch
| 工具 | 描述 |
|------|-------------|
| `cloudwatch_list_metrics` | 按命名空间和/或指标名称筛选指标 |
| `cloudwatch_get_metric_statistics` | 获取指标在时间窗口内的统计数据 |
| `cloudwatch_describe_alarms` | 按状态或名称前缀筛选警报 |
| `cloudwatch_list_log_groups` | 列出日志组,可选前缀筛选 |
| `cloudwatch_list_log_streams` | 列出日志组中的日志流,新est 的在前 |
| `cloudwatch_get_log_events` | 从日志流中获取最近的日志事件 |
### S3
| 工具 | 描述 |
|------|-------------|
| `s3_list_buckets` | 列出所有存储桶,包含创建时间 |
| `s3_list_objects` | 按前缀浏览对象,包含大小和存储类别 |
| `s3_get_object` | 读取对象的文本内容 |
| `s3_put_object` | 上传文本内容到对象 |
| `s3_delete_object` | 删除对象 |
| `s3_get_bucket_policy` | 获取存储桶资源策略 |
| `s3_get_bucket_versioning` | 获取版本控制配置 |
### IAM
| 工具 | 描述 |
|------|-------------|
| `iam_list_users` | 列出用户,包含最后登录日期 |
| `iam_list_roles` | 列出角色,可选路径前缀筛选 |
| `iam_get_role` | 角色 ARN、信任策略、描述、标签 |
| `iam_list_attached_role_policies` | 附加到角色的管理策略 |
| `iam_list_policies` | 列出客户管理或 AWS 管理的策略 |
| `iam_get_policy_document` | 获取完整的 JSON 策略文档 |
| `iam_simulate_principal_policy` | 模拟主体策略评估 |
### Lambda
| 工具 | 描述 |
|------|-------------|
| `lambda_list_functions` | 列出函数,包含运行时、内存、超时 |
| `lambda_get_function` | 函数详细信息 — 环境变量、层、并发 |
| `lambda_invoke` | 同步/异步调用,返回响应 + 尾部日志 |
| `lambda_list_versions` | 列出所有已发布的版本 |
| `lambda_list_aliases` | 列出别名及其版本路由配置 |
| `lambda_list_event_source_mappings` | 列出触发器(SQS、Kinesis、DynamoDB 等) |
| `lambda_get_function_url_config` | 获取函数 URL 和身份验证类型 |
| `lambda_put_function_concurrency` | 设置预留并发(设置为 0 以限制) |
| `lambda_delete_function_concurrency` | 删除预留并发限制 |
| `lambda_get_policy` | 获取基于资源的策略(谁可以调用) |
### 成本管理器
| 工具 | 描述 |
|------|-------------|
| `cost_current_month` | 按服务分类的月度支出,排序成本 |
| `cost_last_month` | 上个月日历月的支出,按服务分类 |
| `cost_date_range` | 自定义日期范围,粒度为每日或每月 |
| `cost_forecast` | 未来 N 天的预测支出,每日明细 |
| `cost_top_services` | 过去 N 天内最昂贵的 N 个服务 |
| `cost_daily_trend` | 过去 N 天的每日支出,按服务明细 |
| `cost_by_tag` | 按成本分配标签(例如 `环境`、`团队`)分组的支出 |
> **注意:** 成本管理器每 10,000 次请求后收取 0.01 美元的 API 请求费用。
> `cost_by_tag` 工具需要成本分配标签在您的 AWS 计费控制台中激活。
---
## 安装
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
```
## 运行
**开发 — 浏览器检查器 UI:**
```bash
mcp dev src/mcp_aws_toolkit/server.py
```
**Claude Desktop** — 添加到 `~/Library/Application Support/Claude/claude_desktop_config.json:
```json
{
"mcpServers": {
"aws-toolkit": {
"command": "/path/to/.venv/bin/mcp-aws-toolkit",
"env": {
"AWS_PROFILE": "your-profile",
"AWS_DEFAULT_REGION": "ap-southeast-1"
}
}
}
}
```
**Claude Code:**
```bash
claude mcp add aws-toolkit /path/to/.venv/bin/mcp-aws-toolkit
```
## 测试
```bash
pip install -e ".[dev]"
pytest
```
ECS、CloudWatch、S3、IAM 和 Lambda 测试使用 [moto](https://github.com/getmoto/moto) 模拟 AWS — 无需真实凭证。
成本管理器测试使用 `unittest.mock`(moto 不实现 `get_cost_and_usage` 或 `get_cost_forecast`)。
## 项目结构
```
src/mcp_aws_toolkit/
├── server.py # FastMCP 应用 — 导入并注册所有工具模块
└── tools/
├── ecs.py
├── cloudwatch.py
├── s3.py
├── iam.py
├── lambda_tools.py
└── cost.py # 成本管理器:当前/上个月,预测,趋势,标签分解
tests/
├── conftest.py # 共享夹具:aws_credentials, moto_aws, make_lambda_zip
├── test_ecs.py
├── test_cloudwatch.py
├── test_s3.py
├── test_iam.py
├── test_lambda.py
└── test_cost.py # 基于模拟;测试 CE 响应的解析和格式化
```
## 添加新服务
1. 创建 `src/mcp_aws_toolkit/tools/myservice.py` — 在模块级别定义函数,添加一个 `register(mcp)` 调用 `mcp.tool()(fn)` 为每个函数
2. 在 `server.py` 中导入并调用 `myservice.register(mcp)`
3. 使用 `moto_aws` 夹具(或 `unittest.mock` 如果 moto 不支持该服务)添加 `tests/test_myservice.py`
## 所需 IAM 权限
```json
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"ecs:List*", "ecs:Describe*", "ecs:UpdateService",
"logs:DescribeLogGroups", "logs:DescribeLogStreams", "logs:GetLogEvents",
"cloudwatch:ListMetrics", "cloudwatch:GetMetricStatistics", "cloudwatch:DescribeAlarms",
"s3:ListAllMyBuckets", "s3:ListBucket", "s3:GetObject", "s3:PutObject",
"s3:DeleteObject", "s3:GetBucketPolicy", "s3:GetBucketVersioning",
"iam:ListUsers", "iam:ListRoles", "iam:GetRole",
"iam:ListAttachedRolePolicies", "iam:ListPolicies",
"iam:GetPolicy", "iam:GetPolicyVersion", "iam:SimulatePrincipalPolicy",
"lambda:ListFunctions", "lambda:GetFunction", "lambda:InvokeFunction",
"lambda:ListVersionsByFunction", "lambda:ListAliases",
"lambda:ListEventSourceMappings", "lambda:GetFunctionUrlConfig",
"lambda:PutFunctionConcurrency", "lambda:DeleteFunctionConcurrency",
"lambda:GetPolicy",
"ce:GetCostAndUsage", "ce:GetCostForecast"
],
"Resource": "*"
}]
}
```
## 贡献
欢迎 PR!请先为新增服务开启一个问题。
## 许可证
MIT