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