Skip to main content
Glama
lt012071

Firebase DAM MCP Server

by lt012071
README.md
# Firebase MCP Server

A Model Context Protocol (MCP) server implementation for accessing Firebase Firestore and Storage, built with Python and FastMCP.

## Overview

This MCP server provides secure access to Firebase Firestore collections and Storage buckets through MCP-compliant tools. It's designed specifically for a Digital Asset Management (DAM) system with predefined collections and access patterns.

## Features

- **MCP Protocol Compliance**: Fully compliant with the official MCP specification
- **Firestore Access**: Query `assets`, `versions`, and `comments` collections
- **Storage Access**: Search files in the Firebase Storage bucket
- **Flexible Filtering**: Support for various filter operators including date ranges
- **Dual Transport**: Support for both stdio and HTTP transports
- **Docker Support**: Containerized deployment with Docker
- **Security**: Service account-based authentication with restricted access

## Installation

### Prerequisites

- Python 3.11 or higher
- Firebase project with Firestore and Storage enabled
- Google Cloud service account with appropriate permissions

### Dependencies

```bash
pip install -r requirements.txt
```

### Required Python Packages

- `fastmcp>=0.1.0`
- `firebase-admin>=6.5.0`
- `python-dateutil>=2.8.2`
- `typing-extensions>=4.9.0`

## Usage

### Command Line

```bash
# Run with stdio transport (for MCP clients)
python main.py --google-credentials /path/to/service-account.json --transport stdio

# Run with HTTP transport (for web access)
python main.py --google-credentials /path/to/service-account.json --transport http --host 0.0.0.0 --port 8000

# Enable debug logging
python main.py --google-credentials /path/to/service-account.json --debug
```

### Docker

```bash
# Build the image
docker build -t firebase-mcp-server .

# Run with docker-compose
docker-compose up -d

# Run manually
docker run -p 8000:8000 -v /path/to/credentials.json:/app/credentials.json firebase-mcp-server
```

## Configuration

### Claude Desktop

Add to your `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "firebase-dam": {
      "command": "python",
      "args": [
        "/path/to/mcp-server/main.py",
        "--google-credentials",
        "/path/to/your/service-account-credentials.json",
        "--transport",
        "stdio"
      ],
      "env": {
        "PYTHONPATH": "/path/to/mcp-server"
      }
    }
  }
}
```

### Service Account Setup

⚠️ **SECURITY WARNING**: Never commit credentials files to version control!

1. Create a service account in your Firebase project
2. Download the JSON credentials file
3. Copy `credentials.json.example` to `credentials.json` and fill in your actual values
4. Grant the service account the following permissions:
   - Firestore: `Firebase Rules System`, `Cloud Datastore User`
   - Storage: `Storage Object Viewer`

## Available Tools

### search_assets

Search assets in the Firestore assets collection.

**Schema:**
- `id`: string - Unique asset identifier
- `title`: string - Asset title
- `description`: string - Asset description
- `category`: string - Asset category
- `tags`: string[] - Array of tags
- `uploader`: string - User ID who uploaded
- `uploadedAt`: string - ISO8601 timestamp
- `updatedAt`: string - ISO8601 timestamp
- `visibility`: 'public' | 'private'
- `latestVersionId`: string (optional)

**Example:**
```json
{
  "category": "image",
  "tags": ["banner"],
  "visibility": "public",
  "uploadedAt": ">=2024-06-01"
}
```

### search_versions

Search versions in the Firestore versions collection.

**Schema:**
- `id`: string - Unique version identifier
- `assetId`: string - Parent asset ID
- `version`: string - Version identifier
- `fileUrl`: string - URL to the file
- `fileName`: string - Original filename
- `fileType`: string - MIME type
- `fileSize`: number - File size in bytes
- `updatedAt`: string - ISO8601 timestamp
- `updatedBy`: string - User ID who updated

**Example:**
```json
{
  "assetId": "asset123",
  "fileType": "image/png",
  "updatedAt": ">=2024-06-01"
}
```

### search_comments

Search comments in the Firestore comments collection.

**Schema:**
- `id`: string - Unique comment identifier
- `assetId`: string - Asset being commented on
- `user`: string - User ID who commented
- `text`: string - Comment text
- `createdAt`: string - ISO8601 timestamp

**Example:**
```json
{
  "assetId": "asset123",
  "user": "user456",
  "createdAt": ">=2024-06-01"
}
```

### search_asset_files

Search files in the Firebase Storage bucket.

