# GeoGuessr MCP Server A Model Context Protocol (MCP) server for analyzing GeoGuessr game statistics with **automatic API monitoring** and **dynamic schema adaptation**. ## ๐ŸŒŸ Key Features ### Dynamic API Monitoring - **Automatic endpoint discovery**: Monitors GeoGuessr API endpoints daily - **Schema change detection**: Automatically detects when API response formats change - **Self-adapting**: Updates internal data models based on actual API responses - **No hardcoded assumptions**: Works even when GeoGuessr changes their API ### Comprehensive Analysis - Profile and statistics retrieval - Game history and round-by-round analysis - Performance tracking and trend detection - Strategy recommendations based on gameplay patterns ### Easy Deployment - Docker Compose for simple VPS deployment - Production-ready with nginx and SSL support - Persistent schema caching between restarts ## ๐Ÿš€ Quick Start ### Prerequisites - Docker and Docker Compose - A GeoGuessr account ### 1. Clone and Configure ```bash git clone https://github.com/yourusername/geoguessr-mcp.git cd geoguessr-mcp cp .env.example .env ``` ### 2. Deploy ```bash docker compose up -d --build ``` That's it! The server is now running on port 8000. ### 3. Connect to Claude Add to your Claude Desktop configuration: **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json` **Windows:** `%APPDATA%\Claude\claude_desktop_config.json` ```json { "mcpServers": { "geoguessr": { "type": "streamable-http", "url": "http://YOUR_VPS_IP:8000/mcp" } } } ``` ## ๐Ÿ” Authentication The server supports multiple authentication methods: ### Option 1: Login via Claude (Recommended) Simply ask Claude: > "Login to GeoGuessr with email: myemail@example.com and password: mypassword" ### Option 2: Environment Variable Add to your `.env` file: ```bash GEOGUESSR_NCFA_COOKIE=your_cookie_value_here ``` ### Option 3: Manual Cookie Use the `set_ncfa_cookie` tool with a cookie extracted from your browser. ## ๐Ÿ“Š Available Tools ### Authentication | Tool | Description | |------|-------------| | `login` | Authenticate with email/password | | `logout` | End current session | | `set_ncfa_cookie` | Set authentication cookie manually | | `get_auth_status` | Check authentication status | ### Profile & Stats | Tool | Description | |------|-------------| | `get_my_profile` | Get your profile information | | `get_my_stats` | Get your game statistics | | `get_extended_stats` | Get additional statistics | | `get_achievements` | Get your achievements | | `get_comprehensive_profile` | Get combined profile data | ### Games & Activity | Tool | Description | |------|-------------| | `get_activity_feed` | Get recent activity | | `get_recent_games` | Get recent games with details | | `get_game_details` | Get specific game information | | `get_season_stats` | Get competitive season stats | | `get_daily_challenge` | Get daily challenge info | ### Analysis | Tool | Description | |------|-------------| | `analyze_recent_games` | Analyze performance trends | | `get_performance_summary` | Comprehensive performance overview | | `get_strategy_recommendations` | Get personalized improvement tips | ### API Monitoring | Tool | Description | |------|-------------| | `check_api_status` | Check all endpoint availability | | `get_endpoint_schema` | Get schema for specific endpoint | | `list_available_endpoints` | List all known endpoints | | `explore_endpoint` | Discover new API endpoints | ## ๐Ÿ”„ Dynamic Schema System The server automatically adapts to API changes: ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ API Response โ”‚ โ”€โ”€โ”€โ–ถ โ”‚ Schema Detector โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Schema Registry โ”‚ โ—€โ”€โ”€โ”€ โ”‚ Compare Hash โ”‚ โ”‚ (Persisted) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Dynamic Response โ”‚ โ”€โ”€โ”€โ–ถ Available to LLM โ”‚ with Schema Info โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### How It Works 1. **Daily Monitoring**: The server checks all known endpoints every 24 hours 2. **Schema Detection**: Analyzes response structure, field types, and nesting 3. **Change Detection**: Computes schema hash to detect modifications 4. **Persistence**: Schemas are cached to disk and survive restarts 5. **Dynamic Access**: Tools return data with schema information for the LLM ### Example: Exploring Unknown Endpoints ``` User: "Can you explore the /v3/some-new-endpoint API?" Claude uses explore_endpoint tool: { "success": true, "discovered_fields": ["id", "name", "data", "timestamp"], "schema_description": "Endpoint: /v3/some-new-endpoint\nFields:\n - id: string\n - name: string\n - data: object\n - timestamp: datetime" } ``` ## ๐Ÿญ Production Deployment ### With SSL (Recommended) 1. Create SSL certificates: ```bash mkdir -p nginx/ssl # Add your certificates: # nginx/ssl/fullchain.pem # nginx/ssl/privkey.pem ``` 2. Deploy with production compose: ```bash docker compose -f docker-compose.prod.yml up -d ``` ### Environment Variables | Variable | Default | Description | |----------|---------|-------------| | `GEOGUESSR_NCFA_COOKIE` | - | Default authentication cookie | | `MCP_PORT` | 8000 | Server port | | `MCP_TRANSPORT` | streamable-http | MCP transport protocol | | `MONITORING_ENABLED` | true | Enable API monitoring | | `MONITORING_INTERVAL_HOURS` | 24 | Monitoring check interval | | `LOG_LEVEL` | INFO | Logging verbosity | ## ๐Ÿงช Development ### Local Development ```bash # Create virtual environment python -m venv venv source venv/bin/activate # Install dependencies pip install -r requirements-dev.txt # Run tests pytest -v # Run server locally python -m geoguessr_mcp.main ``` ### Project Structure ``` geoguessr-mcp/ โ”œโ”€โ”€ src/geoguessr_mcp/ โ”‚ โ”œโ”€โ”€ api/ # API client and endpoints โ”‚ โ”œโ”€โ”€ auth/ # Authentication โ”‚ โ”œโ”€โ”€ models/ # Data models โ”‚ โ”œโ”€โ”€ monitoring/ # Schema detection & monitoring โ”‚ โ”œโ”€โ”€ services/ # Business logic โ”‚ โ”œโ”€โ”€ tools/ # MCP tool definitions โ”‚ โ”œโ”€โ”€ config.py # Configuration โ”‚ โ””โ”€โ”€ main.py # Entry point โ”œโ”€โ”€ tests/ โ”‚ โ”œโ”€โ”€ unit/ # Unit tests โ”‚ โ””โ”€โ”€ integration/ # Integration tests โ”œโ”€โ”€ nginx/ # Production nginx config โ”œโ”€โ”€ docker-compose.yml # Development deployment โ”œโ”€โ”€ docker-compose.prod.yml # Production deployment โ””โ”€โ”€ Dockerfile ``` ## ๐Ÿค Contributing Contributions are welcome! Please: 1. Fork the repository 2. Create a feature branch 3. Add tests for new functionality 4. Submit a pull request ## ๐Ÿ“ License MIT License - see LICENSE file for details. ## โš ๏ธ Disclaimer This project uses the unofficial GeoGuessr API which may change without notice. The dynamic schema system helps mitigate this, but some features may break if GeoGuessr makes significant API changes. This project is not affiliated with GeoGuessr AB.