mcp-aws-manager 0.3.9 → 0.4.1

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.md CHANGED
@@ -1,4 +1,4 @@
1
- # mcp-aws-manager
1
+ # mcp-aws-manager
2
2
 
3
3
  AWS operations CLI + MCP stdio server (SSM-first).
4
4
 
@@ -15,37 +15,118 @@ mcp-aws-manager discover --profiles default --no-progress
15
15
 
16
16
  ## What It Does
17
17
 
18
- - Multi-service inventory: EC2, Lambda, ALB/NLB, ASG, RDS, ElastiCache, Route53
18
+ - Multi-service inventory: 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
19
  - SSM state visibility: managed/online status
20
+ - Domain analysis pipeline: IaC drift, CI/CD signals, backup/DR posture, security posture, FinOps cost signals, application layer health, incident severity recommendation
20
21
  - Optional runtime snapshot and SSM remediation
21
- - Manual fallback mode: JSON/CSV server list + PEM SSH runtime snapshot (when AWS auth is unavailable)
22
+ - Mutate surface extension: EC2 + ECS + ASG + RDS + EKS controlled change tools
23
+ - Policy-aware routing: mode/surface/schema-tier selection for safer defaults
24
+ - Multi-account scaling controls: Organizations AssumeRole fan-out + profile/region sharding
25
+ - Manual fallback mode: JSON/CSV server list + PEM SSH/ProxyJump/Bastion runtime snapshot (when AWS auth is unavailable)
22
26
  - Human-in-the-loop retry flow via `ACTION_REQUIRED`
23
27
  - Internal-only execution path (AWS SDK + AWS CLI)
28
+ - Presentation layer controls: output profile presets, section/field projection, and client-aware default layout
29
+ - Persistent governance log + topology/relationship JSON artifacts
30
+ - Optional incident escalation webhook dispatch with local incident payload artifact
31
+
32
+ ## When To Use This Project
33
+
34
+ Use `mcp-aws-manager` when you need an operations workflow MCP, not just generic AWS API access.
35
+
36
+ - Choose this project for deterministic inventory/runtime/remediation loops.
37
+ - Choose this project when `ACTION_REQUIRED` guidance and operator artifacts are required.
38
+ - For broad ad-hoc AWS API control only, an umbrella API-style AWS MCP may be enough.
39
+
40
+ See detailed comparison and product boundaries in:
41
+
42
+ - `docs/MCP_DIFFERENTIATION.md`
43
+
44
+ ## Quick Comparison
45
+
46
+ | Selection Point | `mcp-aws-manager` | Umbrella API-style AWS MCP |
47
+ |---|---|---|
48
+ | Primary goal | Deterministic operations workflow (inventory/runtime/remediation) | Broad ad-hoc API/tool access |
49
+ | Tool exposure model | Fixed gateway 3-tool (`capabilities_summary`, `capabilities_detail`, `gateway_execute`) | Many direct service/action tools |
50
+ | Change safety | Built-in confirmation/policy gates for mutate paths | Depends on each tool/server policy |
51
+ | Response contract | Normalized (`ok/summary/records/requiredActions/meta`) | Varies by implementation |
52
+ | Best fit | Reproducible ops loops with operator guidance | Exploratory or wide API probing |
53
+
54
+ For full rationale and boundaries, see `docs/MCP_DIFFERENTIATION.md` and `docs/MCP_DIFFERENTIATION_KO.md`.
24
55
 
25
56
  ## API Coverage Snapshot
26
57
 
27
58
  - AWS API total: no fixed official single number, but the action surface is on the order of tens of thousands across services (and continuously expanding).
28
59
  - Current implementation scope is not "all AWS APIs".
29
- - AWS SDK service clients used: `9`
30
- - AWS SDK operation calls used: `20`
60
+ - AWS SDK service clients used: `49`
61
+ - AWS SDK operation calls used: `95`
31
62
  - AWS CLI commands used: `1` (`aws sso login --profile <profile>`)
63
+ - Note: enterprise controls (policy gate/rollback/governance verification) remain in place while inventory coverage has been expanded.
32
64
 
33
- Current 20 AWS SDK operations:
65
+ Current 95 AWS SDK operations:
34
66
 
35
67
  - STS: `GetCallerIdentity`
36
- - EC2: `DescribeRegions`, `DescribeInstances`, `StartInstances`, `StopInstances`, `RebootInstances`, `DescribeIamInstanceProfileAssociations`, `AssociateIamInstanceProfile`, `ReplaceIamInstanceProfileAssociation`
37
- - SSM: `DescribeInstanceInformation`, `SendCommand`, `GetCommandInvocation`
68
+ - EC2: `DescribeRegions`, `DescribeInstances`, `DescribeVpcs`, `DescribeSubnets`, `DescribeSecurityGroups`, `StartInstances`, `StopInstances`, `RebootInstances`, `DescribeIamInstanceProfileAssociations`, `AssociateIamInstanceProfile`, `ReplaceIamInstanceProfileAssociation`
69
+ - SSM: `DescribeInstanceInformation`, `DescribeParameters`, `SendCommand`, `GetCommandInvocation`
38
70
  - Lambda: `ListFunctions`
39
71
  - ELBv2: `DescribeLoadBalancers`, `DescribeTargetGroups`
40
- - Auto Scaling: `DescribeAutoScalingGroups`
41
- - RDS: `DescribeDBInstances`
72
+ - Auto Scaling: `DescribeAutoScalingGroups`, `SetDesiredCapacity`
73
+ - RDS: `DescribeDBInstances`, `StartDBInstance`, `StopDBInstance`, `RebootDBInstance`
42
74
  - ElastiCache: `DescribeCacheClusters`
43
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`
44
117
 
45
118
  ## Binaries
46
119
 
47
120
  - CLI: `mcp-aws-manager`
48
- - MCP stdio server: `mcp-aws-manager-mcp`
121
+ - MCP stdio server (single-entry; default: `--surface all`): `mcp-aws-manager-mcp`
122
+
123
+ `mcp-aws-manager-mcp` uses gateway routing with selectable surface scope:
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
+ ```
49
130
 
50
131
  ## Agent-Assisted First-Time Setup
51
132
 
@@ -58,6 +139,23 @@ npm.cmd install -g mcp-aws-manager@latest
58
139
  mcp-aws-manager
