# Fantasy Premier League ![kotlin-version](https://img.shields.io/badge/kotlin-2.4.10-blue?logo=kotlin) **Compose Multiplatform** project running on following * Android * iOS * Desktop Also includes * AI agent built with [Koog](https://github.com/JetBrains/koog) (Gemini + tool calling, running in shared KMP code) * Kotlin Notebook * MCP Server It also currently makes use of the following Jetpack libraries * ViewModel * Navigation 3 * Room * DataStore Related posts: * [Using Realm persistence library in a Kotlin Multiplatform project](https://johnoreilly.dev/posts/realm-kotlinmultiplatform/) * [Using new Swift Async Algorithms package to close the gap on Combine](https://johnoreilly.dev/posts/swift-async-algorithms-combine/) * [Displaying Charts on iOS, Android, and Desktop using Compose Multiplatform](https://johnoreilly.dev/posts/compose-multiplatform-chart/) * [Using Jetpack Room in Kotlin Multiplatform shared code](https://johnoreilly.dev/posts/jetpack_room_kmp/) * [Using Navigation 3 with Compose Multiplatform](https://johnoreilly.dev/posts/navigation3-cmp/) * [Adding a Koog AI assistant (with structured output) to the FantasyPremierLeague CMP sample](https://johnoreilly.dev/posts/fpl-koog-structured-output/) ## Running the app * **Android**: open the project in Android Studio and run the `app` configuration * **iOS**: open `ios/FantasyPremierLeague/FantasyPremierLeague.xcodeproj` in Xcode and run * **Desktop**: `./gradlew :compose-desktop:run` * **MCP Server**: `./gradlew :mcp-server:shadowJar` (see MCP Server section below) Note: to use the AI agent you need a Gemini API key — set `apiKeyGoogle` in `FantasyPremierLeagueAgent`. ## Screenshots ### Android Screenshot_20251101_204058 ### iOS Simulator Screenshot - iPhone 17 Pro - 2025-11-01 at 20 37 58 ### Desktop Screenshot 2025-11-01 at 20 38 24 ### Kotlin Notebook Screenshot 2024-04-06 at 11 03 15 Screenshot 2024-04-06 at 11 03 36 **MCP Server** The `mcp-server` module uses the [Kotlin MCP SDK](https://github.com/modelcontextprotocol/kotlin-sdk) to expose an MCP tools endpoint (returning player/fixture info) that can for example be plugged in to Claude Desktop as shown below. That module uses same KMP shared code. Screenshot 2025-07-16 at 21 17 33 To integrate the MCP server with Claude Desktop for example you need to firstly run gradle `shadowJar` task and then select "Edit Config" under Developer Settings and add something like the following (update with your path) ``` { "mcpServers": { "fantasy-premier-league": { "command": "java", "args": [ "-jar", "/Users/john.oreilly/github/FantasyPremierLeague/mcp-server/build/libs/serverAll.jar", "--stdio" ] } } } ``` ### UI tests There's a [Maestro](https://maestro.mobile.dev/) UI test flow shared by the Android and iOS clients, run by CI on an emulator and a simulator (e.g. `maestro test -e APP_ID=dev.johnoreilly.fantasypremierleague maestro/FantasyPremierLeague.flow`). ## Full set of Kotlin Multiplatform/Compose/SwiftUI samples * PeopleInSpace (https://github.com/joreilly/PeopleInSpace) * GalwayBus (https://github.com/joreilly/GalwayBus) * Confetti (https://github.com/joreilly/Confetti) * BikeShare (https://github.com/joreilly/BikeShare) * FantasyPremierLeague (https://github.com/joreilly/FantasyPremierLeague) * ClimateTrace (https://github.com/joreilly/ClimateTraceKMP) * GeminiKMP (https://github.com/joreilly/GeminiKMP) * MortyComposeKMM (https://github.com/joreilly/MortyComposeKMM) * StarWars (https://github.com/joreilly/StarWars) * WordMasterKMP (https://github.com/joreilly/WordMasterKMP) * Chip-8 (https://github.com/joreilly/chip-8)