mcp-aws-manager 0.3.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README_KO.md CHANGED
@@ -1,8 +1,8 @@
1
- # mcp-aws-manager (한국어 안내)
1
+ # mcp-aws-manager (한국어 안내)
2
2
 
3
- AWS 운영 작업용 CLI + MCP stdio 서버입니다.
3
+ SSM 우선(SSM-first) 방식의 AWS 운영 CLI + MCP stdio 서버입니다.
4
4
 
5
- 이 패키지는 AWS 인벤토리/런타임/완화 작업을 정규화된 출력 스키마와 `ACTION_REQUIRED` 가이드로 제공합니다. 단순 AWS CLI 래퍼가 아니라, 에이전트 친화적인 운영 워크플로우를 목표로 합니다.
5
+ 이 패키지는 AWS 운영 작업(인벤토리/런타임/조치)을 정규화된 응답 스키마와 `ACTION_REQUIRED` 가이드로 제공합니다. 단순 AWS CLI 래퍼가 아니라, 에이전트 친화적인 운영 워크플로우 실행을 목표로 합니다.
6
6
 
7
7
  ## 빠른 시작
8
8
 
@@ -13,105 +13,939 @@ mcp-aws-manager doctor
13
13
  mcp-aws-manager discover --profiles default --no-progress
14
14
  ```
15
15
 
16
- ## 핵심 기능
17
-
18
- - 멀티 서비스 인벤토리: EC2, Lambda, ALB/NLB, ASG, RDS, ElastiCache, Route53
19
- - SSM 상태 확인: managed/online
20
- - 런타임 스냅샷(선택), SSM 완화(선택)
21
- - AWS 인증이 수동 모드: JSON/CSV 서버 목록 + PEM SSH
22
- - GUI 리포트 기본 생성: 워크스페이스/홈 자동 경로 `aws-inventory.html` (검색/필터/CSV 다운로드 버튼 포함)
23
- - 사람이 개입해야 상황을 `ACTION_REQUIRED`로 표준화
16
+ ## 무엇을 제공하나요
17
+
18
+ - 멀티 서비스 인벤토리: EC2, Lambda, ALB/NLB, ASG, RDS, ElastiCache, Route53, VPC/Subnet/SecurityGroup, ECS, S3, IAM, KMS, CloudWatch, CloudTrail, Config, Secrets Manager, ECR, DynamoDB, SNS, EventBridge, SQS, ACM, Kinesis, MSK, Budgets, Cost Anomaly, EBS, EFS, EKS, API Gateway (REST/v2), CloudFront, WAF, Shield, Step Functions, CloudWatch Logs, X-Ray, Inspector2, Redshift, OpenSearch, Organizations, ControlTower
19
+ - SSM 상태 가시성: managed/online
20
+ - 도메인 분석 파이프라인: IaC drift, CI/CD signals, backup/DR posture, security posture, FinOps cost signals, application layer health, incident severity recommendation
21
+ - 선택적 런타임 스냅샷 SSM 자동 조치
22
+ - 변경 표면 확장: EC2 + ECS + ASG + RDS + EKS 통제형 변경 도구
23
+ - 정책 기반 라우팅: mode/surface/schema-tier 자동 선택
24
+ - 대규모 운영 제어: Organizations AssumeRole fan-out + profile/region 샤딩
25
+ - 인증 불가 시 수동 모드: JSON/CSV 서버 목록 + PEM SSH/ProxyJump/Bastion 런타임 스냅샷
26
+ - `ACTION_REQUIRED` 기반 human-in-the-loop 재시도 루프
27
+ - 내부 실행 경로 고정(AWS SDK + AWS CLI)
28
+ - 출력 프레젠테이션 제어: output profile/sections/fields + client-aware 기본값
29
+ - 거버넌스 로그 + topology/relationship JSON 산출물
30
+ - incident webhook 연동 + incident payload artifact(선택)
31
+
32
+ ## 언제 쓰면 좋은가요
33
+
34
+ `mcp-aws-manager`는 범용 AWS API 접근보다 운영 워크플로우 MCP가 필요할 때 적합합니다.
35
+
36
+ - 인벤토리/런타임/조치 루프를 결정적으로 반복 실행하고 싶을 때
37
+ - `ACTION_REQUIRED` 중심 운영 가이드와 산출물이 필요할 때
38
+ - 단순 ad-hoc API 제어만 필요하면 범용 AWS MCP가 더 단순할 수 있습니다
39
+
40
+ 비교/경계는 아래 문서를 참고하세요.
41
+
42
+ - `MCP_DIFFERENTIATION.md`
43
+
44
+ ## 빠른 비교 요약
45
+
46
+ | 선택 포인트 | `mcp-aws-manager` | 범용 API형 AWS MCP |
47
+ |---|---|---|
48
+ | 1차 목적 | 운영 워크플로우(인벤토리/런타임/조치) 결정적 실행 | 광범위한 ad-hoc API/툴 접근 |
49
+ | 도구 노출 모델 | 고정 gateway 3-tool (`capabilities_summary`, `capabilities_detail`, `gateway_execute`) | 서비스/액션별 다수 직접 툴 |
50
+ | 변경 안전장치 | mutate 경로 확인/정책 게이트 내장 | 서버/툴별 정책 구현에 의존 |
51
+ | 응답 계약 | 정규화(`ok/summary/records/requiredActions/meta`) | 구현마다 상이 |
52
+ | 적합한 상황 | 반복 가능한 운영 루프 + 운영자 가이드 필요 | 탐색/실험 위주의 광범위 API 접근 |
53
+
54
+ 상세 근거와 경계는 `MCP_DIFFERENTIATION.md`, `MCP_DIFFERENTIATION_KO.md`를 참고하세요.
55
+
56
+ ## API 커버리지 스냅샷
57
+
58
+ - AWS API 총량은 고정 숫자가 없으며(지속 증가), 전체 서비스 기준으로 매우 큽니다.
59
+ - 현재 구현 범위는 "모든 AWS API"가 아닙니다.
60
+ - 사용 중인 AWS SDK service clients: `49`
61
+ - 사용 중인 AWS SDK operation calls: `95`
62
+ - 사용 중인 AWS CLI commands: `1` (`aws sso login --profile <profile>`)
63
+ - 참고: 엔터프라이즈 제어(정책 게이트/롤백/거버넌스 검증)를 유지하면서 인벤토리 커버리지를 확장했습니다.
64
+
65
+ 현재 사용 중인 95개 AWS SDK 작업:
66
+
67
+ - STS: `GetCallerIdentity`
68
+ - EC2: `DescribeRegions`, `DescribeInstances`, `DescribeVpcs`, `DescribeSubnets`, `DescribeSecurityGroups`, `StartInstances`, `StopInstances`, `RebootInstances`, `DescribeIamInstanceProfileAssociations`, `AssociateIamInstanceProfile`, `ReplaceIamInstanceProfileAssociation`
69
+ - SSM: `DescribeInstanceInformation`, `DescribeParameters`, `SendCommand`, `GetCommandInvocation`
70
+ - Lambda: `ListFunctions`
71
+ - ELBv2: `DescribeLoadBalancers`, `DescribeTargetGroups`
72
+ - Auto Scaling: `DescribeAutoScalingGroups`, `SetDesiredCapacity`
73
+ - RDS: `DescribeDBInstances`, `StartDBInstance`, `StopDBInstance`, `RebootDBInstance`
74
+ - ElastiCache: `DescribeCacheClusters`
75
+ - Route53: `ListHostedZones`, `ListResourceRecordSets`
76
+ - ECS: `ListClusters`, `DescribeClusters`, `ListServices`, `DescribeServices`, `UpdateService`
77
+ - S3: `ListBuckets`, `GetBucketLocation`
78
+ - IAM: `ListRoles`
79
+ - KMS: `ListKeys`, `DescribeKey`
80
+ - CloudWatch: `DescribeAlarms`
81
+ - CloudTrail: `DescribeTrails`
82
+ - AWS Config: `DescribeConfigurationRecorders`, `DescribeConfigurationRecorderStatus`, `DescribeDeliveryChannels`, `DescribeConfigRules`, `DescribeComplianceByConfigRule`
83
+ - Secrets Manager: `ListSecrets`
84
+ - ECR: `DescribeRepositories`
85
+ - DynamoDB: `ListTables`, `DescribeTable`
86
+ - SNS: `ListTopics`
87
+ - EventBridge: `ListEventBuses`
88
+ - SQS: `ListQueues`, `GetQueueAttributes`
89
+ - ACM: `ListCertificates`, `DescribeCertificate`
90
+ - Kinesis: `ListStreams`, `DescribeStreamSummary`
91
+ - MSK: `ListClustersV2`
92
+ - AWS Budgets: `DescribeBudgets`
93
+ - EBS: `DescribeVolumes`
94
+ - EFS: `DescribeFileSystems`
95
+ - EKS: `ListClusters`, `DescribeCluster`, `DescribeNodegroup`, `UpdateNodegroupConfig`
96
+ - API Gateway (REST): `GetRestApis`
97
+ - API Gateway v2: `GetApis`
98
+ - CloudFront: `ListDistributions`
99
+ - WAFv2: `ListWebACLs`
100
+ - Shield: `ListProtections`
101
+ - Step Functions: `ListStateMachines`
102
+ - CloudWatch Logs: `DescribeLogGroups`
103
+ - X-Ray: `GetGroups`
104
+ - Inspector2: `ListFindings`
105
+ - Redshift: `DescribeClusters`
106
+ - OpenSearch: `ListDomainNames`, `DescribeDomain`
107
+ - Organizations: `ListAccounts`
108
+ - ControlTower: `ListLandingZones`
109
+ - CloudFormation: `DescribeStacks`
110
+ - CodePipeline: `ListPipelines`, `ListPipelineExecutions`
111
+ - CodeBuild: `ListProjects`, `ListBuildsForProject`, `BatchGetBuilds`
112
+ - CodeDeploy: `ListApplications`, `ListDeploymentGroups`, `ListDeployments`, `BatchGetDeployments`
113
+ - AWS Backup: `ListBackupPlans`, `ListProtectedResources`
114
+ - SecurityHub: `GetFindings`
115
+ - GuardDuty: `ListDetectors`, `ListFindings`
116
+ - Cost Explorer: `GetCostAndUsage`, `GetAnomalies`, `GetSavingsPlansUtilization`, `GetReservationCoverage`
24
117
 
25
118
  ## 바이너리
26
119
 
27
120
  - CLI: `mcp-aws-manager`
28
- - MCP stdio server: `mcp-aws-manager-mcp`
121
+ - MCP stdio server (single-entry, 기본값: `--surface all`): `mcp-aws-manager-mcp`
122
+
123
+ `mcp-aws-manager-mcp`는 gateway 라우팅 기반으로 surface 범위만 선택합니다.
124
+
125
+ ```bash
126
+ mcp-aws-manager-mcp --surface all
127
+ mcp-aws-manager-mcp --surface readonly
128
+ mcp-aws-manager-mcp --surface mutate
129
+ ```
29
130
 
30
- ## 최초 설정(권장 흐름)
131
+ ## 에이전트 보조 최초 설정
31
132
 
32
- 1. 설치 부트스트랩
133
+ 신규 사용자는 아래 순서를 권장합니다.
134
+
135
+ 1. 설치 및 bootstrap:
33
136
 
34
137
  ```bash