**Returns:**
- `name`: string - Full file path
- `size`: number - File size in bytes
- `contentType`: string - MIME type
- `uploadedAt`: string - ISO8601 timestamp
- `downloadUrl`: string - Public URL
- `etag`: string - ETag for versioning
- `generation`: number - File generation

**Example:**
```json
{
  "prefix": "assets/",
  "contentType": "image/png",
  "uploadedAt": ">=2024-06-01"
}
```

## Filter Operators

- `==` - Equality (default)
- `>=` - Greater than or equal (for dates)
- `<=` - Less than or equal (for dates)
- `array_contains_any` - Array contains any of the values
- `in` - Value is in the provided array

## Architecture

```
src/
├── mcp_server_firebase/
│   ├── __init__.py
│   ├── server.py          # FastMCP server with tools
│   └── firebase_client.py # Firebase client wrapper
├── main.py                # Entry point
├── requirements.txt       # Python dependencies
├── Dockerfile            # Container configuration
├── docker-compose.yml    # Docker Compose setup
└── examples/             # Configuration examples
```

## Security Notes

- Collections and bucket names are hardcoded in the source code
- Access is restricted to read-only operations
- Service account credentials are required for authentication
- No sensitive data is logged or exposed

## Development

### Setup Development Environment

```bash
# Clone the repository
git clone https://github.com/lt012071/dam-firebase-mcp-server.git
cd dam-firebase-mcp-server

# Install development dependencies
make install-dev

# Or manually:
pip install -r requirements.txt
pip install -r requirements-dev.txt
pre-commit install
```

### Running Tests

```bash
# Run all unit tests (recommended for development)
make test
# or: pytest tests/unit/ -v -m "unit"

# Run integration tests
make test-integration
# or: pytest tests/integration/ -v -m "integration and not slow"

# Run all tests with coverage
make test-all
# or: pytest tests/ --cov=src --cov-report=html

# Run slow tests (only on CI)
make test-slow
# or: pytest tests/integration/ -v -m "slow"

# Run tests in watch mode (for development)
make test-watch
```

### Code Quality

```bash
# Format code
make format
# or: black src/ tests/ && isort src/ tests/

# Run linting
make lint
# or: flake8 src/ tests/

# Type checking
make type-check
# or: mypy src/ --ignore-missing-imports

# Security scanning
make security
# or: bandit -r src/ && safety check

# Run all quality checks
make quality

# Run pre-commit hooks
make pre-commit
```

### Test Coverage

```bash
# Generate HTML coverage report
make coverage-html
# Open htmlcov/index.html in browser

# Generate XML coverage report (for CI)
make coverage-xml
```

### Docker Testing

```bash
# Build and test Docker image
make docker-build
make docker-test

# Run with docker-compose
make docker-compose-up
```

### Test Categories

- **Unit Tests** (`tests/unit/`): Fast tests with mocked dependencies
- **Integration Tests** (`tests/integration/`): Tests MCP protocol communication  
- **Slow Tests** (marked with `@pytest.mark.slow`): Performance and stress tests

### Writing Tests

```python
# Unit test example
@pytest.mark.unit
def test_firebase_client_init(test_credentials_file):
    client = FirebaseClient(test_credentials_file)
    assert client.credentials_path == test_credentials_file

# Integration test example  
@pytest.mark.integration
@pytest.mark.asyncio
async def test_mcp_tool_via_protocol(test_credentials_file):
    # Test actual MCP communication
    pass

# Slow test example
@pytest.mark.slow
@pytest.mark.integration
async def test_large_dataset_handling():
    # Performance test with large datasets
    pass
```

### Continuous Integration

Tests run automatically on:
- Push to `main`/`master` branch
- Pull request creation
- Multiple Python versions (3.10, 3.11, 3.12)

The CI pipeline includes:
- Unit tests with coverage
- Integration tests
- Code quality checks (linting, typing, security)
- Docker build verification

## Troubleshooting

### Common Issues

1. **Credentials not found**: Ensure the service account JSON file path is correct
2. **Permission denied**: Verify the service account has the required Firebase permissions
3. **Connection issues**: Check network connectivity and Firebase project settings
4. **Import errors**: Ensure all dependencies are installed correctly

### Debug Mode

Enable debug logging to see detailed operation logs:

```bash
python main.py --google-credentials /path/to/credentials.json --debug
```

## License

This project is licensed under the MIT License.

Maintenance

ActivityInactive
ResponsivenessNo issues