Skip to main content
Glama
aarora79

AWS Cost Explorer MCP Server

get_ec2_spend_last_day

Retrieve EC2 spending data for the previous day using AWS Cost Explorer API. Analyze cloud costs by accessing raw API responses for specified regions and AWS accounts.

Instructions

Retrieve EC2 spend for the last day using standard AWS Cost Explorer API. Returns: Dict[str, Any]: The raw response from the AWS Cost Explorer API, or None if an error occurs.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
paramsYes

Implementation Reference

  • The handler function for the 'get_ec2_spend_last_day' tool. Decorated with @mcp.tool() for registration. Queries AWS Cost Explorer API for EC2 compute costs grouped by instance type for the previous day. Processes and prints the breakdown, returns raw API response.
    @mcp.tool() async def get_ec2_spend_last_day(params: EC2Params) -> Dict[str, Any]: """ Retrieve EC2 spend for the last day using standard AWS Cost Explorer API. Returns: Dict[str, Any]: The raw response from the AWS Cost Explorer API, or None if an error occurs. """ print(f"get_ec2_spend_last_day, params={params}") # Initialize the Cost Explorer client ce_client = get_aws_service_boto3_client("ce", params.aws_account_id, params.region) # Calculate the time period - last day end_date = datetime.now().strftime('%Y-%m-%d') start_date = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d') try: # Make the API call using get_cost_and_usage (standard API) response = ce_client.get_cost_and_usage( TimePeriod={ 'Start': start_date, 'End': end_date }, Granularity='DAILY', Filter={ 'Dimensions': { 'Key': 'SERVICE', 'Values': [ 'Amazon Elastic Compute Cloud - Compute' ] } }, Metrics=[ 'UnblendedCost', 'UsageQuantity' ], GroupBy=[ { 'Type': 'DIMENSION', 'Key': 'INSTANCE_TYPE' } ] ) # Process and print the results print(f"EC2 Spend from {start_date} to {end_date}:") print("-" * 50) total_cost = 0.0 if 'ResultsByTime' in response and response['ResultsByTime']: time_period_data = response['ResultsByTime'][0] if 'Groups' in time_period_data: for group in time_period_data['Groups']: instance_type = group['Keys'][0] cost = float(group['Metrics']['UnblendedCost']['Amount']) currency = group['Metrics']['UnblendedCost']['Unit'] usage = float(group['Metrics']['UsageQuantity']['Amount']) print(f"Instance Type: {instance_type}") print(f"Cost: {cost:.4f} {currency}") print(f"Usage: {usage:.2f}") print("-" * 30) total_cost += cost # If no instance-level breakdown, show total if not time_period_data.get('Groups'): if 'Total' in time_period_data: total = time_period_data['Total'] cost = float(total['UnblendedCost']['Amount']) currency = total['UnblendedCost']['Unit'] print(f"Total EC2 Cost: {cost:.4f} {currency}") else: print("No EC2 costs found for this period") else: print(f"Total EC2 Cost: {total_cost:.4f} {currency if 'currency' in locals() else 'USD'}") # Check if results are estimated if 'Estimated' in time_period_data: print(f"Note: These results are {'estimated' if time_period_data['Estimated'] else 'final'}") return response except Exception as e: print(f"Error retrieving EC2 cost data: {str(e)}") return None
  • Pydantic model defining input schema for EC2 tools including days (default 1), region (default us-east-1), and optional aws_account_id.
    class EC2Params(BaseModel): """Parameters for retrieving EC2 Cost Explorer information.""" days: int = Field( default=1, description="Number of days to look back for Bedrock logs", ge=1, le=90 ) region: str = Field( default="us-east-1", description="AWS region to retrieve logs from" ) aws_account_id: Optional[str] = Field( description="AWS account id (if different from the current AWS account) of the account for which to get the cost data", default=None )
  • Utility function to create boto3 clients for AWS services like 'ce' (Cost Explorer), supporting cross-account access via role assumption.
    def get_aws_service_boto3_client(service: str, aws_account_id: Optional[str], region_name: str, account_b_role_name: Optional[str] = CROSS_ACCOUNT_ROLE_NAME): """ Creates a boto3 client for the specified service in this current AWS account or in a different account if an account id is specified. Args: service (str): AWS service name (e.g., 'logs', 'cloudwatch') region_name (str): AWS region (e.g. 'us-east-1') aws_account_id (str): AWS account ID to access, this is the account in which the role is to be assumed account_b_role_name (str): IAM role name to assume Returns: boto3.client: Service client with assumed role credentials """ try: this_account = boto3.client('sts').get_caller_identity()['Account'] if aws_account_id is not None and this_account != aws_account_id: # the request is for a different account, we need to assume a role in that account print(f"Request is for a different account: {aws_account_id}, current account: {this_account}") # Create STS client sts_client = boto3.client('sts') current_identity = sts_client.get_caller_identity() print(f"Current identity: {current_identity}") # Define the role ARN role_arn = f"arn:aws:iam::{aws_account_id}:role/{account_b_role_name}" print(f"Attempting to assume role: {role_arn}") # Assume the role assumed_role = sts_client.assume_role( RoleArn=role_arn, RoleSessionName="CrossAccountSession" ) # Extract temporary credentials credentials = assumed_role['Credentials'] # Create client with assumed role credentials client = boto3.client( service, region_name=region_name, aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'] ) print(f"Successfully created cross-account client for {service} in account {aws_account_id}") return client else: client = boto3.client( service, region_name=region_name ) print(f"Successfully created client for {service} in the current AWS account {this_account}") return client except Exception as e: print(f"Error creating cross-account client for {service}: {e}") raise e
  • server.py:644-644 (registration)
    The @mcp.tool() decorator registers the get_ec2_spend_last_day function as an MCP tool.
    @mcp.tool()

Other Tools

Related Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/aarora79/aws-cost-explorer-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server