59
140
  ```
60
141
 
142
+ Bootstrap registers the default single MCP server for detected clients:
143
+
144
+ - `mcp-aws-manager` (single-entry, `--surface all`)
145
+ - Runtime command is auto-resolved for host stability.
146
+ - Windows priority: absolute `mcp-aws-manager-mcp.cmd`
147
+ - macOS/Linux priority: absolute `mcp-aws-manager-mcp` binary
148
+ - Fallback: `node <installed-package>/bin/mcp-aws-manager-mcp.js`
149
+ - Last fallback (ephemeral npx context): pinned `npx -y -p mcp-aws-manager@<version> mcp-aws-manager-mcp`
150
+
151
+ Optional explicit registration:
152
+
153
+ ```bash
154
+ mcp-aws-manager setup
155
+ mcp-aws-manager setup --clients codex,claude
156
+ mcp-aws-manager setup --clients cursor,windsurf,antigravity
157
+ ```
158
+
61
159
  2. Health check:
62
160
 
63
161
  ```bash
@@ -97,6 +195,17 @@ GUI report is generated by default (auto path: workspace/home `aws-inventory.htm
97
195
  mcp-aws-manager discover --profiles default --no-progress
98
196
  ```
99
197
 
198
+ GUI includes:
199
+ - summary cards (records/services/profiles/regions/EC2/SSM/public-IP/issues)
200
+ - tab view (`Report`, `Diagrams`, `Evidence`, `Inventory`)
201
+ - detailed markdown report (`report.md`) with per-resource-type sections
202
+ - topology diagram (Profile -> Region -> Type -> Resource)
203
+ - relationship diagram (DNS / TargetGroup-ALB / ASG heuristic links)
204
+ - focused server/resource selector with per-resource detail and focused relation diagram (`focus.svg`)
205
+ - evidence view and export (`evidence.json`)
206
+ - diagram export (`diagram.drawio`, `topology.svg`, `relationship.svg`)
207
+ - downloaded artifacts include generation timestamp in filename (for example `report-20260304-113000.md`)
208
+
100
209
  Custom path / open behavior:
101
210
 
102
211
  ```bash
@@ -105,6 +214,69 @@ mcp-aws-manager discover --profiles default --html-out ./inventory.html --open-h
105
214
 
106
215
  By default, HTML open is enabled. Use `--no-open-html` to disable.
107
216
 
217
+ ### Manual MCP Client Configuration (Fallback)
218
+
219
+ Use this only when automatic `bootstrap/setup` registration is unavailable.
220
+
221
+ 1) Local repository (development):
222
+
223
+ ```json
224
+ {
225
+ "mcpServers": {
226
+ "mcp-aws-manager": {
227
+ "command": "node",
228
+ "args": [
229
+ "<repo>/bin/mcp-aws-manager-mcp.js",
230
+ "--surface",
231
+ "all"
232
+ ],
233
+ "cwd": "<repo>"
234
+ }
235
+ }
236
+ }
237
+ ```
238
+
239
+ 2) Global npm install (manual fallback):
240
+
241
+ Windows (recommended):
242
+
243
+ ```json
244
+ {
245
+ "mcpServers": {
246
+ "mcp-aws-manager": {
247
+ "command": "C:\\Users\\<user>\\AppData\\Roaming\\npm\\mcp-aws-manager-mcp.cmd",
248
+ "args": ["--surface", "all"]
249
+ }
250
+ }
251
+ }
252
+ ```
253
+
254
+ macOS/Linux:
255
+
256
+ ```json
257
+ {
258
+ "mcpServers": {
259
+ "mcp-aws-manager": {
260
+ "command": "mcp-aws-manager-mcp",
261
+ "args": ["--surface", "all"]
262
+ }
263
+ }
264
+ }
265
+ ```
266
+
267
+ 3) `npx` (without global install):
268
+
269
+ ```json
270
+ {
271
+ "mcpServers": {
272
+ "mcp-aws-manager": {
273
+ "command": "npx",
274
+ "args": ["-y", "-p", "mcp-aws-manager", "mcp-aws-manager-mcp", "--surface", "all"]
275
+ }
276
+ }
277
+ }
278
+ ```
279
+
108
280
  ## User Confirmation Required
109
281
 
110
282
  These are normally the only manual steps (agent-guided):
@@ -113,29 +285,67 @@ These are normally the only manual steps (agent-guided):
113
285
  - IAM permission approval in organization account
114
286
  - For EC2 runtime visibility: attach `AmazonSSMManagedInstanceCore` and keep SSM Agent/network healthy
115
287
 
288
+ Agent retry loop (recommended):
289
+
290
+ 1. Execute tool call.
291
+ 2. If `requiresUserAction=false`, summarize and finish.
292
+ 3. If `requiresUserAction=true`, present one `requiredActions[]` item and ask user to complete it.
293
+ 4. When user confirms completion, retry using `guidance.retryTool` + `guidance.retryArgs`.
294
+ 5. Repeat until `requiresUserAction=false`.
295
+
116
296
  ## MCP Tool Usage
117
297
 
118
- Run MCP server:
298
+ Run single-entry MCP server (default: `--surface all`):
119
299
 
120
300
  ```bash
121
301
  mcp-aws-manager-mcp
122
302
  ```
123
303
 
124
- Exposed MCP tools:
304
+ Choose exposure profile:
305
+
306
+ - `mcp-aws-manager-mcp --surface all|readonly|mutate` (gateway-only)
307
+
308
+ Gateway model (`tools/list`) exposes exactly 3 tools:
309
+
310
+ - `capabilities_summary`
311
+ - `capabilities_detail`
312
+ - `gateway_execute`
313
+
314
+ Gateway call flow:
315
+
316
+ 1. Call `capabilities_summary` to receive operation categories and `operationId` list.
317
+ 2. Call `capabilities_detail` with one `operationId` to inspect execution contract.
318
+ 3. Call `gateway_execute` with `{ "operationId": "...", "args": { ... } }`.
319
+
320
+ Typical `operationId` families:
125
321
 
126
- - `discover_ec2_with_ssm`
127
- - `ec2_start_instances`
128
- - `ec2_stop_instances`
129
- - `ec2_reboot_instances`
130
- - `ec2_apply_instance_profile`
131
- - `mcp_aws_discover_cli_help`
322
+ - Discovery: `discover.aws_inventory_basic`, `discover.aws_inventory_advanced`, `discover.aws_inventory_summary`, `discover.aws_inventory_detail`, `discover.list_bedrock_endpoints`, `discover.list_sagemaker_endpoints`.
323
+ - Mutation: `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`.
324
+ - Governance/System: `governance.verify_chain`, `system.get_server_runtime`, `system.cli_help`.
132
325
 
133
- Mutation tool examples:
326
+ Gateway execute examples:
134
327
 
135
- - `ec2_start_instances`: `{ "profile": "default", "region": "ap-southeast-1", "instanceIds": ["i-123"] }`
136
- - `ec2_stop_instances`: `{ "profile": "default", "region": "ap-southeast-1", "instanceIds": ["i-123"], "force": false }`
137
- - `ec2_reboot_instances`: `{ "profile": "default", "region": "ap-southeast-1", "instanceIds": ["i-123"] }`
138
- - `ec2_apply_instance_profile`: `{ "profile": "default", "region": "ap-southeast-1", "instanceId": "i-123", "instanceProfileName": "my-ssm-profile", "allowReplaceProfile": true }`
328
+ - Discovery summary: `{ "operationId": "discover.aws_inventory_summary", "args": { "profiles": ["default"], "regions": ["ap-southeast-1"] } }`
329
+ - Discovery detail: `{ "operationId": "discover.aws_inventory_detail", "args": { "profiles": ["default"], "regions": ["ap-southeast-1"], "resourceTypes": ["ec2"], "limit": 50 } }`
330
+ - AI/ML read: `{ "operationId": "discover.list_bedrock_endpoints", "args": { "profile": "default", "region": "us-east-1", "metricWindowMinutes": 60 } }`
331
+ - Mutation: `{ "operationId": "mutate.ec2_start_instances", "args": { "profile": "default", "region": "ap-southeast-1", "instanceIds": ["i-123"], "userConfirmation": "yes" } }`
332
+
333
+ Discover operation notes:
334
+
335
+ - `discover.aws_inventory_basic` uses a compact input schema.
336
+ - `discover.aws_inventory_advanced` exposes full inventory/runtime options.
337
+ - `discover.aws_inventory_summary` is summary-first and returns selector hints.
338
+ - `discover.aws_inventory_detail` returns filtered/paged detailed records (`resourceTypes`, `resourceIds`, `offset`, `limit`).
339
+ - Output layout options are supported: `outputProfile`, `sections`, `includeFields`, `excludeFields`, `rendererTemplate`.
340
+ - Routing/control options are supported: `mode`, `schemaTier`, `userConfirmation`, `profileShard`, `regionShard`, `orgRoleName`, `orgAccountIds`, `orgIncludeAllAccounts`, `orgMaxAccounts`, `enterprisePolicyPath`, `approvalTicket`, `changeReason`.
341
+ - Evidence/output artifact options are supported: `topologyOutPath`, `relationshipsOutPath`, `governanceLogPath`, `verifyGovernanceChain`, `incidentWebhookUrl`, `incidentWebhookTimeoutMs`, `incidentWebhookAuthHeader`, `incidentWebhookToken`, `incidentOutPath`.
342
+ - `workingDirectory` is checked against allowlist roots (`cwd`, home, and optional `MCP_AWS_ALLOWED_WORKDIRS`).
343
+ - Structured JSON logs are emitted to stderr; control verbosity with `LOG_LEVEL=error|warn|info|debug` (default: `info`).
344
+
345
+ Runtime introspection:
346
+
347
+ - In gateway mode, use `gateway_execute` with `operationId: "system.get_server_runtime"`.
348
+ - Runtime payload includes current surface, exposed operations/tools, confirmation policy, and response contract metadata.
139
349
 
140
350
  Example tool args:
141
351
 
@@ -143,9 +353,38 @@ Example tool args:
143
353
  {
144
354
  "profiles": ["default"],
145
355
  "regions": ["ap-northeast-2"],
356
+ "profileShard": { "index": 1, "total": 2 },
357
+ "regionShard": { "index": 1, "total": 3 },
358
+ "orgRoleName": "OrganizationAccountAccessRole",
359
+ "orgIncludeAllAccounts": false,
360
+ "orgAccountIds": ["111111111111", "222222222222"],
361
+ "orgMaxAccounts": 25,
146
362
  "includeLambda": true,
363
+ "includeIac": true,
364
+ "includeCicd": true,
365
+ "includeBackupDr": true,
366
+ "includeSecurity": true,
367
+ "includeFinops": true,
368
+ "includeApplication": true,
369
+ "includeIncident": true,
370
+ "mode": "observe",
371
+ "schemaTier": "advanced",
147
372
  "publicOnly": true,
148
373
  "runtimeSnapshot": true,
374
+ "outputProfile": "operator",
375
+ "sections": ["overview", "runtime", "application", "actions"],
376
+ "includeFields": ["resourceType", "resourceId", "state", "ssmOnline", "runtimeSnapshotStatus"],
377
+ "excludeFields": ["runtimeSnapshotOutput"],
378
+ "clientProfile": "codex",
379
+ "rendererTemplate": "compact",
380
+ "userConfirmation": "yes",
381
+ "topologyOutPath": "C:\\tmp\\topology.json",
382
+ "relationshipsOutPath": "C:\\tmp\\relationships.json",
383
+ "governanceLogPath": "C:\\tmp\\governance.jsonl",
384
+ "incidentWebhookUrl": "https://example.com/hooks/oncall",
385
+ "incidentWebhookAuthHeader": "Authorization",
386
+ "incidentWebhookToken": "Bearer ***",
387
+ "incidentOutPath": "C:\\tmp\\incident.json",
149
388
  "htmlOutPath": "C:\\tmp\\inventory.html",
150
389
  "openHtml": true,
151
390
  "manualServerListPath": "C:\\tmp\\servers.csv",
@@ -169,6 +408,42 @@ Common `ACTION_REQUIRED` codes:
169
408
  - `SSM_ROLE_OR_AGENT_REQUIRED`
170
409
  - `INSTANCE_HAS_PROFILE`
171
410
  - `IAM_PROFILE_ASSOCIATION_FAILED`
411
+ - `CHANGE_CONFIRMATION_REQUIRED`
412
+ - `CHANGE_NOT_CONFIRMED`
413
+ - `APPROVAL_TICKET_REQUIRED`
414
+ - `APPROVAL_TICKET_INVALID`
415
+ - `CHANGE_REASON_REQUIRED`
416
+ - `ENTERPRISE_POLICY_NOT_FOUND`
417
+ - `ENTERPRISE_POLICY_INVALID`
418
+ - `ENTERPRISE_POLICY_BLOCKED_ACTION`
419
+ - `ENTERPRISE_POLICY_DISCOVER_REMEDIATION_BLOCKED`
420
+ - `ENTERPRISE_POLICY_BLOCKED_PROFILE`
421
+ - `ENTERPRISE_POLICY_BLOCKED_REGION`
422
+ - `ENTERPRISE_POLICY_BATCH_TOO_LARGE`
423
+ - `INCIDENT_WEBHOOK_DISPATCH_FAILED`
424
+ - `GOVERNANCE_LOG_WRITE_FAILED`
425
+ - `GOVERNANCE_CHAIN_BROKEN`
426
+ - `GOVERNANCE_LOG_NOT_FOUND`
427
+ - `GOVERNANCE_LOG_INVALID_JSON`
428
+ - `GOVERNANCE_CHAIN_HASH_MISMATCH`
429
+ - `GOVERNANCE_CHAIN_PREV_HASH_MISMATCH`
430
+ - `IAC_CLOUDFORMATION_PERMISSION_REQUIRED`
431
+ - `CICD_CODEPIPELINE_PERMISSION_REQUIRED`
432
+ - `CICD_CODEBUILD_PERMISSION_REQUIRED`
433
+ - `CICD_CODEDEPLOY_PERMISSION_REQUIRED`
434
+ - `BACKUP_PERMISSION_REQUIRED`
435
+ - `BACKUP_COVERAGE_REVIEW_REQUIRED`
436
+ - `SECURITY_POSTURE_PERMISSION_REQUIRED`
437
+ - `SECURITY_CONFIG_PERMISSION_REQUIRED`
438
+ - `SECURITY_INSPECTOR2_PERMISSION_REQUIRED`
439
+ - `SECURITY_ACM_PERMISSION_REQUIRED`
440
+ - `SECURITY_ACM_CERT_EXPIRING`
441
+ - `FINOPS_COST_EXPLORER_PERMISSION_REQUIRED`
442
+ - `INCIDENT_ESCALATION_RECOMMENDED`
443
+ - `WORKING_DIRECTORY_INVALID`
444
+ - `WORKING_DIRECTORY_NOT_FOUND`
445
+ - `WORKING_DIRECTORY_NOT_DIRECTORY`
446
+ - `WORKING_DIRECTORY_NOT_ALLOWED`
172
447
  - `SSM_RUNCOMMAND_PERMISSION_REQUIRED`
173
448
  - `LAMBDA_LIST_PERMISSION_REQUIRED`
174
449
  - `ELBV2_LIST_PERMISSION_REQUIRED`
@@ -176,21 +451,86 @@ Common `ACTION_REQUIRED` codes:
176
451
  - `RDS_LIST_PERMISSION_REQUIRED`
177
452
  - `ELASTICACHE_LIST_PERMISSION_REQUIRED`
178
453
  - `ROUTE53_LIST_PERMISSION_REQUIRED`
454
+ - `VPC_LIST_PERMISSION_REQUIRED`
455
+ - `ECS_LIST_PERMISSION_REQUIRED`
456
+ - `S3_LIST_PERMISSION_REQUIRED`
457
+ - `IAM_LIST_PERMISSION_REQUIRED`
458
+ - `KMS_LIST_PERMISSION_REQUIRED`
459
+ - `SNS_LIST_PERMISSION_REQUIRED`
460
+ - `EVENTBRIDGE_LIST_PERMISSION_REQUIRED`
461
+ - `SQS_LIST_PERMISSION_REQUIRED`
462
+ - `ACM_LIST_PERMISSION_REQUIRED`
463
+ - `KINESIS_LIST_PERMISSION_REQUIRED`
464
+ - `MSK_LIST_PERMISSION_REQUIRED`
465
+ - `CLOUDWATCH_LIST_PERMISSION_REQUIRED`
466
+ - `EBS_LIST_PERMISSION_REQUIRED`
467
+ - `EFS_LIST_PERMISSION_REQUIRED`
468
+ - `EKS_LIST_PERMISSION_REQUIRED`
469
+ - `APIGATEWAY_LIST_PERMISSION_REQUIRED`
470
+ - `APIGATEWAYV2_LIST_PERMISSION_REQUIRED`
471
+ - `CLOUDFRONT_LIST_PERMISSION_REQUIRED`
472
+ - `WAF_LIST_PERMISSION_REQUIRED`
473
+ - `SHIELD_LIST_PERMISSION_REQUIRED`
474
+ - `STEPFUNCTIONS_LIST_PERMISSION_REQUIRED`
475
+ - `CLOUDWATCH_LOGS_LIST_PERMISSION_REQUIRED`
476
+ - `XRAY_LIST_PERMISSION_REQUIRED`
477
+ - `INSPECTOR2_LIST_PERMISSION_REQUIRED`
478
+ - `REDSHIFT_LIST_PERMISSION_REQUIRED`
479
+ - `OPENSEARCH_LIST_PERMISSION_REQUIRED`
480
+ - `ORGANIZATIONS_LIST_PERMISSION_REQUIRED`
481
+ - `CONTROLTOWER_LIST_PERMISSION_REQUIRED`
179
482
  - `MANUAL_SERVER_LIST_EMPTY`
180
483
  - `MANUAL_SERVER_HOST_REQUIRED`
484
+ - `WEB_IDENTITY_CONFIG_REQUIRED`
485
+ - `WEB_IDENTITY_TOKEN_FILE_NOT_FOUND`
181
486
  - `PEM_KEY_NOT_FOUND`
487
+ - `BASTION_PEM_KEY_NOT_FOUND`
182
488
  - `PEM_MAPPING_REQUIRED`
183
489
  - `SSH_CLIENT_NOT_FOUND`
184
490
  - `SSH_AUTH_OR_CONNECT_FAILED`
185
491
 
492
+ `ACTION_REQUIRED` metadata includes:
493
+
494
+ - `severity`
495
+ - `owner`
496
+ - `autoFixable`
497
+
498
+ ## Response Contract
499
+
500
+ - Runtime contract fields are included in every tool response:
501
+ - `meta.schemaVersion`
502
+ - `meta.compatibility`
503
+ - `meta.responseType`
504
+ - View envelope (CLI JSON / MCP parsed payload) includes:
505
+ - `outputProfile`
506
+ - `sections`
507
+ - `fields`
508
+ - `view.records`
509
+ - `rawNormalized` (always included for re-processing stability)
510
+ - `schema` / `schemaVersion`
511
+ - Contract schema: `schemas/mcp-tool-response.schema.json`
512
+ - Compatibility policy: `docs/RESPONSE_COMPATIBILITY_POLICY.md`
513
+
186
514
  <details>
187
515
  <summary>Detailed AWS Auth Setup (SSO vs Access Key)</summary>
188
516
 
189
- SSO is recommended because:
517
+ Recommended approach:
518
+
519
+ - `SSO (IAM Identity Center)` for human operators (recommended)
520
+ - `Access Key` only as a local fallback when SSO is unavailable
521
+ - For CI/CD automation, prefer IAM Role/OIDC over long-lived user keys
522
+
523
+ Why SSO is preferred:
524
+
525
+ - Avoids storing long-lived keys on local machines
526
+ - Makes MFA/session-expiry behavior consistent
527
+ - Improves centralized access revocation and auditability
190
528
 
191
- - Avoids long-lived access keys on user machines
192
- - Enforces session-based login and MFA more easily
193
- - Improves centralized revoke/audit handling
529
+ Prerequisites:
530
+
531
+ - AWS CLI v2
532
+ - IAM Identity Center configured in the organization account
533
+ - Target account + permission set assignment completed
194
534
 
195
535
  SSO setup:
196
536
 
@@ -200,13 +540,202 @@ aws sso login --profile default
200
540
  aws sts get-caller-identity --profile default
201
541
  ```
202
542
 
203
- Access key setup (optional):
543
+ Access key setup (fallback):
204
544
 
205
545
  ```bash
206
546
  aws configure --profile default
207
547
  aws sts get-caller-identity --profile default
208
548
  ```
209
549
 
550
+ OIDC/WebIdentity setup (CI/CD or Kubernetes):
551
+
552
+ ```bash
553
+ export AWS_ROLE_ARN=arn:aws:iam::123456789012:role/oidc-workload-role
554
+ export AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
555
+ aws sts get-caller-identity
556
+ ```
557
+
558
+ CLI option equivalent:
559
+
560
+ ```bash
561
+ mcp-aws-manager discover \
562
+ --auth-mode web-identity \
563
+ --web-identity-role-arn arn:aws:iam::123456789012:role/oidc-workload-role \
564
+ --web-identity-token-file /var/run/secrets/eks.amazonaws.com/serviceaccount/token
565
+ ```
566
+
567
+ Quick checks:
568
+
569
+ ```bash
570
+ aws configure list-profiles
571
+ aws configure list --profile default
572
+ aws ec2 describe-regions --profile default
573
+ ```
574
+
575
+ Frequent errors:
576
+
577
+ - `Missing the following required SSO configuration values`
578
+ Re-run `aws configure sso --profile default` and complete all prompts.
579
+ - `Unable to locate credentials`
580
+ SSO session expired or credentials are missing. Run `aws sso login --profile default` or reconfigure access keys.
581
+ - `AccessDenied` / `not authorized`
582
+ The profile is valid, but IAM permission set/policy is insufficient for the requested API.
583
+
584
+ </details>
585
+
586
+ <details>
587
+ <summary>AWS Access Path Setup (Profile / SSO / OIDC WebIdentity)</summary>
588
+
589
+ Auth modes:
590
+
591
+ - `auto` (default): uses profile by default, but can switch to WebIdentity when token+role are provided.
592
+ - `profile`: always uses AWS profile credentials (`fromIni`).
593
+ - `web-identity`: always uses OIDC/WebIdentity token path (`fromTokenFile`).
594
+
595
+ Recommended selection:
596
+
597
+ - Human operator workstation: `profile` + SSO login.
598
+ - CI/CD or Kubernetes workload identity: `web-identity`.
599
+ - Mixed environments: keep `auto` and pass explicit fields when needed.
600
+
601
+ Profile/SSO path:
602
+
603
+ ```bash
604
+ aws configure sso --profile prod-admin
605
+ aws sso login --profile prod-admin
606
+ mcp-aws-manager discover --profiles prod-admin --regions us-east-1 --auth-mode profile
607
+ ```
608
+
609
+ WebIdentity path:
610
+
611
+ ```bash
612
+ export AWS_ROLE_ARN=arn:aws:iam::123456789012:role/oidc-workload-role
613
+ export AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
614
+ mcp-aws-manager discover --auth-mode web-identity --regions us-east-1
615
+ ```
616
+
617
+ Gateway/mutation and AI-read input fields:
618
+
619
+ - `authMode`
620
+ - `webIdentityRoleArn`
621
+ - `webIdentityTokenFile`
622
+ - `webIdentitySessionName` (optional)
623
+
624
+ Input precedence:
625
+
626
+ - explicit tool input/CLI option
627
+ - `MCP_AWS_WEB_IDENTITY_*`
628
+ - `AWS_ROLE_ARN` / `AWS_WEB_IDENTITY_TOKEN_FILE`
629
+
630
+ Common auth-related ACTION_REQUIRED:
631
+
632
+ - `WEB_IDENTITY_CONFIG_REQUIRED`
633
+ - `WEB_IDENTITY_TOKEN_FILE_NOT_FOUND`
634
+ - `AWS_CREDENTIALS_REQUIRED`
635
+
636
+ </details>
637
+
638
+ <details>
639
+ <summary>Server Internal Access Path Setup (SSM / PEM SSH / ProxyJump / Bastion)</summary>
640
+
641
+ Runtime snapshot route selection:
642
+
643
+ - AWS-managed EC2 (`manualInput=false`): SSM RunCommand path.
644
+ - Manual server list (`manualInput=true`): SSH path.
645
+ - SSH path uses:
646
+ - `ssh-pem` (direct key)
647
+ - `ssh-proxyjump` (`--ssh-proxy-jump`)
648
+ - `ssh-bastion` (`--ssh-bastion-*`, internally via ProxyCommand)
649
+
650
+ Manual list + direct PEM example:
651
+
652
+ ```bash
653
+ mcp-aws-manager discover \
654
+ --manual-server-list ./servers.json \
655
+ --pem-paths ~/.ssh/target.pem \
656
+ --runtime-snapshot
657
+ ```
658
+
659
+ Manual list + ProxyJump example:
660
+
661
+ ```bash
662
+ mcp-aws-manager discover \
663
+ --manual-server-list ./servers.json \
664
+ --pem-paths ~/.ssh/target.pem \
665
+ --ssh-proxy-jump ec2-user@bastion.example.com \
666
+ --runtime-snapshot
667
+ ```
668
+
669
+ Manual list + Bastion key split example:
670
+
671
+ ```bash
672
+ mcp-aws-manager discover \
673
+ --manual-server-list ./servers.json \
674
+ --pem-paths ~/.ssh/target.pem \
675
+ --ssh-bastion-host bastion.example.com \
676
+ --ssh-bastion-user ec2-user \
677
+ --ssh-bastion-port 22 \
678
+ --ssh-bastion-pem-path ~/.ssh/bastion.pem \
679
+ --runtime-snapshot
680
+ ```
681
+
682
+ Manual server JSON fields (optional per host):
683
+
684
+ - `host`/`publicIp`/`privateIp`/`publicDns`
685
+ - `sshUser`, `sshPort`, `pemPath`
686
+ - `proxyJump` or `sshProxyJump`
687
+ - `bastionHost`, `bastionUser`, `bastionPort`, `bastionPemPath`
688
+
689
+ Common access-path ACTION_REQUIRED:
690
+
691
+ - `MANUAL_SERVER_HOST_REQUIRED`
692
+ - `PEM_MAPPING_REQUIRED`
693
+ - `BASTION_PEM_KEY_NOT_FOUND`
694
+ - `SSH_AUTH_OR_CONNECT_FAILED`
695
+
696
+ </details>
697
+
698
+ <details>
699
+ <summary>Integration Connector Management (No-Code)</summary>
700
+
701
+ State file default:
702
+
703
+ - `~/.mcp-aws-manager/integrations.json`
704
+
705
+ List/show:
706
+
707
+ ```bash
708
+ mcp-aws-manager integration list
709
+ mcp-aws-manager integration show
710
+ ```
711
+
712
+ Configure + enable:
713
+
714
+ ```bash
715
+ mcp-aws-manager integration configure pagerduty --set routingKey=XXXX --enable
716
+ ```
717
+
718
+ Policy pack:
719
+
720
+ ```bash
721
+ mcp-aws-manager integration policy show
722
+ mcp-aws-manager integration policy set strict_change
723
+ ```
724
+
725
+ Doctor:
726
+
727
+ ```bash
728
+ mcp-aws-manager integration doctor
729
+ mcp-aws-manager integration doctor --check-live --timeout-ms 8000
730
+ ```
731
+
732
+ Discover-time overrides:
733
+
734
+ - `--integration-config <path>`
735
+ - `--integration-timeout-ms <n>`
736
+ - `--policy-pack <balanced|strict_change|readonly_only>`
737
+ - `--policy-override`
738
+
210
739
  </details>
211
740
 
212
741
  <details>
@@ -214,6 +743,12 @@ aws sts get-caller-identity --profile default
214
743
 
215
744
  - `--profiles <a,b,c>`
216
745
  - `--regions <a,b,c>`
746
+ - `--profile-shard <index/total>`
747
+ - `--region-shard <index/total>`
748
+ - `--org-role-name <role-name>`
749
+ - `--org-account-ids <a,b,c>`
750
+ - `--org-include-all-accounts`
751
+ - `--org-max-accounts <n>`
217
752
  - `--instance-ids <id1,id2>`
218
753
  - `--include-lambda`
219
754
  - `--include-ec2` / `--no-ec2`
@@ -222,12 +757,77 @@ aws sts get-caller-identity --profile default
222
757
  - `--include-rds` / `--no-include-rds`
223
758
  - `--include-elasticache` / `--no-include-elasticache`
224
759
  - `--include-route53` / `--no-include-route53`
760
+ - `--include-vpc` / `--no-include-vpc`
761
+ - `--include-ecs` / `--no-include-ecs`
762
+ - `--include-s3` / `--no-include-s3`
763
+ - `--include-iam` / `--no-include-iam`
764
+ - `--include-kms` / `--no-include-kms`
765
+ - `--include-cloudwatch` / `--no-include-cloudwatch`
766
+ - `--include-cloudtrail` / `--no-include-cloudtrail`
767
+ - `--include-config` / `--no-include-config`
768
+ - `--include-secrets` / `--no-include-secrets`
769
+ - `--include-parameter-store` / `--no-include-parameter-store`
770
+ - `--include-ecr` / `--no-include-ecr`
771
+ - `--include-dynamodb` / `--no-include-dynamodb`
772
+ - `--include-sns` / `--no-include-sns`
773
+ - `--include-eventbridge` / `--no-include-eventbridge`
774
+ - `--include-sqs` / `--no-include-sqs`
775
+ - `--include-acm` / `--no-include-acm`
776
+ - `--include-kinesis` / `--no-include-kinesis`
777
+ - `--include-msk` / `--no-include-msk`
778
+ - `--include-budgets` / `--no-include-budgets`
779
+ - `--include-cost-anomaly` / `--no-include-cost-anomaly`
780
+ - `--include-ebs` / `--no-include-ebs`
781
+ - `--include-efs` / `--no-include-efs`
782
+ - `--include-eks` / `--no-include-eks`
783
+ - `--include-apigateway` / `--no-include-apigateway`
784
+ - `--include-apigatewayv2` / `--no-include-apigatewayv2`
785
+ - `--include-cloudfront` / `--no-include-cloudfront`
786
+ - `--include-waf` / `--no-include-waf`
787
+ - `--include-shield` / `--no-include-shield`
788
+ - `--include-step-functions` / `--no-include-step-functions`
789
+ - `--include-cloudwatch-logs` / `--no-include-cloudwatch-logs`
790
+ - `--include-xray` / `--no-include-xray`
791
+ - `--include-inspector2` / `--no-include-inspector2`
792
+ - `--include-redshift` / `--no-include-redshift`
793
+ - `--include-opensearch` / `--no-include-opensearch`
794
+ - `--include-organizations` / `--no-include-organizations`
795
+ - `--include-controltower` / `--no-include-controltower`
796
+ - `--include-iac` / `--no-include-iac`
797
+ - `--include-cicd` / `--no-include-cicd`
798
+ - `--include-backup-dr` / `--no-include-backup-dr`
799
+ - `--include-security` / `--no-include-security`
800
+ - `--include-finops` / `--no-include-finops`
801
+ - `--include-application` / `--no-include-application`
802
+ - `--include-incident` / `--no-include-incident`
803
+ - `--incident-force-escalate`
804
+ - `--mode <auto|observe|change|incident>`
805
+ - `--schema-tier <auto|basic|advanced>`
806
+ - `--auth-mode <auto|profile|web-identity>`
807
+ - `--web-identity-role-arn <arn>`
808
+ - `--web-identity-token-file <path>`
809
+ - `--web-identity-session-name <name>`
810
+ - `--user-confirmation <yes|no>`
811
+ - `--enterprise-policy <path>`
812
+ - `--approval-ticket <id>`
813
+ - `--change-reason <text>`
814
+ - `--policy-pack <balanced|strict_change|readonly_only>`
815
+ - `--policy-override`
816
+ - `--integration-config <path>`
817
+ - `--integration-timeout-ms <n>`
225
818
  - `--public-only`
226
819
  - `--managed-only`
227
820
  - `--auto-remediate-ssm`
228
821
  - `--ssm-instance-profile-name <name>` / `--ssm-instance-profile-arn <arn>`
229
822
  - `--allow-replace-profile`
230
823
  - `--runtime-snapshot` / `--no-runtime-snapshot`
824
+ - `--snapshot-profile <quick|standard|deep>`
825
+ - `--output-profile <operator|audit|exec|finops|incident|compact|auditable>`
826
+ - `--sections <overview,inventory,runtime,application,iac,cicd,backupDr,security,finops,incident,actions,governance>`
827
+ - `--include-fields <a,b,c>`
828
+ - `--exclude-fields <a,b,c>`
829
+ - `--client-profile <codex|claude|cursor|operator>`
830
+ - `--renderer-template <default|compact>`
231
831
  - `--snapshot-timeout <seconds>`
232
832
  - `--snapshot-concurrency <n>`
233
833
  - `--snapshot-max-kb <n>`
@@ -236,15 +836,74 @@ aws sts get-caller-identity --profile default
236
836
  - `--ssh-user <name>`
237
837
  - `--ssh-port <port>`
238
838
  - `--ssh-connect-timeout <seconds>`
839
+ - `--ssh-proxy-jump <user@host[:port][,hop2...]>`
840
+ - `--ssh-bastion-host <host>`
841
+ - `--ssh-bastion-user <user>`
842
+ - `--ssh-bastion-port <port>`
843
+ - `--ssh-bastion-pem-path <path>`
239
844
  - `--html-out <path>` (default: auto path, workspace/home `aws-inventory.html`)
845
+ - `--topology-out <path>` (default: auto path, workspace/home `aws-topology.json`)
846
+ - `--relationships-out <path>` (default: auto path, workspace/home `aws-relationships.json`)
847
+ - `--governance-log <path>` (default: auto path, workspace/home `mcp-aws-governance-log.jsonl`)
848
+ - `--verify-governance-chain` / `--no-verify-governance-chain`
849
+ - `--incident-webhook-url <url>`
850
+ - `--incident-webhook-timeout-ms <n>`
851
+ - `--incident-webhook-auth-header <name>`
852
+ - `--incident-webhook-token <token>`
853
+ - `--incident-out <path>`
240
854
  - `--open-html` (open; default is on)
241
855
  - `--no-open-html` (disable auto-open)
242
856
  - `--auto-sso-login` / `--no-auto-sso-login`
243
- - `--format <json|csv>`
857
+ - `--format <json|csv|markdown|html>`
244
858
  - `--out <path>`
245
859
 
246
860
  </details>
247
861
 
862
+ Governance verification command:
863
+
864
+ ```bash
865
+ mcp-aws-manager governance verify --governance-log ./mcp-aws-governance-log.jsonl --strict
866
+ ```
867
+
868
+ ## Client Smoke Automation
869
+
870
+ Run cross-client smoke checks:
871
+
872
+ ```bash
873
+ npm run smoke:clients
874
+ npm run smoke:clients:strict
875
+ node scripts/smoke-clients.js --clients codex,claude --json-out ./smoke-report.json
876
+ ```
877
+
878
+ - Default mode reports status and exits `0`.
879
+ - `--strict` exits non-zero when any selected client is not healthy.
880
+
881
+ ## AWS E2E Scenario Automation
882
+
883
+ Run real-account scenario checks (permission/region/recovery path):
884
+
885
+ ```bash
886
+ npm run e2e:aws -- --profile default --region us-east-1 --out-dir ./.e2e-aws
887
+ npm run e2e:aws:strict -- --profile default --region us-east-1
888
+ ```
889
+
890
+ Current scenarios include:
891
+
892
+ - baseline observe contract (`schema` + `rawNormalized`)
893
+ - invalid region handling
894
+ - mutable confirmation gate (`missing` / `yes`)
895
+ - incident escalation artifact generation
896
+ - enterprise policy approval-ticket enforcement
897
+ - governance chain verification (`governance verify --strict`)
898
+
899
+ The E2E runner validates:
900
+
901
+ - baseline observe flow (JSON contract + `rawNormalized`)
902
+ - invalid region handling path
903
+ - mutable discover confirmation gate (`CHANGE_CONFIRMATION_REQUIRED`)
904
+ - confirmation-approved path (`--user-confirmation yes`)
905
+ - forced incident escalation payload artifact (`INCIDENT_ESCALATION_RECOMMENDED`)
906
+
248
907
  <details>
249
908
  <summary>Permission Checklist</summary>
250
909
 
@@ -257,22 +916,62 @@ Minimum permissions depend on enabled features.
257
916
  - RDS: `rds:DescribeDBInstances`
258
917
  - ElastiCache: `elasticache:DescribeCacheClusters`
259
918
  - Route53: `route53:ListHostedZones`, `route53:ListResourceRecordSets`
919
+ - VPC/Subnet/SecurityGroup: `ec2:DescribeVpcs`, `ec2:DescribeSubnets`, `ec2:DescribeSecurityGroups`
920
+ - ECS: `ecs:ListClusters`, `ecs:DescribeClusters`, `ecs:ListServices`, `ecs:DescribeServices`
921
+ - S3: `s3:ListAllMyBuckets`, `s3:GetBucketLocation`
922
+ - IAM: `iam:ListRoles`
923
+ - KMS: `kms:ListKeys`, `kms:DescribeKey`
924
+ - ACM: `acm:ListCertificates`, `acm:DescribeCertificate`
925
+ - Kinesis: `kinesis:ListStreams`, `kinesis:DescribeStreamSummary`
926
+ - MSK: `kafka:ListClustersV2`
927
+ - CloudWatch: `cloudwatch:DescribeAlarms`
928
+ - EBS: `ec2:DescribeVolumes`
929
+ - EFS: `elasticfilesystem:DescribeFileSystems`
930
+ - EKS: `eks:ListClusters`, `eks:DescribeCluster`
931
+ - API Gateway: `apigateway:GET`
932
+ - CloudFront: `cloudfront:ListDistributions`
933
+ - WAFv2: `wafv2:ListWebACLs`
934
+ - Shield: `shield:ListProtections`
935
+ - Step Functions: `states:ListStateMachines`
936
+ - CloudWatch Logs: `logs:DescribeLogGroups`
937
+ - X-Ray: `xray:GetGroups`
938
+ - Inspector2: `inspector2:ListFindings`
939
+ - Redshift: `redshift:DescribeClusters`
940
+ - OpenSearch: `es:ListDomainNames`, `es:DescribeDomain`
941
+ - Organizations: `organizations:ListAccounts`
942
+ - ControlTower: `controltower:ListLandingZones`
943
+ - CI/CD analysis: `codepipeline:ListPipelines`, `codepipeline:ListPipelineExecutions`, `codebuild:ListProjects`, `codebuild:ListBuildsForProject`, `codebuild:BatchGetBuilds`, `codedeploy:ListApplications`, `codedeploy:ListDeploymentGroups`, `codedeploy:ListDeployments`, `codedeploy:BatchGetDeployments`
944
+ - Security analysis extension: `config:DescribeConfigRules`, `config:DescribeComplianceByConfigRule`, `acm:ListCertificates`, `acm:DescribeCertificate`
945
+ - FinOps analysis extension: `ce:GetSavingsPlansUtilization`, `ce:GetReservationCoverage`
260
946
  - Runtime snapshot: `ssm:SendCommand`, `ssm:GetCommandInvocation`, `ssm:DescribeInstanceInformation`
261
947
  - Auto-remediation: `ec2:AssociateIamInstanceProfile`, optional `ec2:ReplaceIamInstanceProfileAssociation`, `iam:PassRole`
948
+ - Mutate tool extension:
949
+ - ECS: `ecs:DescribeServices`, `ecs:UpdateService`
950
+ - ASG: `autoscaling:SetDesiredCapacity`
951
+ - RDS: `rds:StartDBInstance`, `rds:StopDBInstance`, `rds:RebootDBInstance`
952
+ - EKS: `eks:DescribeNodegroup`, `eks:UpdateNodegroupConfig`
953
+ - Organizations fan-out (optional): `organizations:ListAccounts`, `sts:AssumeRole` (target account role trust required)
262
954
 
263
955
  Manual fallback mode:
264
956
 
265
957
  - Inventory uses user-provided server list file (no AWS API required)
266
- - Runtime snapshot uses local `ssh` client + PEM key access
958
+ - Runtime snapshot supports direct PEM SSH and ProxyJump/Bastion routing (`--ssh-proxy-jump`, `--ssh-bastion-*`)
267
959
 
268
960
  </details>
269
961
 
270
962
  ## Related Docs
271
963
 
964
+ Document status:
965
+ - Canonical (keep synchronized with implementation): `README.md`, `docs/RESPONSE_COMPATIBILITY_POLICY.md`
966
+ - Reference (detail/positioning): `docs/IMPLEMENTATION_INTEGRATIONS.md`, `docs/MCP_DIFFERENTIATION.md`, `docs/MCP_DIFFERENTIATION_KO.md`, `workflow/AGENT_WORKING_CONTEXT_KO.md`, `docs/RECORDS_FIELD_REFERENCE_KO.md`
967
+
272
968
  - `README_KO.md`: Korean overview and quick start
273
- - `MCP_CLIENT_SETUP_KO.md`: Korean MCP client registration guide
274
- - `AWS_SSO_SETUP_GUIDE_KO.md`: Korean AWS auth setup guide
275
- - `MCP_CLIENT_SETUP.md`: MCP registration and stdio config details
276
- - `AGENT_GUIDANCE_LOOP_TEMPLATE_KO.md`: agent retry/guidance template
277
- - `IMPLEMENTATION_INTEGRATIONS.md`: API/CLI integration inventory
278
- - `MCP_DIFFERENTIATION.md`: differentiation from existing AWS MCP servers
969
+ - `docs/IMPLEMENTATION_INTEGRATIONS.md`: API/CLI integration inventory
970
+ - `docs/MCP_DIFFERENTIATION.md`: differentiation from existing AWS MCP servers
971
+ - `docs/MCP_DIFFERENTIATION_KO.md`: Korean differentiation guide and selection criteria
972
+ - `workflow/AGENT_WORKING_CONTEXT_KO.md`: agent-focused implementation invariants, gateway loop, and operation catalog quick reference
973
+ - `docs/RECORDS_FIELD_REFERENCE_KO.md`: full `records[]` field reference (292 fields)
974
+ - `docs/RESPONSE_COMPATIBILITY_POLICY.md`: response schema/version compatibility rules
975
+ - `schemas/mcp-tool-response.schema.json`: canonical tool response JSON schema
976
+
977
+