# Fantasy Premier League

**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
### iOS
### Desktop
### Kotlin Notebook
**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.
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)