35
138
  npm.cmd install -g mcp-aws-manager@latest
36
139
  mcp-aws-manager
37
140
  ```
38
141
 
39
- 2. 상태 확인
142
+ bootstrap/setup 기본 동작은 단일 서버 1개를 등록합니다.
143
+
144
+ - `mcp-aws-manager` (single-entry, `--surface all`)
145
+
146
+ 명시적 등록 예시:
147
+
148
+ ```bash
149
+ mcp-aws-manager setup
150
+ mcp-aws-manager setup --clients codex,claude
151
+ mcp-aws-manager setup --clients cursor,windsurf,antigravity
152
+ ```
153
+
154
+ 2. 상태 점검:
40
155
 
41
156
  ```bash
42
157
  mcp-aws-manager doctor
43
158
  ```
44
159
 
45
- 3. AWS 인증 설정(권장: SSO)
160
+ 3. AWS 인증 설정(권장: SSO):
46
161
 
47
162
  ```bash
48
163
  aws configure sso --profile default
49
164
  aws sso login --profile default
50
165
  ```
51
166
 
52
- 4. 인증 확인
167
+ 4. 인증 확인:
53
168
 
54
169
  ```bash
55
170
  aws sts get-caller-identity --profile default
56
171
  ```
57
172
 
58
- 5. 인벤토리 실행
173
+ 5. 인벤토리 실행:
59
174
 
60
175
  ```bash
61
176
  mcp-aws-manager discover --profiles default --no-progress
62
177
  ```
63
178
 
64
- ## 인증 불가 수동 모드
179
+ 실패 `ACTION_REQUIRED`를 1건 처리한 뒤 동일 명령으로 재시도하세요.
180
+
181
+ AWS 인증이 불가능하면 수동 모드를 사용하세요.
65
182
 
66
183
  ```bash
67
184
  mcp-aws-manager discover --manual-server-list ./servers.csv --pem-paths C:\keys\prod.pem --no-progress
68
185
  ```
69
186
 
70
- ## GUI 리포트
187
+ GUI 리포트는 기본 생성됩니다(자동 경로: workspace/home `aws-inventory.html`).
71
188
 
72
189
  ```bash
73
190
  mcp-aws-manager discover --profiles default --no-progress
