cloudcostwise 0.1.3__tar.gz → 0.1.4__tar.gz

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.
Files changed (62) hide show
  1. cloudcostwise-0.1.4/PKG-INFO +172 -0
  2. cloudcostwise-0.1.4/README.md +154 -0
  3. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/pyproject.toml +2 -2
  4. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudcostwise/__init__.py +1 -1
  5. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudcostwise/cli.py +1 -1
  6. cloudcostwise-0.1.4/src/cloudcostwise.egg-info/PKG-INFO +172 -0
  7. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/data_providers/online.py +18 -1
  8. cloudcostwise-0.1.3/PKG-INFO +0 -119
  9. cloudcostwise-0.1.3/README.md +0 -101
  10. cloudcostwise-0.1.3/src/cloudcostwise.egg-info/PKG-INFO +0 -119
  11. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/LICENSE.md +0 -0
  12. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/setup.cfg +0 -0
  13. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudcostwise/mcp_server.py +0 -0
  14. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudcostwise/render.py +0 -0
  15. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudcostwise/runtime.py +0 -0
  16. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudcostwise/scan.py +0 -0
  17. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudcostwise.egg-info/SOURCES.txt +0 -0
  18. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudcostwise.egg-info/dependency_links.txt +0 -0
  19. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudcostwise.egg-info/entry_points.txt +0 -0
  20. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudcostwise.egg-info/requires.txt +0 -0
  21. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudcostwise.egg-info/top_level.txt +0 -0
  22. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/__init__.py +0 -0
  23. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/advisory_types.py +0 -0
  24. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/aws_ip_ranges.py +0 -0
  25. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/aws_ip_ranges_snapshot.py +0 -0
  26. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/aws_pricing_service.py +0 -0
  27. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/billed_cost.py +0 -0
  28. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/cache.py +0 -0
  29. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/circuit_breaker.py +0 -0
  30. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/cloudwatch_metrics_service.py +0 -0
  31. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/config.py +0 -0
  32. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/cpu_sizing.py +0 -0
  33. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/credential_cache.py +0 -0
  34. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/data_providers/__init__.py +0 -0
  35. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/data_providers/base.py +0 -0
  36. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/data_providers/missing_data.py +0 -0
  37. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/data_providers/models.py +0 -0
  38. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/data_providers/offline.py +0 -0
  39. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/detectors/__init__.py +0 -0
  40. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/detectors/extended_support.py +0 -0
  41. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/detectors/open/__init__.py +0 -0
  42. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/detectors/open/commitment_cache.py +0 -0
  43. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/detectors/open/compute.py +0 -0
  44. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/detectors/open/database.py +0 -0
  45. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/detectors/open/management.py +0 -0
  46. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/detectors/open/network.py +0 -0
  47. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/detectors/open/optimizer.py +0 -0
  48. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/detectors/open/savings.py +0 -0
  49. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/detectors/open/security.py +0 -0
  50. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/detectors/open/storage.py +0 -0
  51. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/metric_window.py +0 -0
  52. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/metrics.py +0 -0
  53. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/models.py +0 -0
  54. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/open_core_manifest.py +0 -0
  55. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/open_service.py +0 -0
  56. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/ports.py +0 -0
  57. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/py.typed +0 -0
  58. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/savings_cache_service.py +0 -0
  59. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/tier_routing.py +0 -0
  60. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/src/cloudwise_scan_core/waste_detection_service.py +0 -0
  61. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/tests/test_cli.py +0 -0
  62. {cloudcostwise-0.1.3 → cloudcostwise-0.1.4}/tests/test_mcp_server.py +0 -0
