MCP server for querying AWS Cost Explorer and listing AWS resources (EC2, S3, RDS) with tenant-based credential isolation
Two tools with basic verb-noun naming (get_costs, get_resources). Both have descriptions and input schemas visible in server.py. However, schemas lack formal JSON Schema structure with explicit type declarations and constraints. Parameter descriptions are present but minimal (10-40 chars). Output is JSON strings, not structured objects. No error recovery guidance. Missing enum constraints for granularity and resource_types. tenant_id injection pattern is good, but no documentation of this security model in tool descriptions. No pagination support despite potential for large result sets.
Query AWS Cost Explorer for cost and usage data.
List AWS resources (EC2, S3, RDS) for a tenant.
Input schemas lack formal JSON Schema structure. Parameters have type hints in Python but no explicit JSON Schema with type, enum, minLength, pattern, or constraints visible in tool registration.
granularity parameter accepts free-form string 'DAILY, MONTHLY, or HOURLY' but no enum constraint. LLMs may hallucinate invalid values like 'WEEKLY' or 'QUARTERLY'.
resource_types parameter description says 'defaults to all' but no enum constraint for ['ec2', 's3', 'rds']. LLMs may pass invalid types like 'lambda' or 'dynamodb'.
Output is raw JSON string, not structured object. Responses like {"error": "tenant_id required"} and {"tenant_id": ..., "data": [...]} lack documented schema. LLMs cannot reliably parse or chain results.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
Error handling returns JSON strings with generic error messages ('no credentials for tenant', 'tenant_id required') but no recovery guidance. LLM cannot determine if error is retryable or user-fixable.