74
191
  ```
75
192
 
76
- - 기본 경로: 워크스페이스/홈 자동 선택(`aws-inventory.html`)
77
- - `--html-out <path>`: 리포트 경로 변경
78
- - `--open-html`: 생성 후 브라우저 오픈 강제
79
- - `--no-open-html`: 자동 오픈 비활성화
80
- - GUI에서 현재 기준 CSV 다운로드 가능
193
+ GUI 포함 항목:
194
+
195
+ - 요약 카드(레코드/서비스/프로필/리전/EC2/SSM/공인 IP/이슈)
196
+ - 뷰(`Report`, `Diagrams`, `Evidence`, `Inventory`)
197
+ - 리소스 유형별 섹션을 포함한 상세 markdown 리포트(`report.md`)
198
+ - 토폴로지 다이어그램(Profile -> Region -> Type -> Resource)
199
+ - 관계 다이어그램(DNS / TargetGroup-ALB / ASG 휴리스틱 링크)
200
+ - 리소스 상세와 집중 관계 다이어그램(`focus.svg`)을 포함한 포커스 서버/리소스 선택기
201
+ - 증적 보기 및 내보내기(`evidence.json`)
202
+ - 다이어그램 내보내기(`diagram.drawio`, `topology.svg`, `relationship.svg`)
203
+ - 다운로드 파일명에 생성 시각 자동 포함(예: `report-20260304-113000.md`)
204
+
205
+ 경로/오픈 제어:
206
+
207
+ ```bash
208
+ mcp-aws-manager discover --profiles default --html-out ./inventory.html --open-html --no-progress
209
+ ```
210
+
211
+ 기본값은 `open-html=true`입니다. 자동 오픈을 끄려면 `--no-open-html`을 사용하세요.
212
+
213
+ ### 수동 MCP 클라이언트 설정(대체 경로)
214
+
215
+ 자동 `bootstrap/setup`이 불가능한 환경에서만 사용하세요.
216
+
217
+ 1) 로컬 저장소(개발):
218
+
219
+ ```json
220
+ {
221
+ "mcpServers": {
222
+ "mcp-aws-manager": {
223
+ "command": "node",
224
+ "args": [
225
+ "<repo>/bin/mcp-aws-manager-mcp.js",
226
+ "--surface",
227
+ "all"
228
+ ],
229
+ "cwd": "<repo>"
230
+ }
231
+ }
232
+ }
233
+ ```
234
+
235
+ 2) 전역 npm 설치:
236
+
237
+ ```json
238
+ {
239
+ "mcpServers": {
240
+ "mcp-aws-manager": {
241
+ "command": "mcp-aws-manager-mcp",
242
+ "args": ["--surface", "all"]
243
+ }
244
+ }
245
+ }
246
+ ```
247
+
248
+ 3) `npx`(전역 설치 없이):
249
+
250
+ ```json
251
+ {
252
+ "mcpServers": {
253
+ "mcp-aws-manager": {
254
+ "command": "npx",
255
+ "args": ["-y", "-p", "mcp-aws-manager", "mcp-aws-manager-mcp", "--surface", "all"]
256
+ }
257
+ }
258
+ }
259
+ ```
260
+
261
+ ## 사용자 확인이 필요한 단계
262
+
263
+ 대부분 아래 항목만 수동으로 처리하면 됩니다.
264
+
265
+ - SSO 브라우저 로그인 및 MFA 확인
266
+ - 조직 계정의 IAM 권한 승인
267
+ - EC2 런타임 가시성을 위해 `AmazonSSMManagedInstanceCore` 부여 및 SSM Agent/네트워크 정상화
268
+
269
+ 에이전트 재시도 루프(권장):
270
+
271
+ 1. 먼저 도구를 실행합니다.
272
+ 2. `requiresUserAction=false`이면 결과를 요약하고 종료합니다.
273
+ 3. `requiresUserAction=true`이면 `requiredActions[]`에서 한 건만 안내합니다.
274
+ 4. 사용자가 완료를 알리면 `guidance.retryTool` + `guidance.retryArgs`로 즉시 재실행합니다.
275
+ 5. `requiresUserAction=false`가 될 때까지 반복합니다.
276
+
277
+ ## MCP 도구 사용
278
+
279
+ 단일 엔트리 MCP 서버 실행(기본: `--surface all`):
280
+
281
+ ```bash
282
+ mcp-aws-manager-mcp
283
+ ```
284
+
285
+ 노출 프로필 선택:
286
+
287
+ - `mcp-aws-manager-mcp --surface all|readonly|mutate` (gateway-only)
288
+
289
+ Gateway 모델은 `tools/list`에 정확히 3개만 노출합니다.
290
+
291
+ - `capabilities_summary`
292
+ - `capabilities_detail`
293
+ - `gateway_execute`
294
+
295
+ Gateway 호출 흐름:
296
+
297
+ 1. `capabilities_summary`로 카테고리/`operationId` 목록을 조회합니다.
298
+ 2. `capabilities_detail`로 선택한 `operationId`의 실행 계약을 확인합니다.
299
+ 3. `gateway_execute`로 `{ "operationId": "...", "args": { ... } }`를 실행합니다.
300
+
301
+ 대표 `operationId` 계열:
302
+
303
+ - 조회 계열: `discover.aws_inventory_basic`, `discover.aws_inventory_advanced`, `discover.aws_inventory_summary`, `discover.aws_inventory_detail`, `discover.list_bedrock_endpoints`, `discover.list_sagemaker_endpoints`
304
+ - 변경 계열: `mutate.ec2_start_instances`, `mutate.ec2_stop_instances`, `mutate.ec2_reboot_instances`, `mutate.ec2_apply_instance_profile`, `mutate.ec2_rollback_last_change`, `mutate.ecs_update_service_desired_count`, `mutate.asg_set_desired_capacity`, `mutate.rds_start_instances`, `mutate.rds_stop_instances`, `mutate.rds_reboot_instances`, `mutate.eks_update_nodegroup_scaling`
305
+ - 거버넌스/시스템 계열: `governance.verify_chain`, `system.get_server_runtime`, `system.cli_help`
306
+
307
+ Gateway execute 예시:
308
+
309
+ - Discovery summary: `{ "operationId": "discover.aws_inventory_summary", "args": { "profiles": ["default"], "regions": ["ap-southeast-1"] } }`
310
+ - Discovery detail: `{ "operationId": "discover.aws_inventory_detail", "args": { "profiles": ["default"], "regions": ["ap-southeast-1"], "resourceTypes": ["ec2"], "limit": 50 } }`
311
+ - AI/ML 조회: `{ "operationId": "discover.list_bedrock_endpoints", "args": { "profile": "default", "region": "us-east-1", "metricWindowMinutes": 60 } }`
312
+ - Mutation: `{ "operationId": "mutate.ec2_start_instances", "args": { "profile": "default", "region": "ap-southeast-1", "instanceIds": ["i-123"], "userConfirmation": "yes" } }`
313
+
314
+ Discover 연산 참고:
315
+
316
+ - `discover.aws_inventory_basic`: compact 입력 스키마
317
+ - `discover.aws_inventory_advanced`: full 입력 스키마
318
+ - `discover.aws_inventory_summary`: summary-first + selector hint
319
+ - `discover.aws_inventory_detail`: 선택자 기반 상세/페이지 조회 (`resourceTypes`, `resourceIds`, `offset`, `limit`)
320
+ - 출력 레이아웃 옵션: `outputProfile`, `sections`, `includeFields`, `excludeFields`, `rendererTemplate`
321
+ - 라우팅/제어 옵션: `mode`, `schemaTier`, `userConfirmation`, `profileShard`, `regionShard`, `orgRoleName`, `orgAccountIds`, `orgIncludeAllAccounts`, `orgMaxAccounts`, `enterprisePolicyPath`, `approvalTicket`, `changeReason`
322
+ - 증적/산출물 옵션: `topologyOutPath`, `relationshipsOutPath`, `governanceLogPath`, `verifyGovernanceChain`, `incidentWebhookUrl`, `incidentWebhookTimeoutMs`, `incidentWebhookAuthHeader`, `incidentWebhookToken`, `incidentOutPath`
323
+ - `workingDirectory`는 allowlist(`cwd`, home, `MCP_AWS_ALLOWED_WORKDIRS`)로 검증됩니다.
324
+ - stderr로 구조화 JSON 로그를 출력하며, `LOG_LEVEL=error|warn|info|debug`(기본 `info`)로 상세도를 제어할 수 있습니다.
325
+
326
+ 런타임 introspection:
327
+
328
+ - gateway 모델: `gateway_execute` + `operationId: "system.get_server_runtime"`
329
+ - 응답에는 현재 surface, 노출 연산/도구, confirmation 정책, response contract 메타가 포함됩니다.
330
+
331
+ 예시 tool args:
332
+
333
+ ```json
334
+ {
335
+ "profiles": ["default"],
336
+ "regions": ["ap-northeast-2"],
337
+ "profileShard": { "index": 1, "total": 2 },
338
+ "regionShard": { "index": 1, "total": 3 },
339
+ "orgRoleName": "OrganizationAccountAccessRole",
340
+ "orgIncludeAllAccounts": false,
341
+ "orgAccountIds": ["111111111111", "222222222222"],
342
+ "orgMaxAccounts": 25,
343
+ "includeLambda": true,
344
+ "includeIac": true,
345
+ "includeCicd": true,
346
+ "includeBackupDr": true,
347
+ "includeSecurity": true,
348
+ "includeFinops": true,
349
+ "includeApplication": true,
350
+ "includeIncident": true,
351
+ "mode": "observe",
352
+ "schemaTier": "advanced",
353
+ "publicOnly": true,
354
+ "runtimeSnapshot": true,
355
+ "outputProfile": "operator",
356
+ "sections": ["overview", "runtime", "application", "actions"],
357
+ "includeFields": ["resourceType", "resourceId", "state", "ssmOnline", "runtimeSnapshotStatus"],
358
+ "excludeFields": ["runtimeSnapshotOutput"],
359
+ "clientProfile": "codex",
360
+ "rendererTemplate": "compact",
361
+ "userConfirmation": "yes",
362
+ "topologyOutPath": "C:\\tmp\\topology.json",
363
+ "relationshipsOutPath": "C:\\tmp\\relationships.json",
364
+ "governanceLogPath": "C:\\tmp\\governance.jsonl",
365
+ "incidentWebhookUrl": "https://example.com/hooks/oncall",
366
+ "incidentWebhookAuthHeader": "Authorization",
367
+ "incidentWebhookToken": "Bearer ***",
368
+ "incidentOutPath": "C:\\tmp\\incident.json",
369
+ "htmlOutPath": "C:\\tmp\\inventory.html",
370
+ "openHtml": true,
371
+ "manualServerListPath": "C:\\tmp\\servers.csv",
372
+ "pemPaths": ["C:\\keys\\prod.pem"],
373
+ "sshUser": "ec2-user",
374
+ "sshPort": 22,
375
+ "sshConnectTimeoutSec": 8,
376
+ "autoSsoLogin": true,
377
+ "noProgress": true
378
+ }
379
+ ```
380
+
381
+ ## Action Codes
382
+
383
+ 자주 등장하는 `ACTION_REQUIRED` 코드:
384
+
385
+ - `SSO_LOGIN_NEEDED`
386
+ - `AWS_CREDENTIALS_REQUIRED`
387
+ - `IAM_PERMISSION_REQUIRED`
388
+ - `AWS_OPERATION_FAILED`
389
+ - `SSM_ROLE_OR_AGENT_REQUIRED`
390
+ - `INSTANCE_HAS_PROFILE`
391
+ - `IAM_PROFILE_ASSOCIATION_FAILED`
392
+ - `CHANGE_CONFIRMATION_REQUIRED`
393
+ - `CHANGE_NOT_CONFIRMED`
394
+ - `APPROVAL_TICKET_REQUIRED`
395
+ - `APPROVAL_TICKET_INVALID`
396
+ - `CHANGE_REASON_REQUIRED`
397
+ - `ENTERPRISE_POLICY_NOT_FOUND`
398
+ - `ENTERPRISE_POLICY_INVALID`
399
+ - `ENTERPRISE_POLICY_BLOCKED_ACTION`
400
+ - `ENTERPRISE_POLICY_DISCOVER_REMEDIATION_BLOCKED`
401
+ - `ENTERPRISE_POLICY_BLOCKED_PROFILE`
402
+ - `ENTERPRISE_POLICY_BLOCKED_REGION`
403
+ - `ENTERPRISE_POLICY_BATCH_TOO_LARGE`
404
+ - `INCIDENT_WEBHOOK_DISPATCH_FAILED`
405
+ - `GOVERNANCE_LOG_WRITE_FAILED`
406
+ - `GOVERNANCE_CHAIN_BROKEN`
407
+ - `GOVERNANCE_LOG_NOT_FOUND`
408
+ - `GOVERNANCE_LOG_INVALID_JSON`
409
+ - `GOVERNANCE_CHAIN_HASH_MISMATCH`
410
+ - `GOVERNANCE_CHAIN_PREV_HASH_MISMATCH`
411
+ - `IAC_CLOUDFORMATION_PERMISSION_REQUIRED`
412
+ - `CICD_CODEPIPELINE_PERMISSION_REQUIRED`
413
+ - `CICD_CODEBUILD_PERMISSION_REQUIRED`
414
+ - `CICD_CODEDEPLOY_PERMISSION_REQUIRED`
415
+ - `BACKUP_PERMISSION_REQUIRED`
416
+ - `BACKUP_COVERAGE_REVIEW_REQUIRED`
417
+ - `SECURITY_POSTURE_PERMISSION_REQUIRED`
418
+ - `SECURITY_CONFIG_PERMISSION_REQUIRED`
419
+ - `SECURITY_INSPECTOR2_PERMISSION_REQUIRED`
420
+ - `SECURITY_ACM_PERMISSION_REQUIRED`
421
+ - `SECURITY_ACM_CERT_EXPIRING`
422
+ - `FINOPS_COST_EXPLORER_PERMISSION_REQUIRED`
423
+ - `INCIDENT_ESCALATION_RECOMMENDED`
424
+ - `WORKING_DIRECTORY_INVALID`
425
+ - `WORKING_DIRECTORY_NOT_FOUND`
426
+ - `WORKING_DIRECTORY_NOT_DIRECTORY`
427
+ - `WORKING_DIRECTORY_NOT_ALLOWED`
428
+ - `SSM_RUNCOMMAND_PERMISSION_REQUIRED`
429
+ - `LAMBDA_LIST_PERMISSION_REQUIRED`
430
+ - `ELBV2_LIST_PERMISSION_REQUIRED`
431
+ - `ASG_LIST_PERMISSION_REQUIRED`
432
+ - `RDS_LIST_PERMISSION_REQUIRED`
433
+ - `ELASTICACHE_LIST_PERMISSION_REQUIRED`
434
+ - `ROUTE53_LIST_PERMISSION_REQUIRED`
435
+ - `VPC_LIST_PERMISSION_REQUIRED`
436
+ - `ECS_LIST_PERMISSION_REQUIRED`
437
+ - `S3_LIST_PERMISSION_REQUIRED`
438
+ - `IAM_LIST_PERMISSION_REQUIRED`
439
+ - `KMS_LIST_PERMISSION_REQUIRED`
440
+ - `SNS_LIST_PERMISSION_REQUIRED`
441
+ - `EVENTBRIDGE_LIST_PERMISSION_REQUIRED`
442
+ - `SQS_LIST_PERMISSION_REQUIRED`
443
+ - `ACM_LIST_PERMISSION_REQUIRED`
444
+ - `KINESIS_LIST_PERMISSION_REQUIRED`
445
+ - `MSK_LIST_PERMISSION_REQUIRED`
446
+ - `CLOUDWATCH_LIST_PERMISSION_REQUIRED`
447
+ - `EBS_LIST_PERMISSION_REQUIRED`
448
+ - `EFS_LIST_PERMISSION_REQUIRED`
449
+ - `EKS_LIST_PERMISSION_REQUIRED`
450
+ - `APIGATEWAY_LIST_PERMISSION_REQUIRED`
451
+ - `APIGATEWAYV2_LIST_PERMISSION_REQUIRED`
452
+ - `CLOUDFRONT_LIST_PERMISSION_REQUIRED`
453
+ - `WAF_LIST_PERMISSION_REQUIRED`
454
+ - `SHIELD_LIST_PERMISSION_REQUIRED`
455
+ - `STEPFUNCTIONS_LIST_PERMISSION_REQUIRED`
456
+ - `CLOUDWATCH_LOGS_LIST_PERMISSION_REQUIRED`
457
+ - `XRAY_LIST_PERMISSION_REQUIRED`
458
+ - `INSPECTOR2_LIST_PERMISSION_REQUIRED`
459
+ - `REDSHIFT_LIST_PERMISSION_REQUIRED`
460
+ - `OPENSEARCH_LIST_PERMISSION_REQUIRED`
461
+ - `ORGANIZATIONS_LIST_PERMISSION_REQUIRED`
462
+ - `CONTROLTOWER_LIST_PERMISSION_REQUIRED`
463
+ - `MANUAL_SERVER_LIST_EMPTY`
464
+ - `MANUAL_SERVER_HOST_REQUIRED`
465
+ - `WEB_IDENTITY_CONFIG_REQUIRED`
466
+ - `WEB_IDENTITY_TOKEN_FILE_NOT_FOUND`
467
+ - `PEM_KEY_NOT_FOUND`
468
+ - `BASTION_PEM_KEY_NOT_FOUND`
469
+ - `PEM_MAPPING_REQUIRED`
470
+ - `SSH_CLIENT_NOT_FOUND`
471
+ - `SSH_AUTH_OR_CONNECT_FAILED`
472
+
473
+ `ACTION_REQUIRED` 메타 필드:
474
+
475
+ - `severity`
476
+ - `owner`
477
+ - `autoFixable`
478
+
479
+ ## 응답 계약(Response Contract)
480
+
481
+ - 모든 도구 응답에 runtime contract 필드 포함:
482
+ - `meta.schemaVersion`
483
+ - `meta.compatibility`
484
+ - `meta.responseType`
485
+ - View envelope( CLI JSON / MCP parsed payload ):
486
+ - `outputProfile`
487
+ - `sections`
488
+ - `fields`
489
+ - `view.records`
490
+ - `rawNormalized` (재처리 안정성을 위해 항상 포함)
491
+ - `schema` / `schemaVersion`
492
+ - 계약 스키마: `schemas/mcp-tool-response.schema.json`
493
+ - 호환성 정책: `RESPONSE_COMPATIBILITY_POLICY.md`
494
+
495
+ <details>
496
+ <summary>상세 AWS 인증 설정 (SSO vs Access Key)</summary>
497
+
498
+ 권장 방식:
499
+
500
+ - 운영자(사람) 계정은 `SSO (IAM Identity Center)` 권장
501
+ - `Access Key`는 SSO를 쓸 수 없는 예외 상황의 로컬 대체 수단
502
+ - CI/CD 자동화는 장기 키보다 IAM Role/OIDC 권장
503
+
504
+ SSO 권장 이유:
505
+
506
+ - 장기 키를 로컬에 보관하지 않아 보안 리스크 감소
507
+ - MFA/세션 만료 동작을 표준화하기 쉬움
508
+ - 중앙 권한 회수(revoke) 및 감사(audit)에 유리
509
+
510
+ 사전 조건:
511
+
512
+ - AWS CLI v2
513
+ - 조직 계정에 IAM Identity Center 구성 완료
514
+ - 대상 계정/Permission Set 할당 완료
515
+
516
+ SSO 설정:
517
+
518
+ ```bash
519
+ aws configure sso --profile default
520
+ aws sso login --profile default
521
+ aws sts get-caller-identity --profile default
522
+ ```
523
+
524
+ Access key 설정(대체 경로):
525
+
526
+ ```bash
527
+ aws configure --profile default
528
+ aws sts get-caller-identity --profile default
529
+ ```
530
+
531
+ OIDC/WebIdentity 설정(CI/CD 또는 Kubernetes):
532
+
533
+ ```bash
534
+ export AWS_ROLE_ARN=arn:aws:iam::123456789012:role/oidc-workload-role
535
+ export AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
536
+ aws sts get-caller-identity
537
+ ```
538
+
539
+ CLI 옵션으로 동일하게 지정:
540
+
541
+ ```bash
542
+ mcp-aws-manager discover \
543
+ --auth-mode web-identity \
544
+ --web-identity-role-arn arn:aws:iam::123456789012:role/oidc-workload-role \
545
+ --web-identity-token-file /var/run/secrets/eks.amazonaws.com/serviceaccount/token
546
+ ```
547
+
548
+ 빠른 점검:
549
+
550
+ ```bash
551
+ aws configure list-profiles
552
+ aws configure list --profile default
553
+ aws ec2 describe-regions --profile default
554
+ ```
555
+
556
+ 자주 나는 오류:
81
557
 
82
- ## MCP 도구
558
+ - `Missing the following required SSO configuration values`
559
+ `aws configure sso --profile default`를 다시 실행해 필수 항목을 모두 입력하세요.
560
+ - `Unable to locate credentials`
561
+ SSO 세션 만료 또는 인증정보 누락 상태입니다. `aws sso login --profile default`를 실행하거나 Access Key를 재설정하세요.
562
+ - `AccessDenied` / `not authorized`
563
+ 인증은 성공했지만 해당 API를 호출할 IAM 권한(Permission Set/Policy)이 부족합니다.
564
+
565
+ </details>
566
+
567
+ <details>
568
+ <summary>AWS 접근 경로 설정 (Profile / SSO / OIDC WebIdentity)</summary>
569
+
570
+ 인증 모드:
571
+
572
+ - `auto` (기본): 기본적으로 profile을 사용하되, WebIdentity(role+token)가 주어지면 해당 경로를 사용할 수 있습니다.
573
+ - `profile`: AWS profile 자격증명(`fromIni`)을 고정 사용합니다.
574
+ - `web-identity`: OIDC/WebIdentity 토큰 경로(`fromTokenFile`)를 고정 사용합니다.
575
+
576
+ 권장 선택:
577
+
578
+ - 운영자 PC: `profile` + SSO 로그인
579
+ - CI/CD 또는 Kubernetes 워크로드 아이덴티티: `web-identity`
580
+ - 혼합 환경: `auto` 유지 + 필요 시 명시 옵션 전달
581
+
582
+ Profile/SSO 경로:
583
+
584
+ ```bash
585
+ aws configure sso --profile prod-admin
586
+ aws sso login --profile prod-admin
587
+ mcp-aws-manager discover --profiles prod-admin --regions us-east-1 --auth-mode profile
588
+ ```
589
+
590
+ WebIdentity 경로:
591
+
592
+ ```bash
593
+ export AWS_ROLE_ARN=arn:aws:iam::123456789012:role/oidc-workload-role
594
+ export AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
595
+ mcp-aws-manager discover --auth-mode web-identity --regions us-east-1
596
+ ```
597
+
598
+ Gateway/mutation 및 AI-read 입력 필드:
599
+
600
+ - `authMode`
601
+ - `webIdentityRoleArn`
602
+ - `webIdentityTokenFile`
603
+ - `webIdentitySessionName` (선택)
604
+
605
+ 입력 우선순위:
606
+
607
+ - 명시적 tool 입력/CLI 옵션
608
+ - `MCP_AWS_WEB_IDENTITY_*`
609
+ - `AWS_ROLE_ARN` / `AWS_WEB_IDENTITY_TOKEN_FILE`
610
+
611
+ 인증 관련 주요 ACTION_REQUIRED:
612
+
613
+ - `WEB_IDENTITY_CONFIG_REQUIRED`
614
+ - `WEB_IDENTITY_TOKEN_FILE_NOT_FOUND`
615
+ - `AWS_CREDENTIALS_REQUIRED`
616
+
617
+ </details>
618
+
619
+ <details>
620
+ <summary>서버 내부 접근 경로 설정 (SSM / PEM SSH / ProxyJump / Bastion)</summary>
621
+
622
+ 런타임 스냅샷 경로 선택:
623
+
624
+ - AWS 관리 EC2(`manualInput=false`): SSM RunCommand 경로 사용
625
+ - 수동 서버 목록(`manualInput=true`): SSH 경로 사용
626
+ - SSH 경로는 다음 중 하나:
627
+ - `ssh-pem` (직접 키 접속)
628
+ - `ssh-proxyjump` (`--ssh-proxy-jump`)
629
+ - `ssh-bastion` (`--ssh-bastion-*`, 내부적으로 ProxyCommand 사용)
630
+
631
+ 수동 목록 + 직접 PEM 예시:
632
+
633
+ ```bash
634
+ mcp-aws-manager discover \
635
+ --manual-server-list ./servers.json \
636
+ --pem-paths ~/.ssh/target.pem \
637
+ --runtime-snapshot
638
+ ```
639
+
640
+ 수동 목록 + ProxyJump 예시:
641
+
642
+ ```bash
643
+ mcp-aws-manager discover \
644
+ --manual-server-list ./servers.json \
645
+ --pem-paths ~/.ssh/target.pem \
646
+ --ssh-proxy-jump ec2-user@bastion.example.com \
647
+ --runtime-snapshot
648
+ ```
649
+
650
+ 수동 목록 + Bastion 키 분리 예시:
651
+
652
+ ```bash
653
+ mcp-aws-manager discover \
654
+ --manual-server-list ./servers.json \
655
+ --pem-paths ~/.ssh/target.pem \
656
+ --ssh-bastion-host bastion.example.com \
657
+ --ssh-bastion-user ec2-user \
658
+ --ssh-bastion-port 22 \
659
+ --ssh-bastion-pem-path ~/.ssh/bastion.pem \
660
+ --runtime-snapshot
661
+ ```
662
+
663
+ 수동 서버 JSON 필드(호스트별 선택):
664
+
665
+ - `host`/`publicIp`/`privateIp`/`publicDns`
666
+ - `sshUser`, `sshPort`, `pemPath`
667
+ - `proxyJump` 또는 `sshProxyJump`
668
+ - `bastionHost`, `bastionUser`, `bastionPort`, `bastionPemPath`
669
+
670
+ 접근 경로 관련 주요 ACTION_REQUIRED:
671
+
672
+ - `MANUAL_SERVER_HOST_REQUIRED`
673
+ - `PEM_MAPPING_REQUIRED`
674
+ - `BASTION_PEM_KEY_NOT_FOUND`
675
+ - `SSH_AUTH_OR_CONNECT_FAILED`
676
+
677
+ </details>
678
+
679
+ <details>
680
+ <summary>Integration Connector 관리 (No-Code)</summary>
681
+
682
+ 기본 상태 파일:
683
+
684
+ - `~/.mcp-aws-manager/integrations.json`
83
685
 
84
686
  조회:
85
687
 
86
- - `discover_ec2_with_ssm`
87
- - `mcp_aws_discover_cli_help`
688
+ ```bash
689
+ mcp-aws-manager integration list
690
+ mcp-aws-manager integration show
691
+ ```
692
+
693
+ 설정 + 활성화:
694
+
695
+ ```bash
696
+ mcp-aws-manager integration configure pagerduty --set routingKey=XXXX --enable
697
+ ```
698
+
699
+ 정책 팩:
700
+
701
+ ```bash
702
+ mcp-aws-manager integration policy show
703
+ mcp-aws-manager integration policy set strict_change
704
+ ```
705
+
706
+ 진단:
707
+
708
+ ```bash
709
+ mcp-aws-manager integration doctor
710
+ mcp-aws-manager integration doctor --check-live --timeout-ms 8000
711
+ ```
88
712
 
89
- 변경:
713
+ discover 시 오버라이드:
714
+
715
+ - `--integration-config <path>`
716
+ - `--integration-timeout-ms <n>`
717
+ - `--policy-pack <balanced|strict_change|readonly_only>`
718
+ - `--policy-override`
719
+
720
+ </details>
721
+
722
+ <details>
723
+ <summary>Discover 옵션 레퍼런스</summary>
724
+
725
+ - `--profiles <a,b,c>`
726
+ - `--regions <a,b,c>`
727
+ - `--profile-shard <index/total>`
728
+ - `--region-shard <index/total>`
729
+ - `--org-role-name <role-name>`
730
+ - `--org-account-ids <a,b,c>`
731
+ - `--org-include-all-accounts`
732
+ - `--org-max-accounts <n>`
733
+ - `--instance-ids <id1,id2>`
734
+ - `--include-lambda`
735
+ - `--include-ec2` / `--no-ec2`
736
+ - `--include-alb` / `--no-include-alb`
737
+ - `--include-asg` / `--no-include-asg`
738
+ - `--include-rds` / `--no-include-rds`
739
+ - `--include-elasticache` / `--no-include-elasticache`
740
+ - `--include-route53` / `--no-include-route53`
741
+ - `--include-vpc` / `--no-include-vpc`
742
+ - `--include-ecs` / `--no-include-ecs`
743
+ - `--include-s3` / `--no-include-s3`
744
+ - `--include-iam` / `--no-include-iam`
745
+ - `--include-kms` / `--no-include-kms`
746
+ - `--include-cloudwatch` / `--no-include-cloudwatch`
747
+ - `--include-cloudtrail` / `--no-include-cloudtrail`
748
+ - `--include-config` / `--no-include-config`
749
+ - `--include-secrets` / `--no-include-secrets`
750
+ - `--include-parameter-store` / `--no-include-parameter-store`
751
+ - `--include-ecr` / `--no-include-ecr`
752
+ - `--include-dynamodb` / `--no-include-dynamodb`
753
+ - `--include-sns` / `--no-include-sns`
754
+ - `--include-eventbridge` / `--no-include-eventbridge`
755
+ - `--include-sqs` / `--no-include-sqs`
756
+ - `--include-acm` / `--no-include-acm`
757
+ - `--include-kinesis` / `--no-include-kinesis`
758
+ - `--include-msk` / `--no-include-msk`
759
+ - `--include-budgets` / `--no-include-budgets`
760
+ - `--include-cost-anomaly` / `--no-include-cost-anomaly`
761
+ - `--include-ebs` / `--no-include-ebs`
762
+ - `--include-efs` / `--no-include-efs`
763
+ - `--include-eks` / `--no-include-eks`
764
+ - `--include-apigateway` / `--no-include-apigateway`
765
+ - `--include-apigatewayv2` / `--no-include-apigatewayv2`
766
+ - `--include-cloudfront` / `--no-include-cloudfront`
767
+ - `--include-waf` / `--no-include-waf`
768
+ - `--include-shield` / `--no-include-shield`
769
+ - `--include-step-functions` / `--no-include-step-functions`
770
+ - `--include-cloudwatch-logs` / `--no-include-cloudwatch-logs`
771
+ - `--include-xray` / `--no-include-xray`
772
+ - `--include-inspector2` / `--no-include-inspector2`
773
+ - `--include-redshift` / `--no-include-redshift`
774
+ - `--include-opensearch` / `--no-include-opensearch`
775
+ - `--include-organizations` / `--no-include-organizations`
776
+ - `--include-controltower` / `--no-include-controltower`
777
+ - `--include-iac` / `--no-include-iac`
778
+ - `--include-cicd` / `--no-include-cicd`
779
+ - `--include-backup-dr` / `--no-include-backup-dr`
780
+ - `--include-security` / `--no-include-security`
781
+ - `--include-finops` / `--no-include-finops`
782
+ - `--include-application` / `--no-include-application`
783
+ - `--include-incident` / `--no-include-incident`
784
+ - `--incident-force-escalate`
785
+ - `--mode <auto|observe|change|incident>`
786
+ - `--schema-tier <auto|basic|advanced>`
787
+ - `--auth-mode <auto|profile|web-identity>`
788
+ - `--web-identity-role-arn <arn>`
789
+ - `--web-identity-token-file <path>`
790
+ - `--web-identity-session-name <name>`
791
+ - `--user-confirmation <yes|no>`
792
+ - `--enterprise-policy <path>`
793
+ - `--approval-ticket <id>`
794
+ - `--change-reason <text>`
795
+ - `--policy-pack <balanced|strict_change|readonly_only>`
796
+ - `--policy-override`
797
+ - `--integration-config <path>`
798
+ - `--integration-timeout-ms <n>`
799
+ - `--public-only`
800
+ - `--managed-only`
801
+ - `--auto-remediate-ssm`
802
+ - `--ssm-instance-profile-name <name>` / `--ssm-instance-profile-arn <arn>`
803
+ - `--allow-replace-profile`
804
+ - `--runtime-snapshot` / `--no-runtime-snapshot`
805
+ - `--snapshot-profile <quick|standard|deep>`
806
+ - `--output-profile <operator|audit|exec|finops|incident|compact|auditable>`
807
+ - `--sections <overview,inventory,runtime,application,iac,cicd,backupDr,security,finops,incident,actions,governance>`
808
+ - `--include-fields <a,b,c>`
809
+ - `--exclude-fields <a,b,c>`
810
+ - `--client-profile <codex|claude|cursor|operator>`
811
+ - `--renderer-template <default|compact>`
812
+ - `--snapshot-timeout <seconds>`
813
+ - `--snapshot-concurrency <n>`
814
+ - `--snapshot-max-kb <n>`
815
+ - `--manual-server-list <path>` (JSON/CSV)
816
+ - `--pem-paths <a,b,c>`
817
+ - `--ssh-user <name>`
818
+ - `--ssh-port <port>`
819
+ - `--ssh-connect-timeout <seconds>`
820
+ - `--ssh-proxy-jump <user@host[:port][,hop2...]>`
821
+ - `--ssh-bastion-host <host>`
822
+ - `--ssh-bastion-user <user>`
823
+ - `--ssh-bastion-port <port>`
824
+ - `--ssh-bastion-pem-path <path>`
825
+ - `--html-out <path>` (기본: 자동 경로, workspace/home `aws-inventory.html`)
826
+ - `--topology-out <path>` (기본: 자동 경로, workspace/home `aws-topology.json`)
827
+ - `--relationships-out <path>` (기본: 자동 경로, workspace/home `aws-relationships.json`)
828
+ - `--governance-log <path>` (기본: 자동 경로, workspace/home `mcp-aws-governance-log.jsonl`)
829
+ - `--verify-governance-chain` / `--no-verify-governance-chain`
830
+ - `--incident-webhook-url <url>`
831
+ - `--incident-webhook-timeout-ms <n>`
832
+ - `--incident-webhook-auth-header <name>`
833
+ - `--incident-webhook-token <token>`
834
+ - `--incident-out <path>`
835
+ - `--open-html` (기본 on)
836
+ - `--no-open-html` (자동 오픈 off)
837
+ - `--auto-sso-login` / `--no-auto-sso-login`
838
+ - `--format <json|csv|markdown|html>`
839
+ - `--out <path>`
840
+
841
+ </details>
842
+
843
+ 거버넌스 체인 검증 명령:
90
844
 
91
- - `ec2_start_instances`
92
- - `ec2_stop_instances`
93
- - `ec2_reboot_instances`
94
- - `ec2_apply_instance_profile`
845
+ ```bash
846
+ mcp-aws-manager governance verify --governance-log ./mcp-aws-governance-log.jsonl --strict
847
+ ```
95
848
 
96
- 예시:
849
+ ## 클라이언트 스모크 자동화
97
850
 
98
- - `ec2_start_instances`: `{ "profile": "default", "region": "ap-southeast-1", "instanceIds": ["i-123"] }`
99
- - `ec2_apply_instance_profile`: `{ "profile": "default", "region": "ap-southeast-1", "instanceId": "i-123", "instanceProfileName": "my-ssm-profile", "allowReplaceProfile": true }`
851
+ 클라이언트별 스모크 체크:
100
852
 
101
- ## 자주 쓰는 ACTION_REQUIRED
853
+ ```bash
854
+ npm run smoke:clients
855
+ npm run smoke:clients:strict
856
+ node scripts/smoke-clients.js --clients codex,claude --json-out ./smoke-report.json
857
+ ```
102
858
 
103
- - 인증: `SSO_LOGIN_NEEDED`, `AWS_CREDENTIALS_REQUIRED`
104
- - 권한: `IAM_PERMISSION_REQUIRED`, `AWS_OPERATION_FAILED`
105
- - SSM/런타임: `SSM_ROLE_OR_AGENT_REQUIRED`, `SSM_RUNCOMMAND_PERMISSION_REQUIRED`
106
- - 수동 모드: `MANUAL_SERVER_LIST_EMPTY`, `MANUAL_SERVER_HOST_REQUIRED`, `PEM_KEY_NOT_FOUND`, `PEM_MAPPING_REQUIRED`, `SSH_CLIENT_NOT_FOUND`
859
+ - 기본 모드: 상태를 리포트하고 종료코드 `0`
860
+ - `--strict`: 선택한 클라이언트 중 하나라도 비정상이면 non-zero 종료
107
861
 
108
- ## 한국어 관련 문서
862
+ ## AWS E2E 시나리오 자동화
109
863
 
110
- - `MCP_CLIENT_SETUP_KO.md`
111
- - `AWS_SSO_SETUP_GUIDE_KO.md`
864
+ 실계정 시나리오(권한/리전/복구 경로) 점검:
112
865
 
113
- ## 원문(영문) 문서
866
+ ```bash
867
+ npm run e2e:aws -- --profile default --region us-east-1 --out-dir ./.e2e-aws
868
+ npm run e2e:aws:strict -- --profile default --region us-east-1
869
+ ```
114
870
 
115
- - `README.md`
116
- - `MCP_CLIENT_SETUP.md`
117
- - `AWS_SSO_SETUP_GUIDE.md`
871
+ E2E 러너 검증 항목:
872
+
873
+ - 기본 관찰(observe) 흐름(JSON 계약 + `rawNormalized`)
874
+ - 잘못된 리전 입력 처리 경로
875
+ - mutable discover 확인 게이트(`CHANGE_CONFIRMATION_REQUIRED`)
876
+ - 확인 승인 경로(`--user-confirmation yes`)
877
+ - 강제 incident 에스컬레이션 페이로드 산출물(`INCIDENT_ESCALATION_RECOMMENDED`)
878
+ - 엔터프라이즈 정책 승인 티켓 게이트(`APPROVAL_TICKET_REQUIRED`)
879
+ - 거버넌스 해시 체인 검증(`governance verify --strict`)
880
+
881
+ <details>
882
+ <summary>권한 체크리스트</summary>
883
+
884
+ 활성화한 기능에 따라 최소 권한이 달라집니다.
885
+
886
+ - Core inventory: `ec2:DescribeRegions`, `ec2:DescribeInstances`
887
+ - Lambda: `lambda:ListFunctions`
888
+ - ALB/TargetGroups: `elasticloadbalancing:DescribeLoadBalancers`, `elasticloadbalancing:DescribeTargetGroups`
889
+ - ASG: `autoscaling:DescribeAutoScalingGroups`
890
+ - RDS: `rds:DescribeDBInstances`
891
+ - ElastiCache: `elasticache:DescribeCacheClusters`
892
+ - Route53: `route53:ListHostedZones`, `route53:ListResourceRecordSets`
893
+ - VPC/Subnet/SecurityGroup: `ec2:DescribeVpcs`, `ec2:DescribeSubnets`, `ec2:DescribeSecurityGroups`
894
+ - ECS: `ecs:ListClusters`, `ecs:DescribeClusters`, `ecs:ListServices`, `ecs:DescribeServices`
895
+ - S3: `s3:ListAllMyBuckets`, `s3:GetBucketLocation`
896
+ - IAM: `iam:ListRoles`
897
+ - KMS: `kms:ListKeys`, `kms:DescribeKey`
898
+ - ACM: `acm:ListCertificates`, `acm:DescribeCertificate`
899
+ - Kinesis: `kinesis:ListStreams`, `kinesis:DescribeStreamSummary`
900
+ - MSK: `kafka:ListClustersV2`
901
+ - CloudWatch: `cloudwatch:DescribeAlarms`
902
+ - EBS: `ec2:DescribeVolumes`
903
+ - EFS: `elasticfilesystem:DescribeFileSystems`
904
+ - EKS: `eks:ListClusters`, `eks:DescribeCluster`
905
+ - API Gateway: `apigateway:GET`
906
+ - CloudFront: `cloudfront:ListDistributions`
907
+ - WAFv2: `wafv2:ListWebACLs`
908
+ - Shield: `shield:ListProtections`
909
+ - Step Functions: `states:ListStateMachines`
910
+ - CloudWatch Logs: `logs:DescribeLogGroups`
911
+ - X-Ray: `xray:GetGroups`
912
+ - Inspector2: `inspector2:ListFindings`
913
+ - Redshift: `redshift:DescribeClusters`
914
+ - OpenSearch: `es:ListDomainNames`, `es:DescribeDomain`
915
+ - Organizations: `organizations:ListAccounts`
916
+ - ControlTower: `controltower:ListLandingZones`
917
+ - CI/CD 분석 확장: `codepipeline:ListPipelines`, `codepipeline:ListPipelineExecutions`, `codebuild:ListProjects`, `codebuild:ListBuildsForProject`, `codebuild:BatchGetBuilds`, `codedeploy:ListApplications`, `codedeploy:ListDeploymentGroups`, `codedeploy:ListDeployments`, `codedeploy:BatchGetDeployments`
918
+ - 보안 분석 확장: `config:DescribeConfigRules`, `config:DescribeComplianceByConfigRule`, `acm:ListCertificates`, `acm:DescribeCertificate`
919
+ - FinOps 분석 확장: `ce:GetSavingsPlansUtilization`, `ce:GetReservationCoverage`
920
+ - Runtime snapshot: `ssm:SendCommand`, `ssm:GetCommandInvocation`, `ssm:DescribeInstanceInformation`
921
+ - Auto-remediation: `ec2:AssociateIamInstanceProfile`, optional `ec2:ReplaceIamInstanceProfileAssociation`, `iam:PassRole`
922
+ - Mutate 도구 확장:
923
+ - ECS: `ecs:DescribeServices`, `ecs:UpdateService`
924
+ - ASG: `autoscaling:SetDesiredCapacity`
925
+ - RDS: `rds:StartDBInstance`, `rds:StopDBInstance`, `rds:RebootDBInstance`
926
+ - EKS: `eks:DescribeNodegroup`, `eks:UpdateNodegroupConfig`
927
+ - Organizations fan-out(옵션): `organizations:ListAccounts`, `sts:AssumeRole`(대상 계정 role trust 필요)
928
+
929
+ 수동 모드:
930
+
931
+ - 인벤토리는 사용자 제공 서버 목록 파일 사용(AWS API 불필요)
932
+ - 런타임 스냅샷은 직접 PEM SSH와 ProxyJump/Bastion 라우팅(`--ssh-proxy-jump`, `--ssh-bastion-*`)을 지원
933
+
934
+ </details>
935
+
936
+ ## 관련 문서
937
+
938
+ 문서 상태:
939
+ - Canonical(구현과 동기화 필수): `README.md`, `RESPONSE_COMPATIBILITY_POLICY.md`
940
+ - Reference(상세/비교 참고): `IMPLEMENTATION_INTEGRATIONS.md`, `MCP_DIFFERENTIATION.md`, `MCP_DIFFERENTIATION_KO.md`, `AGENT_WORKING_CONTEXT_KO.md`, `RECORDS_FIELD_REFERENCE_KO.md`
941
+
942
+ - `README_KO.md`: 한국어 개요/빠른 시작
943
+ - `IMPLEMENTATION_INTEGRATIONS.md`: API/CLI 연동 인벤토리
944
+ - `MCP_DIFFERENTIATION.md`: AWS MCP 대안 대비 차별점
945
+ - `MCP_DIFFERENTIATION_KO.md`: 한국어 차별화/선택 가이드
946
+ - `AGENT_WORKING_CONTEXT_KO.md`: 에이전트 협업 시 불변 원칙/작업 루프/operationId 빠른 참조
947
+ - `RECORDS_FIELD_REFERENCE_KO.md`: `records[]` 전수 필드(292개) 레퍼런스
948
+ - `RESPONSE_COMPATIBILITY_POLICY.md`: 응답 스키마/버전 호환 정책
949
+ - `schemas/mcp-tool-response.schema.json`: 표준 도구 응답 JSON 스키마
950
+
951
+