Skip to main content
Glama
prmichaelsen

Eventbrite MCP Server

by prmichaelsen
README.md
# Eventbrite MCP Server

Multi-tenant Eventbrite MCP server with Firebase authentication, wrapping [@prmichaelsen/eventbrite-mcp](https://www.npmjs.com/package/@prmichaelsen/eventbrite-mcp).

## Overview

This server provides a multi-tenant Model Context Protocol (MCP) interface to the Eventbrite API. It uses:

- **Firebase Authentication** for user identity verification
- **Platform API** for secure credential management
- **@prmichaelsen/mcp-auth** for authentication wrapping
- **@prmichaelsen/eventbrite-mcp** as the base MCP server

## Architecture

```
Client (Firebase JWT)
  ↓
Firebase Auth Provider (validates JWT → userId)
  ↓
Platform Token Resolver (userId → Eventbrite token via platform)
  ↓
Eventbrite MCP Server (executes tools)
  ↓
Eventbrite API
```

## Prerequisites

- Node.js 20+
- Firebase project with authentication enabled
- Platform API that implements the credentials endpoint
- Eventbrite OAuth tokens stored in your platform

## Installation

```bash
npm install
```

## Configuration

Copy [`.env.example`](.env.example) to `.env` and configure:

```env
# Firebase (for JWT validation)
FIREBASE_PROJECT_ID=your-firebase-project-id

# Platform API (for token resolution)
PLATFORM_URL=https://your-platform.com
PLATFORM_SERVICE_TOKEN=your-service-token

# Server
PORT=8080
NODE_ENV=development
LOG_LEVEL=info
```

### Environment Variables

| Variable | Required | Description |
|----------|----------|-------------|
| `FIREBASE_PROJECT_ID` | Yes | Firebase project ID for JWT validation |
| `PLATFORM_URL` | Yes | Base URL of your platform API |
| `PLATFORM_SERVICE_TOKEN` | Yes | Service token for platform API authentication |
| `PORT` | No | Server port (default: 8080) |
| `NODE_ENV` | No | Environment (development/production) |
| `LOG_LEVEL` | No | Logging level (default: info) |

## Development

```bash
# Install dependencies
npm install

# Run in development mode with hot reload
npm run dev

# Build TypeScript
npm run build

# Run production build
npm start
```

## Docker

### Build

```bash
docker build -t eventbrite-mcp-server .
```

### Run

```bash
docker run -p 8080:8080 \
  -e FIREBASE_PROJECT_ID=your-project \
  -e PLATFORM_URL=https://your-platform.com \
  -e PLATFORM_SERVICE_TOKEN=your-token \
  eventbrite-mcp-server
```

## Deployment

### Google Cloud Run

```bash
# Build and push to GCR
docker build -t gcr.io/YOUR_PROJECT/eventbrite-mcp-server:latest .
docker push gcr.io/YOUR_PROJECT/eventbrite-mcp-server:latest

# Generate service token
SERVICE_TOKEN=$(node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))")

# Create secret
echo -n "$SERVICE_TOKEN" | gcloud secrets create platform-service-token --data-file=-

# Deploy
gcloud run deploy eventbrite-mcp-server \
  --image gcr.io/YOUR_PROJECT/eventbrite-mcp-server:latest \
  --region us-central1 \
  --allow-unauthenticated \
  --set-env-vars="FIREBASE_PROJECT_ID=your-project,PLATFORM_URL=https://your-platform.com,NODE_ENV=production" \
  --update-secrets=PLATFORM_SERVICE_TOKEN=platform-service-token:latest \
  --min-instances=0 \
  --max-instances=10 \
  --memory=512Mi \
  --cpu=1
```

## API Endpoints

### Health Check

```bash
GET /mcp/health
```

### MCP Message Endpoint

```bash
POST /mcp/message
Authorization: Bearer <firebase-jwt>
Content-Type: application/json

{
  "jsonrpc": "2.0",
  "method": "tools/list",
  "id": 1
}
```

## Testing

### Local Testing

```bash
# Start server
npm start

# Test health endpoint
curl http://localhost:8080/mcp/health

# Test with Firebase JWT
curl -X POST http://localhost:8080/mcp/message \
  -H "Authorization: Bearer <firebase-jwt>" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
```

### Production Testing

```bash
curl -X POST https://your-server.run.app/mcp/message \
  -H "Authorization: Bearer <firebase-jwt>" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
```

## Platform API Requirements

Your platform must implement the credentials endpoint:

```typescript
// GET /api/credentials/eventbrite
// Headers: 
//   Authorization: Bearer <service-token>
//   X-User-ID: <user-id>

// Response:
{
  "access_token": "user-eventbrite-token",
  "expires_at": "2024-12-31T23:59:59Z"
}
```

## Project Structure

```
eventbrite-mcp-server/
├── src/
│   ├── index.ts                    # Main server entry point
│   └── auth/
│       ├── firebase-provider.ts    # Firebase JWT validation
│       └── platform-token-resolver.ts # Platform API integration
├── agent/
│   └── patterns/
│       └── bootstrap.md            # Bootstrap pattern documentation
├── package.json
├── tsconfig.json
├── Dockerfile
├── .env.example
├── .gitignore
├── .dockerignore
└── README.md
```

## Features

- ✅ Multi-tenant architecture
- ✅ Firebase authentication
- ✅ Platform-managed credentials (secure)
- ✅ Stateless server (no database)
- ✅ Token caching for performance
- ✅ Rate limiting
- ✅ Health checks
- ✅ Docker support
- ✅ Cloud Run ready

## Security

- Firebase JWT tokens are validated on every request
- Eventbrite tokens are never exposed to clients
- Service token authenticates server-to-platform communication
- All credentials are managed by the platform API
- Rate limiting prevents abuse

## Caching

The server implements two levels of caching:

1. **Auth Cache**: Firebase JWT validation results (TTL: 60s)
2. **Token Cache**: Eventbrite access tokens (TTL: 5min)

Caching improves performance and reduces external API calls.

## Troubleshooting

### TypeScript Errors

TypeScript errors about missing modules are expected before running `npm install`. Install dependencies to resolve.

### Authentication Failures

- Verify `FIREBASE_PROJECT_ID` matches your Firebase project
- Ensure Firebase JWT is valid and not expired
- Check that the JWT is sent in the `Authorization: Bearer <token>` header

### Token Resolution Failures

- Verify `PLATFORM_URL` is correct
- Ensure `PLATFORM_SERVICE_TOKEN` is valid
- Check that user has Eventbrite credentials in the platform
- Review platform API logs for errors

## License

MIT

## Related Projects

- [@prmichaelsen/eventbrite-mcp](https://www.npmjs.com/package/@prmichaelsen/eventbrite-mcp) - Base Eventbrite MCP server
- [@prmichaelsen/mcp-auth](https://www.npmjs.com/package/@prmichaelsen/mcp-auth) - MCP authentication wrapper
- [Bootstrap Pattern](agent/patterns/bootstrap.md) - Pattern documentation

## Support

For issues or questions:
- Base MCP server: [@prmichaelsen/eventbrite-mcp issues](https://github.com/prmichaelsen/eventbrite-mcp/issues)
- This wrapper: Create an issue in this repository