@@ -0,0 +1,172 @@
1
+ Metadata-Version: 2.4
2
+ Name: cloudcostwise
3
+ Version: 0.1.4
4
+ Summary: Find AWS waste from your terminal or your AI assistant. Runs locally with your own read-only credentials. Nothing is sent to CloudWise.
5
+ Author: CloudWise
6
+ License: FSL-1.1-ALv2
7
+ Project-URL: Homepage, https://cloudcostwise.io/cli
8
+ Project-URL: Repository, https://github.com/cloudwise-app/cloudcostwise
9
+ Project-URL: Issues, https://github.com/cloudwise-app/cloudcostwise/issues
10
+ Requires-Python: >=3.11
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE.md
13
+ Requires-Dist: boto3>=1.40
14
+ Requires-Dist: mcp<3,>=2.3
15
+ Provides-Extra: test
16
+ Requires-Dist: pytest>=8; extra == "test"
17
+ Dynamic: license-file
18
+
19
+ # cloudcostwise
20
+
21
+ <!-- mcp-name: io.github.cloudwise-app/cloudcostwise -->
22
+
23
+ Find AWS waste from your terminal or your AI assistant. `cloudcostwise` runs CloudWise's open waste
24
+ checks on your own machine, with your own read-only AWS credentials.
25
+
26
+ - **Nothing is sent to CloudWise.** The only network calls are AWS API calls in
27
+ your account. No signup, no IAM role for a third party, no telemetry. Used
28
+ through an AI assistant (MCP), the findings go to that assistant like any
29
+ tool output.
30
+ - **It cannot change anything.** Every AWS call goes through a guard that
31
+ refuses any operation that isn't a `Describe`, `List`, `Get`, `Search` or
32
+ `Lookup`, whatever your credentials allow.
33
+ - **20 of CloudWise's 46 service checks**: EC2, Lambda, SageMaker, WorkSpaces,
34
+ Lightsail, EBS, S3, EFS, ECR, RDS, DynamoDB, ElastiCache, Elastic IPs, NAT
35
+ gateways and load balancers, VPC endpoints, dangling DNS records, CloudWatch
36
+ logs and dashboards, security posture, RI/Savings Plans opportunities, and
37
+ Compute Optimizer.
38
+
39
+ ## Install and run
40
+
41
+ ```bash
42
+ pipx install cloudcostwise # or: uvx cloudcostwise scan
43
+ cloudcostwise scan # us-east-1 plus your profile's region
44
+ cloudcostwise scan --profile prod --regions all
45
+ cloudcostwise scan --format json > waste.json
46
+ ```
47
+
48
+ Options:
49
+
50
+ | Option | Meaning |
51
+ |---|---|
52
+ | `--profile NAME` | AWS profile; otherwise the standard credential chain (env vars, SSO, instance role) |
53
+ | `--regions LIST` | Comma-separated regions, or `all` for every enabled region. Account-level checks (Cost Explorer, Route 53) run once, in us-east-1 |
54
+ | `--format table\|markdown\|json` | Output format |
55
+ | `--no-cost-explorer` | Make no Cost Explorer call. AWS bills those at $0.01 per request and a scan makes about 13. Skips the RI/Savings Plans checks; extended-support surcharges fall back to estimates |
56
+ | `--parallel N` | Regions scanned at once, each in its own process (default 4; `--regions all` takes ~2–3 min instead of ~10) |
57
+ | `--verbose` | Show data warnings (checks that could not read a metric report it as missing, never as zero) |
58
+
59
+ ## What AWS's free tools don't flag
60
+
61
+ <!-- aws-gap:start (generated by scripts/aws_gap.py) -->
62
+ This tool has 42 proven checks (L2 or above in [VALIDATION.md](VALIDATION.md): each fired on a real AWS resource built to trigger it and stayed silent on a healthy twin). **15 of them flag waste that none of AWS's own tools flag**, and 9 more go further than the closest AWS check, going by AWS's lists of what its tools cover ([Trusted Advisor](https://docs.aws.amazon.com/awssupport/latest/user/trusted-advisor-check-reference.html), [Cost Optimization Hub](https://docs.aws.amazon.com/cost-management/latest/userguide/cost-optimization-hub.html), [Compute Optimizer](https://docs.aws.amazon.com/compute-optimizer/latest/ug/supported-resources.html); checked 2026-10-07).
63
+
64
+ | Check | What it finds | Closest AWS check |
65
+ |---|---|---|
66
+ | `ami_orphaned_snapshot` | EBS snapshots left behind by an AMI that was deregistered | None |
67
+ | `classic_lb_migration` | Classic Load Balancers that would cost less as an ALB or NLB | None |
68
+ | `elasticache_engine_migration` | Redis OSS or Memcached clusters that would cost about 20% less on Valkey | None |
69
+ | `elasticache_extended_support_cost` | ElastiCache engine versions billed the Extended Support surcharge | None |
70
+ | `empty_log_group` | CloudWatch log groups that have stored nothing for 30+ days | None |
71
+ | `lambda_arm64_migration` | Lambda functions that would cost about 20% less on arm64 (Graviton) | None |
72
+ | `lambda_provisioned_concurrency_idle` | Lambda provisioned concurrency that is paid for and barely used | None |
73
+ | `lightsail_idle_load_balancer` | Idle Lightsail load balancers | None |
74
+ | `lightsail_unattached_disk` | Lightsail disks attached to nothing | None |
75
+ | `lightsail_unattached_static_ip` | Lightsail static IPs attached to nothing | None |
76
+ | `low_traffic_alb` | Application Load Balancers carrying almost no traffic | None |
77
+ | `multiple_eips_per_instance` | Extra Elastic IPs on one instance, each billed as a public IPv4 address | None |
78
+ | `no_lifecycle_efs` | Large EFS file systems with no Infrequent Access or Archive tiering | None |
79
+ | `previous_gen_sagemaker_instance` | SageMaker instances on a previous generation with a cheaper current one | None |
80
+ | `s3_empty_bucket` | Empty S3 buckets left behind for 30+ days | None |
81
+ | `excessive_retention_log_group` | Log groups keeping a year or more of data they are billed to store | Amazon CloudWatch Log Group Retention Period: Trusted Advisor checks log group retention but flags retention shorter than a minimum (365 days by default) for compliance, so long, costly retention passes it. |
82
+ | `idle_efs` | EFS file systems with no mount targets: nothing can read them, and they still bill | Amazon EFS no mount target redundancy: Trusted Advisor checks EFS mount targets for multi-AZ redundancy, not file systems with no mount targets at all, and EFS is not among the resources Compute Optimizer or Cost Optimization Hub cover. |
83
+ | `idle_load_balancer` | Idle Application and Network Load Balancers | Idle Load Balancers: Trusted Advisor flags idle Classic Load Balancers only (Business Support+ or higher); its documentation says Application and Network Load Balancers are not included. |
84
+ | `lambda_excessive_timeout` | Lambda timeouts set far above what the function needs | AWS Lambda functions with excessive timeouts: Trusted Advisor flags functions where more than 10% of invocations time out; it does not flag a configured timeout set far above the function's real duration. |
85
+ | `no_retention_log_group` | Log groups set to never expire, so they grow every month | Amazon CloudWatch Log Group Retention Period: Trusted Advisor checks log group retention but flags retention below a minimum, so a log group set to never expire passes it. |
86
+ | `old_ecr_images` | Old ECR images still billed for storage | Amazon ECR Repository without lifecycle policy configured: Trusted Advisor checks that an ECR repository has a lifecycle policy; it does not flag the old images already stored. |
87
+ | `oversized_sagemaker_endpoint` | SageMaker endpoints serving traffic on bigger instances than they need | Idle recommendation for SageMaker endpoints: Compute Optimizer flags SageMaker endpoints with zero invocations over 14 days but gives no rightsizing for endpoints that serve traffic on oversized instances. |
88
+ | `s3_wrong_storage_class` | Buckets keeping everything in S3 Standard with no tiering | Amazon S3 Bucket Lifecycle Policy Configured: Trusted Advisor flags buckets with no lifecycle policy but does not look at how much data sits in S3 Standard or suggest Intelligent-Tiering. |
89
+ | `untagged_ecr_images` | Untagged ECR images still billed for storage | Amazon ECR Repository without lifecycle policy configured: Trusted Advisor checks that an ECR repository has a lifecycle policy; it does not flag the untagged images already stored. |
90
+
91
+ For idle EC2, RDS and NAT gateways, rightsizing and Savings Plans, AWS's tools cover the same ground: use them too. Trusted Advisor's cost checks need a Business, Enterprise or Unified Operations support plan; Cost Optimization Hub and Compute Optimizer are free.
92
+
93
+ The hosted CloudWise product adds 14 more proven checks that none of AWS's tools flag, across AWS Backup, AppSync, Elastic Beanstalk, Glue, KMS, Step Functions.
94
+ <!-- aws-gap:end -->
95
+
96
+ A few of them on our test account, where the resources are deliberately tiny
97
+ (which is why the amounts are cents). Excerpt of a scan (0.1.3, us-east-1):
98
+
99
+ ```text
100
+ old_ecr_images x1 $0.06/mo
101
+ us-east-1 cwfx-old-ecr-images $0.06/mo
102
+ untagged_ecr_images x1 $0.02/mo
103
+ us-east-1 cwfx-untagged-ecr-images $0.02/mo
104
+ idle_efs x1 $0.01/mo
105
+ us-east-1 fs-090bfb32bd49de8b7 $0.01/mo
106
+ no_retention_log_group x1 $0.01/mo
107
+ us-east-1 /aws/lambda/cwfx-clo464-docdb-connect $0.01/mo
108
+ ```
109
+
110
+ ## Use it from Claude Code, Codex or any MCP client
111
+
112
+ `cloudcostwise mcp` runs the same scan as an MCP server (stdio). Then ask your
113
+ assistant: *"Where am I wasting money on AWS?"*
114
+
115
+ The plugin and registry entries start the server with `uvx`, so install
116
+ [uv](https://docs.astral.sh/uv/) first (`brew install uv` or `pipx install uv`).
117
+
118
+ Claude Code, as a plugin (asks for your AWS profile):
119
+
120
+ ```text
121
+ /plugin marketplace add cloudwise-app/cloudcostwise
122
+ /plugin install cloudcostwise@cloudcostwise
123
+ ```
124
+
125
+ Claude Code, as a plain MCP server:
126
+
127
+ ```bash
128
+ claude mcp add cloudcostwise -- uvx cloudcostwise mcp
129
+ # a specific profile:
130
+ claude mcp add cloudcostwise -e AWS_PROFILE=prod -- uvx cloudcostwise mcp
131
+ ```
132
+
133
+ Codex (`~/.codex/config.toml`):
134
+
135
+ ```toml
136
+ [mcp_servers.cloudcostwise]
137
+ command = "uvx"
138
+ args = ["cloudcostwise", "mcp"]
139
+ env = { AWS_PROFILE = "prod" }
140
+ ```
141
+
142
+ Tools, all read-only: `scan`, `list_findings`, `explain_finding`,
143
+ `fix_guidance`. `fix_guidance` returns the steps and AWS CLI command as text
144
+ for you to review; nothing is ever executed. The assistant is told about the
145
+ Cost Explorer cost before it scans, and `include_cost_explorer=false` skips it.
146
+
147
+ ## Permissions
148
+
149
+ `ReadOnlyAccess` (AWS managed) is enough. The minimal policy the checks use is
150
+ in [`docs/iam-policy.json`](docs/iam-policy.json). It was derived from a scan of
151
+ an account with most supported resource types; if a check lacks a permission,
152
+ the scan says so in its data warnings instead of failing.
153
+
154
+ ## How the numbers are counted
155
+
156
+ Each finding shows an estimated monthly saving. **Advisory** waste types, ones
157
+ CloudWise could not validate against a real AWS resource, are listed but never
158
+ added to the total.
159
+
160
+ ## What the hosted product adds
161
+
162
+ The other 26 service checks (Glue, ECS, Step Functions, Backup, CloudFront,
163
+ commitments and more), history and trends, alerts, and safe automated fixes:
164
+ <https://cloudcostwise.io/connect?utm_source=cloudcostwise&utm_medium=cli>.
165
+
166
+ ## License
167
+
168
+ FSL-1.1-ALv2. Each release becomes Apache-2.0 two years after it ships.
169
+
170
+ ## How we know it's right
171
+
172
+ See [VALIDATION.md](VALIDATION.md): the validation level of every waste type this tool reports, from L0 (unit-tested) to L2 (fired on a real AWS resource and stayed silent on a healthy twin) and beyond.
@@ -0,0 +1,154 @@
1
+ # cloudcostwise
2
+
3
+ <!-- mcp-name: io.github.cloudwise-app/cloudcostwise -->
4
+
5
+ Find AWS waste from your terminal or your AI assistant. `cloudcostwise` runs CloudWise's open waste
6
+ checks on your own machine, with your own read-only AWS credentials.
7
+
8
+ - **Nothing is sent to CloudWise.** The only network calls are AWS API calls in
9
+ your account. No signup, no IAM role for a third party, no telemetry. Used
10
+ through an AI assistant (MCP), the findings go to that assistant like any
11
+ tool output.
12
+ - **It cannot change anything.** Every AWS call goes through a guard that
13
+ refuses any operation that isn't a `Describe`, `List`, `Get`, `Search` or
14
+ `Lookup`, whatever your credentials allow.
15
+ - **20 of CloudWise's 46 service checks**: EC2, Lambda, SageMaker, WorkSpaces,
16
+ Lightsail, EBS, S3, EFS, ECR, RDS, DynamoDB, ElastiCache, Elastic IPs, NAT
17
+ gateways and load balancers, VPC endpoints, dangling DNS records, CloudWatch
18
+ logs and dashboards, security posture, RI/Savings Plans opportunities, and
19
+ Compute Optimizer.
20
+
21
+ ## Install and run
22
+
23
+ ```bash
24
+ pipx install cloudcostwise # or: uvx cloudcostwise scan
25
+ cloudcostwise scan # us-east-1 plus your profile's region
26
+ cloudcostwise scan --profile prod --regions all
27
+ cloudcostwise scan --format json > waste.json
28
+ ```
29
+
30
+ Options:
31
+
32
+ | Option | Meaning |
33
+ |---|---|
34
+ | `--profile NAME` | AWS profile; otherwise the standard credential chain (env vars, SSO, instance role) |
35
+ | `--regions LIST` | Comma-separated regions, or `all` for every enabled region. Account-level checks (Cost Explorer, Route 53) run once, in us-east-1 |
36
+ | `--format table\|markdown\|json` | Output format |
37
+ | `--no-cost-explorer` | Make no Cost Explorer call. AWS bills those at $0.01 per request and a scan makes about 13. Skips the RI/Savings Plans checks; extended-support surcharges fall back to estimates |
38
+ | `--parallel N` | Regions scanned at once, each in its own process (default 4; `--regions all` takes ~2–3 min instead of ~10) |
39
+ | `--verbose` | Show data warnings (checks that could not read a metric report it as missing, never as zero) |
40
+
41
+ ## What AWS's free tools don't flag
42
+
43
+ <!-- aws-gap:start (generated by scripts/aws_gap.py) -->
44
+ This tool has 42 proven checks (L2 or above in [VALIDATION.md](VALIDATION.md): each fired on a real AWS resource built to trigger it and stayed silent on a healthy twin). **15 of them flag waste that none of AWS's own tools flag**, and 9 more go further than the closest AWS check, going by AWS's lists of what its tools cover ([Trusted Advisor](https://docs.aws.amazon.com/awssupport/latest/user/trusted-advisor-check-reference.html), [Cost Optimization Hub](https://docs.aws.amazon.com/cost-management/latest/userguide/cost-optimization-hub.html), [Compute Optimizer](https://docs.aws.amazon.com/compute-optimizer/latest/ug/supported-resources.html); checked 2026-10-07).
45
+
46
+ | Check | What it finds | Closest AWS check |
47
+ |---|---|---|
48
+ | `ami_orphaned_snapshot` | EBS snapshots left behind by an AMI that was deregistered | None |
49
+ | `classic_lb_migration` | Classic Load Balancers that would cost less as an ALB or NLB | None |
50
+ | `elasticache_engine_migration` | Redis OSS or Memcached clusters that would cost about 20% less on Valkey | None |
51
+ | `elasticache_extended_support_cost` | ElastiCache engine versions billed the Extended Support surcharge | None |
52
+ | `empty_log_group` | CloudWatch log groups that have stored nothing for 30+ days | None |
53
+ | `lambda_arm64_migration` | Lambda functions that would cost about 20% less on arm64 (Graviton) | None |
54
+ | `lambda_provisioned_concurrency_idle` | Lambda provisioned concurrency that is paid for and barely used | None |
55
+ | `lightsail_idle_load_balancer` | Idle Lightsail load balancers | None |
56
+ | `lightsail_unattached_disk` | Lightsail disks attached to nothing | None |
57
+ | `lightsail_unattached_static_ip` | Lightsail static IPs attached to nothing | None |
58
+ | `low_traffic_alb` | Application Load Balancers carrying almost no traffic | None |
59
+ | `multiple_eips_per_instance` | Extra Elastic IPs on one instance, each billed as a public IPv4 address | None |
60
+ | `no_lifecycle_efs` | Large EFS file systems with no Infrequent Access or Archive tiering | None |
61
+ | `previous_gen_sagemaker_instance` | SageMaker instances on a previous generation with a cheaper current one | None |
62
+ | `s3_empty_bucket` | Empty S3 buckets left behind for 30+ days | None |
63
+ | `excessive_retention_log_group` | Log groups keeping a year or more of data they are billed to store | Amazon CloudWatch Log Group Retention Period: Trusted Advisor checks log group retention but flags retention shorter than a minimum (365 days by default) for compliance, so long, costly retention passes it. |
64
+ | `idle_efs` | EFS file systems with no mount targets: nothing can read them, and they still bill | Amazon EFS no mount target redundancy: Trusted Advisor checks EFS mount targets for multi-AZ redundancy, not file systems with no mount targets at all, and EFS is not among the resources Compute Optimizer or Cost Optimization Hub cover. |
65
+ | `idle_load_balancer` | Idle Application and Network Load Balancers | Idle Load Balancers: Trusted Advisor flags idle Classic Load Balancers only (Business Support+ or higher); its documentation says Application and Network Load Balancers are not included. |
66
+ | `lambda_excessive_timeout` | Lambda timeouts set far above what the function needs | AWS Lambda functions with excessive timeouts: Trusted Advisor flags functions where more than 10% of invocations time out; it does not flag a configured timeout set far above the function's real duration. |
67
+ | `no_retention_log_group` | Log groups set to never expire, so they grow every month | Amazon CloudWatch Log Group Retention Period: Trusted Advisor checks log group retention but flags retention below a minimum, so a log group set to never expire passes it. |
68
+ | `old_ecr_images` | Old ECR images still billed for storage | Amazon ECR Repository without lifecycle policy configured: Trusted Advisor checks that an ECR repository has a lifecycle policy; it does not flag the old images already stored. |
69
+ | `oversized_sagemaker_endpoint` | SageMaker endpoints serving traffic on bigger instances than they need | Idle recommendation for SageMaker endpoints: Compute Optimizer flags SageMaker endpoints with zero invocations over 14 days but gives no rightsizing for endpoints that serve traffic on oversized instances. |
70
+ | `s3_wrong_storage_class` | Buckets keeping everything in S3 Standard with no tiering | Amazon S3 Bucket Lifecycle Policy Configured: Trusted Advisor flags buckets with no lifecycle policy but does not look at how much data sits in S3 Standard or suggest Intelligent-Tiering. |
71
+ | `untagged_ecr_images` | Untagged ECR images still billed for storage | Amazon ECR Repository without lifecycle policy configured: Trusted Advisor checks that an ECR repository has a lifecycle policy; it does not flag the untagged images already stored. |
72
+
73
+ For idle EC2, RDS and NAT gateways, rightsizing and Savings Plans, AWS's tools cover the same ground: use them too. Trusted Advisor's cost checks need a Business, Enterprise or Unified Operations support plan; Cost Optimization Hub and Compute Optimizer are free.
74
+
75
+ The hosted CloudWise product adds 14 more proven checks that none of AWS's tools flag, across AWS Backup, AppSync, Elastic Beanstalk, Glue, KMS, Step Functions.
76
+ <!-- aws-gap:end -->
77
+
78
+ A few of them on our test account, where the resources are deliberately tiny
79
+ (which is why the amounts are cents). Excerpt of a scan (0.1.3, us-east-1):
80
+
81
+ ```text
82
+ old_ecr_images x1 $0.06/mo
83
+ us-east-1 cwfx-old-ecr-images $0.06/mo
84
+ untagged_ecr_images x1 $0.02/mo
85
+ us-east-1 cwfx-untagged-ecr-images $0.02/mo
86
+ idle_efs x1 $0.01/mo
87
+ us-east-1 fs-090bfb32bd49de8b7 $0.01/mo
88
+ no_retention_log_group x1 $0.01/mo
89
+ us-east-1 /aws/lambda/cwfx-clo464-docdb-connect $0.01/mo
90
+ ```
91
+
92
+ ## Use it from Claude Code, Codex or any MCP client
93
+
94
+ `cloudcostwise mcp` runs the same scan as an MCP server (stdio). Then ask your
95
+ assistant: *"Where am I wasting money on AWS?"*
96
+
97
+ The plugin and registry entries start the server with `uvx`, so install
98
+ [uv](https://docs.astral.sh/uv/) first (`brew install uv` or `pipx install uv`).
99
+
100
+ Claude Code, as a plugin (asks for your AWS profile):
101
+
102
+ ```text
103
+ /plugin marketplace add cloudwise-app/cloudcostwise
104
+ /plugin install cloudcostwise@cloudcostwise
105
+ ```
106
+
107
+ Claude Code, as a plain MCP server:
108
+
109
+ ```bash
110
+ claude mcp add cloudcostwise -- uvx cloudcostwise mcp
111
+ # a specific profile:
112
+ claude mcp add cloudcostwise -e AWS_PROFILE=prod -- uvx cloudcostwise mcp
113
+ ```
114
+
115
+ Codex (`~/.codex/config.toml`):
116
+
117
+ ```toml
118
+ [mcp_servers.cloudcostwise]
119
+ command = "uvx"
120
+ args = ["cloudcostwise", "mcp"]
121
+ env = { AWS_PROFILE = "prod" }
122
+ ```
123
+
124
+ Tools, all read-only: `scan`, `list_findings`, `explain_finding`,
125
+ `fix_guidance`. `fix_guidance` returns the steps and AWS CLI command as text
126
+ for you to review; nothing is ever executed. The assistant is told about the
127
+ Cost Explorer cost before it scans, and `include_cost_explorer=false` skips it.
128
+
129
+ ## Permissions
130
+
131
+ `ReadOnlyAccess` (AWS managed) is enough. The minimal policy the checks use is
132
+ in [`docs/iam-policy.json`](docs/iam-policy.json). It was derived from a scan of
133
+ an account with most supported resource types; if a check lacks a permission,
134
+ the scan says so in its data warnings instead of failing.
135
+
136
+ ## How the numbers are counted
137
+
138
+ Each finding shows an estimated monthly saving. **Advisory** waste types, ones
139
+ CloudWise could not validate against a real AWS resource, are listed but never
140
+ added to the total.
141
+
142
+ ## What the hosted product adds
143
+
144
+ The other 26 service checks (Glue, ECS, Step Functions, Backup, CloudFront,
145
+ commitments and more), history and trends, alerts, and safe automated fixes:
146
+ <https://cloudcostwise.io/connect?utm_source=cloudcostwise&utm_medium=cli>.
147
+
148
+ ## License
149
+
150
+ FSL-1.1-ALv2. Each release becomes Apache-2.0 two years after it ships.
151
+
152
+ ## How we know it's right
153
+
154
+ See [VALIDATION.md](VALIDATION.md): the validation level of every waste type this tool reports, from L0 (unit-tested) to L2 (fired on a real AWS resource and stayed silent on a healthy twin) and beyond.
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "cloudcostwise"
7
- version = "0.1.3"
8
- description = "Find AWS waste from your terminal or your AI assistant. Runs locally with your own read-only credentials; nothing leaves your machine."
7
+ version = "0.1.4"
8
+ description = "Find AWS waste from your terminal or your AI assistant. Runs locally with your own read-only credentials. Nothing is sent to CloudWise."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
11
11
  license = { text = "FSL-1.1-ALv2" }
@@ -1,3 +1,3 @@
1
1
  """cloudcostwise: find AWS waste locally (FSL-1.1-ALv2)."""
2
2
 
3
- __version__ = "0.1.3"
3
+ __version__ = "0.1.4"
@@ -13,7 +13,7 @@ from cloudcostwise import __version__
13
13
  def _parser() -> argparse.ArgumentParser:
14
14
  p = argparse.ArgumentParser(
15
15
  prog="cloudcostwise",
16
- description="Find AWS waste locally with your own read-only credentials. Nothing leaves your machine.",
16
+ description="Find AWS waste locally with your own read-only credentials. Nothing is sent to CloudWise.",
17
17
  )
18
18
  p.add_argument("--version", action="version", version=f"cloudcostwise {__version__}")
19
19
  sub = p.add_subparsers(dest="command", required=True)
@@ -0,0 +1,172 @@
1
+ Metadata-Version: 2.4
2
+ Name: cloudcostwise
3
+ Version: 0.1.4
4
+ Summary: Find AWS waste from your terminal or your AI assistant. Runs locally with your own read-only credentials. Nothing is sent to CloudWise.
5
+ Author: CloudWise
6
+ License: FSL-1.1-ALv2
7
+ Project-URL: Homepage, https://cloudcostwise.io/cli
8
+ Project-URL: Repository, https://github.com/cloudwise-app/cloudcostwise
9
+ Project-URL: Issues, https://github.com/cloudwise-app/cloudcostwise/issues
10
+ Requires-Python: >=3.11
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE.md
13
+ Requires-Dist: boto3>=1.40
14
+ Requires-Dist: mcp<3,>=2.3
15
+ Provides-Extra: test
16
+ Requires-Dist: pytest>=8; extra == "test"
17
+ Dynamic: license-file
18
+
19
+ # cloudcostwise
20
+
21
+ <!-- mcp-name: io.github.cloudwise-app/cloudcostwise -->
22
+
23
+ Find AWS waste from your terminal or your AI assistant. `cloudcostwise` runs CloudWise's open waste
24
+ checks on your own machine, with your own read-only AWS credentials.
25
+
26
+ - **Nothing is sent to CloudWise.** The only network calls are AWS API calls in
27
+ your account. No signup, no IAM role for a third party, no telemetry. Used
28
+ through an AI assistant (MCP), the findings go to that assistant like any
29
+ tool output.
30
+ - **It cannot change anything.** Every AWS call goes through a guard that
31
+ refuses any operation that isn't a `Describe`, `List`, `Get`, `Search` or
32
+ `Lookup`, whatever your credentials allow.
33
+ - **20 of CloudWise's 46 service checks**: EC2, Lambda, SageMaker, WorkSpaces,
34
+ Lightsail, EBS, S3, EFS, ECR, RDS, DynamoDB, ElastiCache, Elastic IPs, NAT
35
+ gateways and load balancers, VPC endpoints, dangling DNS records, CloudWatch
36
+ logs and dashboards, security posture, RI/Savings Plans opportunities, and
37
+ Compute Optimizer.
38
+
39
+ ## Install and run
40
+
41
+ ```bash
42
+ pipx install cloudcostwise # or: uvx cloudcostwise scan
43
+ cloudcostwise scan # us-east-1 plus your profile's region
44
+ cloudcostwise scan --profile prod --regions all
45
+ cloudcostwise scan --format json > waste.json
46
+ ```
47
+
48
+ Options:
49
+
50
+ | Option | Meaning |
51
+ |---|---|
52
+ | `--profile NAME` | AWS profile; otherwise the standard credential chain (env vars, SSO, instance role) |
53
+ | `--regions LIST` | Comma-separated regions, or `all` for every enabled region. Account-level checks (Cost Explorer, Route 53) run once, in us-east-1 |
54
+ | `--format table\|markdown\|json` | Output format |
55
+ | `--no-cost-explorer` | Make no Cost Explorer call. AWS bills those at $0.01 per request and a scan makes about 13. Skips the RI/Savings Plans checks; extended-support surcharges fall back to estimates |
56
+ | `--parallel N` | Regions scanned at once, each in its own process (default 4; `--regions all` takes ~2–3 min instead of ~10) |
57
+ | `--verbose` | Show data warnings (checks that could not read a metric report it as missing, never as zero) |
58
+
59
+ ## What AWS's free tools don't flag
60
+
61
+ <!-- aws-gap:start (generated by scripts/aws_gap.py) -->
62
+ This tool has 42 proven checks (L2 or above in [VALIDATION.md](VALIDATION.md): each fired on a real AWS resource built to trigger it and stayed silent on a healthy twin). **15 of them flag waste that none of AWS's own tools flag**, and 9 more go further than the closest AWS check, going by AWS's lists of what its tools cover ([Trusted Advisor](https://docs.aws.amazon.com/awssupport/latest/user/trusted-advisor-check-reference.html), [Cost Optimization Hub](https://docs.aws.amazon.com/cost-management/latest/userguide/cost-optimization-hub.html), [Compute Optimizer](https://docs.aws.amazon.com/compute-optimizer/latest/ug/supported-resources.html); checked 2026-10-07).
63
+
64
+ | Check | What it finds | Closest AWS check |
65
+ |---|---|---|
66
+ | `ami_orphaned_snapshot` | EBS snapshots left behind by an AMI that was deregistered | None |
67
+ | `classic_lb_migration` | Classic Load Balancers that would cost less as an ALB or NLB | None |
68
+ | `elasticache_engine_migration` | Redis OSS or Memcached clusters that would cost about 20% less on Valkey | None |
69
+ | `elasticache_extended_support_cost` | ElastiCache engine versions billed the Extended Support surcharge | None |
70
+ | `empty_log_group` | CloudWatch log groups that have stored nothing for 30+ days | None |
71
+ | `lambda_arm64_migration` | Lambda functions that would cost about 20% less on arm64 (Graviton) | None |
72
+ | `lambda_provisioned_concurrency_idle` | Lambda provisioned concurrency that is paid for and barely used | None |
73
+ | `lightsail_idle_load_balancer` | Idle Lightsail load balancers | None |
74
+ | `lightsail_unattached_disk` | Lightsail disks attached to nothing | None |
75
+ | `lightsail_unattached_static_ip` | Lightsail static IPs attached to nothing | None |
76
+ | `low_traffic_alb` | Application Load Balancers carrying almost no traffic | None |
77
+ | `multiple_eips_per_instance` | Extra Elastic IPs on one instance, each billed as a public IPv4 address | None |
78
+ | `no_lifecycle_efs` | Large EFS file systems with no Infrequent Access or Archive tiering | None |
79
+ | `previous_gen_sagemaker_instance` | SageMaker instances on a previous generation with a cheaper current one | None |
80
+ | `s3_empty_bucket` | Empty S3 buckets left behind for 30+ days | None |
81
+ | `excessive_retention_log_group` | Log groups keeping a year or more of data they are billed to store | Amazon CloudWatch Log Group Retention Period: Trusted Advisor checks log group retention but flags retention shorter than a minimum (365 days by default) for compliance, so long, costly retention passes it. |
82
+ | `idle_efs` | EFS file systems with no mount targets: nothing can read them, and they still bill | Amazon EFS no mount target redundancy: Trusted Advisor checks EFS mount targets for multi-AZ redundancy, not file systems with no mount targets at all, and EFS is not among the resources Compute Optimizer or Cost Optimization Hub cover. |
83
+ | `idle_load_balancer` | Idle Application and Network Load Balancers | Idle Load Balancers: Trusted Advisor flags idle Classic Load Balancers only (Business Support+ or higher); its documentation says Application and Network Load Balancers are not included. |
84
+ | `lambda_excessive_timeout` | Lambda timeouts set far above what the function needs | AWS Lambda functions with excessive timeouts: Trusted Advisor flags functions where more than 10% of invocations time out; it does not flag a configured timeout set far above the function's real duration. |
85
+ | `no_retention_log_group` | Log groups set to never expire, so they grow every month | Amazon CloudWatch Log Group Retention Period: Trusted Advisor checks log group retention but flags retention below a minimum, so a log group set to never expire passes it. |
86
+ | `old_ecr_images` | Old ECR images still billed for storage | Amazon ECR Repository without lifecycle policy configured: Trusted Advisor checks that an ECR repository has a lifecycle policy; it does not flag the old images already stored. |
87
+ | `oversized_sagemaker_endpoint` | SageMaker endpoints serving traffic on bigger instances than they need | Idle recommendation for SageMaker endpoints: Compute Optimizer flags SageMaker endpoints with zero invocations over 14 days but gives no rightsizing for endpoints that serve traffic on oversized instances. |
88
+ | `s3_wrong_storage_class` | Buckets keeping everything in S3 Standard with no tiering | Amazon S3 Bucket Lifecycle Policy Configured: Trusted Advisor flags buckets with no lifecycle policy but does not look at how much data sits in S3 Standard or suggest Intelligent-Tiering. |
89
+ | `untagged_ecr_images` | Untagged ECR images still billed for storage | Amazon ECR Repository without lifecycle policy configured: Trusted Advisor checks that an ECR repository has a lifecycle policy; it does not flag the untagged images already stored. |
90
+
91
+ For idle EC2, RDS and NAT gateways, rightsizing and Savings Plans, AWS's tools cover the same ground: use them too. Trusted Advisor's cost checks need a Business, Enterprise or Unified Operations support plan; Cost Optimization Hub and Compute Optimizer are free.
92
+
93
+ The hosted CloudWise product adds 14 more proven checks that none of AWS's tools flag, across AWS Backup, AppSync, Elastic Beanstalk, Glue, KMS, Step Functions.
94
+ <!-- aws-gap:end -->
95
+
96
+ A few of them on our test account, where the resources are deliberately tiny
97
+ (which is why the amounts are cents). Excerpt of a scan (0.1.3, us-east-1):
98
+
99
+ ```text
100
+ old_ecr_images x1 $0.06/mo
101
+ us-east-1 cwfx-old-ecr-images $0.06/mo
102
+ untagged_ecr_images x1 $0.02/mo
103
+ us-east-1 cwfx-untagged-ecr-images $0.02/mo
104
+ idle_efs x1 $0.01/mo
105
+ us-east-1 fs-090bfb32bd49de8b7 $0.01/mo
106
+ no_retention_log_group x1 $0.01/mo
107
+ us-east-1 /aws/lambda/cwfx-clo464-docdb-connect $0.01/mo
108
+ ```
109
+
110
+ ## Use it from Claude Code, Codex or any MCP client
111
+
112
+ `cloudcostwise mcp` runs the same scan as an MCP server (stdio). Then ask your
113
+ assistant: *"Where am I wasting money on AWS?"*
114
+
115
+ The plugin and registry entries start the server with `uvx`, so install
116
+ [uv](https://docs.astral.sh/uv/) first (`brew install uv` or `pipx install uv`).
117
+
118
+ Claude Code, as a plugin (asks for your AWS profile):
119
+
120
+ ```text
121
+ /plugin marketplace add cloudwise-app/cloudcostwise
122
+ /plugin install cloudcostwise@cloudcostwise
123
+ ```
124
+
125
+ Claude Code, as a plain MCP server:
126
+
127
+ ```bash
128
+ claude mcp add cloudcostwise -- uvx cloudcostwise mcp
129
+ # a specific profile:
130
+ claude mcp add cloudcostwise -e AWS_PROFILE=prod -- uvx cloudcostwise mcp
131
+ ```
132
+
133
+ Codex (`~/.codex/config.toml`):
134
+
135
+ ```toml
136
+ [mcp_servers.cloudcostwise]
137
+ command = "uvx"
138
+ args = ["cloudcostwise", "mcp"]
139
+ env = { AWS_PROFILE = "prod" }
140
+ ```
141
+
142
+ Tools, all read-only: `scan`, `list_findings`, `explain_finding`,
143
+ `fix_guidance`. `fix_guidance` returns the steps and AWS CLI command as text
144
+ for you to review; nothing is ever executed. The assistant is told about the
145
+ Cost Explorer cost before it scans, and `include_cost_explorer=false` skips it.
146
+
147
+ ## Permissions
148
+
149
+ `ReadOnlyAccess` (AWS managed) is enough. The minimal policy the checks use is
150
+ in [`docs/iam-policy.json`](docs/iam-policy.json). It was derived from a scan of
151
+ an account with most supported resource types; if a check lacks a permission,
152
+ the scan says so in its data warnings instead of failing.
153
+
154
+ ## How the numbers are counted
155
+
156
+ Each finding shows an estimated monthly saving. **Advisory** waste types, ones
157
+ CloudWise could not validate against a real AWS resource, are listed but never
158
+ added to the total.
159
+
160
+ ## What the hosted product adds
161
+
162
+ The other 26 service checks (Glue, ECS, Step Functions, Backup, CloudFront,
163
+ commitments and more), history and trends, alerts, and safe automated fixes:
164
+ <https://cloudcostwise.io/connect?utm_source=cloudcostwise&utm_medium=cli>.
165
+
166
+ ## License
167
+
168
+ FSL-1.1-ALv2. Each release becomes Apache-2.0 two years after it ships.
169
+
170
+ ## How we know it's right
171
+
172
+ See [VALIDATION.md](VALIDATION.md): the validation level of every waste type this tool reports, from L0 (unit-tested) to L2 (fired on a real AWS resource and stayed silent on a healthy twin) and beyond.
@@ -9727,22 +9727,39 @@ class OnlineDataProvider(MissingDataNotesMixin, WasteDataProvider):
9727
9727
  end_time = datetime.now(timezone.utc)
9728
9728
  start_time = end_time - timedelta(days=30)
9729
9729
 
9730
+ # CLO-592: AWS publishes the Accelerator dimension as the
9731
+ # bare accelerator id (list-metrics, 2026-10-07), never the
9732
+ # ARN; reading by ARN returned no datapoints for every
9733
+ # accelerator, which detector 3 read as zero traffic.
9734
+ accelerator_id = arn.rsplit('/', 1)[-1]
9735
+ empty_series = []
9730
9736
  for metric_name in ['ProcessedBytesIn', 'ProcessedBytesOut']:
9731
9737
  response = cw.get_metric_statistics(
9732
9738
  Namespace='AWS/GlobalAccelerator',
9733
9739
  MetricName=metric_name,
9734
- Dimensions=[{'Name': 'Accelerator', 'Value': arn}],
9740
+ Dimensions=[{'Name': 'Accelerator', 'Value': accelerator_id}],
9735
9741
  StartTime=start_time,
9736
9742
  EndTime=end_time,
9737
9743
  Period=86400 * 30,
9738
9744
  Statistics=['Sum'],
9739
9745
  )
9740
9746
  datapoints = response.get('Datapoints', [])
9747
+ if not datapoints:
9748
+ empty_series.append(metric_name)
9741
9749
  total = sum(dp['Sum'] for dp in datapoints)
9742
9750
  if metric_name == 'ProcessedBytesIn':
9743
9751
  processed_in = total
9744
9752
  else:
9745
9753
  processed_out = total
9754
+ if len(empty_series) == 2:
9755
+ # No series at all is MISSING (CLO-592), never a
9756
+ # measured zero: idle is withheld and noted.
9757
+ processed_in = None
9758
+ processed_out = None
9759
+ self._note_idle_verdict_missing(
9760
+ 'globalaccelerator', acc.get('Name') or arn,
9761
+ "no ProcessedBytes datapoints in 30 days",
9762
+ )
9746
9763
  except Exception as e:
9747
9764
  self._warn_swallowed(
9748
9765
  "Global Accelerator processed bytes", "cloudwatch:GetMetricStatistics", e,
@@ -1,119 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: cloudcostwise
3
- Version: 0.1.3
4
- Summary: Find AWS waste from your terminal or your AI assistant. Runs locally with your own read-only credentials; nothing leaves your machine.
5
- Author: CloudWise
6
- License: FSL-1.1-ALv2
7
- Project-URL: Homepage, https://cloudcostwise.io/cli
8
- Project-URL: Repository, https://github.com/cloudwise-app/cloudcostwise
9
- Project-URL: Issues, https://github.com/cloudwise-app/cloudcostwise/issues
10
- Requires-Python: >=3.11
11
- Description-Content-Type: text/markdown
12
- License-File: LICENSE.md
13
- Requires-Dist: boto3>=1.40
14
- Requires-Dist: mcp<3,>=2.3
15
- Provides-Extra: test
16
- Requires-Dist: pytest>=8; extra == "test"
17
- Dynamic: license-file
18
-
19
- # cloudcostwise
20
-
21
- <!-- mcp-name: io.github.cloudwise-app/cloudcostwise -->
22
-
23
- Find AWS waste from your terminal or your AI assistant. `cloudcostwise` runs CloudWise's open waste
24
- checks on your own machine, with your own read-only AWS credentials.
25
-
26
- - **Nothing leaves your machine.** The only network calls are AWS API calls in
27
- your account. No signup, no IAM role for a third party, no telemetry.
28
- - **It cannot change anything.** Every AWS call goes through a guard that
29
- refuses any operation that isn't a `Describe`, `List`, `Get`, `Search` or
30
- `Lookup`, whatever your credentials allow.
31
- - **20 of CloudWise's 46 service checks**: EC2, Lambda, SageMaker, WorkSpaces,
32
- Lightsail, EBS, S3, EFS, ECR, RDS, DynamoDB, ElastiCache, Elastic IPs, NAT
33
- gateways and load balancers, VPC endpoints, dangling DNS records, CloudWatch
34
- logs and dashboards, security posture, RI/Savings Plans opportunities, and
35
- Compute Optimizer.
36
-
37
- ## Install and run
38
-
39
- ```bash
40
- pipx install cloudcostwise # or: uvx cloudcostwise scan
41
- cloudcostwise scan # us-east-1 plus your profile's region
42
- cloudcostwise scan --profile prod --regions all
43
- cloudcostwise scan --format json > waste.json
44
- ```
45
-
46
- Options:
47
-
48
- | Option | Meaning |
49
- |---|---|
50
- | `--profile NAME` | AWS profile; otherwise the standard credential chain (env vars, SSO, instance role) |
51
- | `--regions LIST` | Comma-separated regions, or `all` for every enabled region. Account-level checks (Cost Explorer, Route 53) run once, in us-east-1 |
52
- | `--format table\|markdown\|json` | Output format |
53
- | `--no-cost-explorer` | Make no Cost Explorer call. AWS bills those at $0.01 per request and a scan makes about 13. Skips the RI/Savings Plans checks; extended-support surcharges fall back to estimates |
54
- | `--parallel N` | Regions scanned at once, each in its own process (default 4; `--regions all` takes ~2–3 min instead of ~10) |
55
- | `--verbose` | Show data warnings (checks that could not read a metric report it as missing, never as zero) |
56
-
57
- ## Use it from Claude Code, Codex or any MCP client
58
-
59
- `cloudcostwise mcp` runs the same scan as an MCP server (stdio). Then ask your
60
- assistant: *"Where am I wasting money on AWS?"*
61
-
62
- The plugin and registry entries start the server with `uvx`, so install
63
- [uv](https://docs.astral.sh/uv/) first (`brew install uv` or `pipx install uv`).
64
-
65
- Claude Code, as a plugin (asks for your AWS profile):
66
-
67
- ```text
68
- /plugin marketplace add cloudwise-app/cloudcostwise
69
- /plugin install cloudcostwise@cloudcostwise
70
- ```
71
-
72
- Claude Code, as a plain MCP server:
73
-
74
- ```bash
75
- claude mcp add cloudcostwise -- uvx cloudcostwise mcp
76
- # a specific profile:
77
- claude mcp add cloudcostwise -e AWS_PROFILE=prod -- uvx cloudcostwise mcp
78
- ```
79
-
80
- Codex (`~/.codex/config.toml`):
81
-
82
- ```toml
83
- [mcp_servers.cloudcostwise]
84
- command = "uvx"
85
- args = ["cloudcostwise", "mcp"]
86
- env = { AWS_PROFILE = "prod" }
87
- ```
88
-
89
- Tools, all read-only: `scan`, `list_findings`, `explain_finding`,
90
- `fix_guidance`. `fix_guidance` returns the steps and AWS CLI command as text
91
- for you to review; nothing is ever executed. The assistant is told about the
92
- Cost Explorer cost before it scans, and `include_cost_explorer=false` skips it.
93
-
94
- ## Permissions
95
-
96
- `ReadOnlyAccess` (AWS managed) is enough. The minimal policy the checks use is
97
- in [`docs/iam-policy.json`](docs/iam-policy.json). It was derived from a scan of
98
- an account with most supported resource types; if a check lacks a permission,
99
- the scan says so in its data warnings instead of failing.
100
-
101
- ## How the numbers are counted
102
-
103
- Each finding shows an estimated monthly saving. **Advisory** waste types, ones
104
- CloudWise could not validate against a real AWS resource, are listed but never
105
- added to the total.
106
-
107
- ## What the hosted product adds
108
-
109
- The other 26 service checks (Glue, ECS, Step Functions, Backup, CloudFront,
110
- commitments and more), history and trends, alerts, and safe automated fixes:
111
- <https://cloudcostwise.io/connect?utm_source=cloudcostwise&utm_medium=cli>.
112
-
113
- ## License
114
-
115
- FSL-1.1-ALv2. Each release becomes Apache-2.0 two years after it ships.
116
-
117
- ## How we know it's right
118
-
119
- See [VALIDATION.md](VALIDATION.md): the validation level of every waste type this tool reports, from L0 (unit-tested) to L2 (fired on a real AWS resource and stayed silent on a healthy twin) and beyond.
@@ -1,101 +0,0 @@
1
- # cloudcostwise
2
-
3
- <!-- mcp-name: io.github.cloudwise-app/cloudcostwise -->
4
-
5
- Find AWS waste from your terminal or your AI assistant. `cloudcostwise` runs CloudWise's open waste
6
- checks on your own machine, with your own read-only AWS credentials.
7
-
8
- - **Nothing leaves your machine.** The only network calls are AWS API calls in
9
- your account. No signup, no IAM role for a third party, no telemetry.
10
- - **It cannot change anything.** Every AWS call goes through a guard that
11
- refuses any operation that isn't a `Describe`, `List`, `Get`, `Search` or
12
- `Lookup`, whatever your credentials allow.
13
- - **20 of CloudWise's 46 service checks**: EC2, Lambda, SageMaker, WorkSpaces,
14
- Lightsail, EBS, S3, EFS, ECR, RDS, DynamoDB, ElastiCache, Elastic IPs, NAT
15
- gateways and load balancers, VPC endpoints, dangling DNS records, CloudWatch
16
- logs and dashboards, security posture, RI/Savings Plans opportunities, and
17
- Compute Optimizer.
18
-
19
- ## Install and run
20
-
21
- ```bash
22
- pipx install cloudcostwise # or: uvx cloudcostwise scan
23
- cloudcostwise scan # us-east-1 plus your profile's region
24
- cloudcostwise scan --profile prod --regions all
25
- cloudcostwise scan --format json > waste.json
26
- ```
27
-
28
- Options:
29
-
30
- | Option | Meaning |
31
- |---|---|
32
- | `--profile NAME` | AWS profile; otherwise the standard credential chain (env vars, SSO, instance role) |
33
- | `--regions LIST` | Comma-separated regions, or `all` for every enabled region. Account-level checks (Cost Explorer, Route 53) run once, in us-east-1 |
34
- | `--format table\|markdown\|json` | Output format |
35
- | `--no-cost-explorer` | Make no Cost Explorer call. AWS bills those at $0.01 per request and a scan makes about 13. Skips the RI/Savings Plans checks; extended-support surcharges fall back to estimates |
36
- | `--parallel N` | Regions scanned at once, each in its own process (default 4; `--regions all` takes ~2–3 min instead of ~10) |
37
- | `--verbose` | Show data warnings (checks that could not read a metric report it as missing, never as zero) |
38
-
39
- ## Use it from Claude Code, Codex or any MCP client
40
-
41
- `cloudcostwise mcp` runs the same scan as an MCP server (stdio). Then ask your
42
- assistant: *"Where am I wasting money on AWS?"*
43
-
44
- The plugin and registry entries start the server with `uvx`, so install
45
- [uv](https://docs.astral.sh/uv/) first (`brew install uv` or `pipx install uv`).
46
-
47
- Claude Code, as a plugin (asks for your AWS profile):
48
-
49
- ```text
50
- /plugin marketplace add cloudwise-app/cloudcostwise
51
- /plugin install cloudcostwise@cloudcostwise
52
- ```
53
-
54
- Claude Code, as a plain MCP server:
55
-
56
- ```bash
57
- claude mcp add cloudcostwise -- uvx cloudcostwise mcp
58
- # a specific profile:
59
- claude mcp add cloudcostwise -e AWS_PROFILE=prod -- uvx cloudcostwise mcp
60
- ```
61
-
62
- Codex (`~/.codex/config.toml`):
63
-
64
- ```toml
65
- [mcp_servers.cloudcostwise]
66
- command = "uvx"
67
- args = ["cloudcostwise", "mcp"]
68
- env = { AWS_PROFILE = "prod" }
69
- ```
70
-
71
- Tools, all read-only: `scan`, `list_findings`, `explain_finding`,
72
- `fix_guidance`. `fix_guidance` returns the steps and AWS CLI command as text
73
- for you to review; nothing is ever executed. The assistant is told about the
74
- Cost Explorer cost before it scans, and `include_cost_explorer=false` skips it.
75
-
76
- ## Permissions
77
-
78
- `ReadOnlyAccess` (AWS managed) is enough. The minimal policy the checks use is
79
- in [`docs/iam-policy.json`](docs/iam-policy.json). It was derived from a scan of
80
- an account with most supported resource types; if a check lacks a permission,
81
- the scan says so in its data warnings instead of failing.
82
-
83
- ## How the numbers are counted
84
-
85
- Each finding shows an estimated monthly saving. **Advisory** waste types, ones
86
- CloudWise could not validate against a real AWS resource, are listed but never
87
- added to the total.
88
-
89
- ## What the hosted product adds
90
-
91
- The other 26 service checks (Glue, ECS, Step Functions, Backup, CloudFront,
92
- commitments and more), history and trends, alerts, and safe automated fixes:
93
- <https://cloudcostwise.io/connect?utm_source=cloudcostwise&utm_medium=cli>.
94
-
95
- ## License
96
-
97
- FSL-1.1-ALv2. Each release becomes Apache-2.0 two years after it ships.
98
-
99
- ## How we know it's right
100
-
101
- See [VALIDATION.md](VALIDATION.md): the validation level of every waste type this tool reports, from L0 (unit-tested) to L2 (fired on a real AWS resource and stayed silent on a healthy twin) and beyond.
@@ -1,119 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: cloudcostwise
3
- Version: 0.1.3
4
- Summary: Find AWS waste from your terminal or your AI assistant. Runs locally with your own read-only credentials; nothing leaves your machine.
5
- Author: CloudWise
6
- License: FSL-1.1-ALv2
7
- Project-URL: Homepage, https://cloudcostwise.io/cli
8
- Project-URL: Repository, https://github.com/cloudwise-app/cloudcostwise
9
- Project-URL: Issues, https://github.com/cloudwise-app/cloudcostwise/issues
10
- Requires-Python: >=3.11
11
- Description-Content-Type: text/markdown
12
- License-File: LICENSE.md
13
- Requires-Dist: boto3>=1.40
14
- Requires-Dist: mcp<3,>=2.3
15
- Provides-Extra: test
16
- Requires-Dist: pytest>=8; extra == "test"
17
- Dynamic: license-file
18
-
19
- # cloudcostwise
20
-
21
- <!-- mcp-name: io.github.cloudwise-app/cloudcostwise -->
22
-
23
- Find AWS waste from your terminal or your AI assistant. `cloudcostwise` runs CloudWise's open waste
24
- checks on your own machine, with your own read-only AWS credentials.
25
-
26
- - **Nothing leaves your machine.** The only network calls are AWS API calls in
27
- your account. No signup, no IAM role for a third party, no telemetry.
28
- - **It cannot change anything.** Every AWS call goes through a guard that
29
- refuses any operation that isn't a `Describe`, `List`, `Get`, `Search` or
30
- `Lookup`, whatever your credentials allow.
31
- - **20 of CloudWise's 46 service checks**: EC2, Lambda, SageMaker, WorkSpaces,
32
- Lightsail, EBS, S3, EFS, ECR, RDS, DynamoDB, ElastiCache, Elastic IPs, NAT
33
- gateways and load balancers, VPC endpoints, dangling DNS records, CloudWatch
34
- logs and dashboards, security posture, RI/Savings Plans opportunities, and
35
- Compute Optimizer.
36
-
37
- ## Install and run
38
-
39
- ```bash
40
- pipx install cloudcostwise # or: uvx cloudcostwise scan
41
- cloudcostwise scan # us-east-1 plus your profile's region
42
- cloudcostwise scan --profile prod --regions all
43
- cloudcostwise scan --format json > waste.json
44
- ```
45
-
46
- Options:
47
-
48
- | Option | Meaning |
49
- |---|---|
50
- | `--profile NAME` | AWS profile; otherwise the standard credential chain (env vars, SSO, instance role) |
51
- | `--regions LIST` | Comma-separated regions, or `all` for every enabled region. Account-level checks (Cost Explorer, Route 53) run once, in us-east-1 |
52
- | `--format table\|markdown\|json` | Output format |
53
- | `--no-cost-explorer` | Make no Cost Explorer call. AWS bills those at $0.01 per request and a scan makes about 13. Skips the RI/Savings Plans checks; extended-support surcharges fall back to estimates |
54
- | `--parallel N` | Regions scanned at once, each in its own process (default 4; `--regions all` takes ~2–3 min instead of ~10) |
55
- | `--verbose` | Show data warnings (checks that could not read a metric report it as missing, never as zero) |
56
-
57
- ## Use it from Claude Code, Codex or any MCP client
58
-
59
- `cloudcostwise mcp` runs the same scan as an MCP server (stdio). Then ask your
60
- assistant: *"Where am I wasting money on AWS?"*
61
-
62
- The plugin and registry entries start the server with `uvx`, so install
63
- [uv](https://docs.astral.sh/uv/) first (`brew install uv` or `pipx install uv`).
64
-
65
- Claude Code, as a plugin (asks for your AWS profile):
66
-
67
- ```text
68
- /plugin marketplace add cloudwise-app/cloudcostwise
69
- /plugin install cloudcostwise@cloudcostwise
70
- ```
71
-
72
- Claude Code, as a plain MCP server:
73
-
74
- ```bash
75
- claude mcp add cloudcostwise -- uvx cloudcostwise mcp
76
- # a specific profile:
77
- claude mcp add cloudcostwise -e AWS_PROFILE=prod -- uvx cloudcostwise mcp
78
- ```
79
-
80
- Codex (`~/.codex/config.toml`):
81
-
82
- ```toml
83
- [mcp_servers.cloudcostwise]
84
- command = "uvx"
85
- args = ["cloudcostwise", "mcp"]
86
- env = { AWS_PROFILE = "prod" }
87
- ```
88
-
89
- Tools, all read-only: `scan`, `list_findings`, `explain_finding`,
90
- `fix_guidance`. `fix_guidance` returns the steps and AWS CLI command as text
91
- for you to review; nothing is ever executed. The assistant is told about the
92
- Cost Explorer cost before it scans, and `include_cost_explorer=false` skips it.
93
-
94
- ## Permissions
95
-
96
- `ReadOnlyAccess` (AWS managed) is enough. The minimal policy the checks use is
97
- in [`docs/iam-policy.json`](docs/iam-policy.json). It was derived from a scan of
98
- an account with most supported resource types; if a check lacks a permission,
99
- the scan says so in its data warnings instead of failing.
100
-
101
- ## How the numbers are counted
102
-
103
- Each finding shows an estimated monthly saving. **Advisory** waste types, ones
104
- CloudWise could not validate against a real AWS resource, are listed but never
105
- added to the total.
106
-
107
- ## What the hosted product adds
108
-
109
- The other 26 service checks (Glue, ECS, Step Functions, Backup, CloudFront,
110
- commitments and more), history and trends, alerts, and safe automated fixes:
111
- <https://cloudcostwise.io/connect?utm_source=cloudcostwise&utm_medium=cli>.
112
-
113
- ## License
114
-
115
- FSL-1.1-ALv2. Each release becomes Apache-2.0 two years after it ships.
116
-
117
- ## How we know it's right
118
-
119
- See [VALIDATION.md](VALIDATION.md): the validation level of every waste type this tool reports, from L0 (unit-tested) to L2 (fired on a real AWS resource and stayed silent on a healthy twin) and beyond.
File without changes
File without changes