# Component 3: Dimension Explorer

**Type:** Utility (MCP Server / CLI / Reference)
**Priority:** P1
**Status:** Not Started

## Goal

Validate GA4 dimensions and metrics with detailed explanations.

## Features

- List all available dimensions/metrics
- Validate if a dimension/metric exists
- Get description, data type, category
- Fuzzy search for typos
- Compatibility checking

## Implementation Options

| Option | Approach | Effort |
|--------|----------|--------|
| A | Reference JSON in skill | Low |
| B | CLI tool | Low |
| C | MCP Server | Medium |

**Recommendation:** Start with A, upgrade to C later.

## Structure

```
03-dimension-explorer/
├── README.md
├── fetch_metadata.py       # Fetch from GA4 Admin API
├── data/
│   ├── dimensions.json     # All dimensions
│   └── metrics.json        # All metrics
├── explorer.py             # CLI tool (optional)
└── requirements.txt
```

## Data Format

### dimensions.json

```json
{
  "dimensions": [
    {
      "apiName": "sessionSource",
      "uiName": "Session source",
      "description": "The source that initiated a session",
      "category": "Traffic source",
      "deprecatedApiNames": []
    }
  ]
}
```

### metrics.json

```json
{
  "metrics": [
    {
      "apiName": "activeUsers",
      "uiName": "Active users",
      "description": "Number of distinct users who visited",
      "category": "User",
      "type": "TYPE_INTEGER",
      "expression": ""
    }
  ]
}
```

## fetch_metadata.py

```python
from google.analytics.admin import AnalyticsAdminServiceClient

def fetch_metadata(property_id: str):
    """Fetch all dimensions and metrics for a property."""
    client = AnalyticsAdminServiceClient()

    # Get metadata
    metadata = client.get_metadata(
        name=f"properties/{property_id}/metadata"
    )

    dimensions = [
        {
            "apiName": d.api_name,
            "uiName": d.ui_name,
            "description": d.description,
            "category": d.category,
        }
        for d in metadata.dimensions
    ]

    metrics = [
        {
            "apiName": m.api_name,
            "uiName": m.ui_name,
            "description": m.description,
            "category": m.category,
            "type": m.type_.name,
        }
        for m in metadata.metrics
    ]

    return {"dimensions": dimensions, "metrics": metrics}
```

## Usage

### As Reference (Option A)

Include `data/dimensions.json` and `data/metrics.json` in the GA Agent skill's `references/` folder.

### As CLI (Option B)

```bash
# Validate a dimension
python explorer.py validate --dimension sessionSource

# Search for metrics
python explorer.py search --query "user"

# List by category
python explorer.py list --category "Traffic source"
```

### As MCP Server (Option C)

```bash
# Run server
python server.py

# Claude can use tools like:
# - validate_dimension
# - validate_metric
# - search_metadata
# - list_by_category
```

## Checklist

- [ ] fetch_metadata.py created
- [ ] Metadata fetched and saved
- [ ] dimensions.json generated
- [ ] metrics.json generated
- [ ] explorer.py (optional)
- [ ] Integrated with GA Agent skill
