Skip to content

feat(lox-mcp): migrate to Kotlin Multiplatform (KMP)#30

Merged
knotekt merged 4 commits into
mainfrom
knot/kmp
Jun 9, 2026
Merged

feat(lox-mcp): migrate to Kotlin Multiplatform (KMP)#30
knotekt merged 4 commits into
mainfrom
knot/kmp

Conversation

@knotekt

@knotekt knotekt commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Migrate lox-mcp from JVM-only Gradle project to Kotlin Multiplatform (KMP)
  • Add JVM and Linux native (x64/arm64) targets
  • Fix build configuration, decompression algorithm, HTTP client timeout, and test source sets

Changes

  • build.gradle.kts — Switch to KMP plugin, add JVM + Linux targets, configure shadowJar and processResources task dependencies for both Linux targets
  • src/commonMain/kotlin/LoxCC.kt — Replace O(n²) buffer copy loop with O(1) ByteArray.copyInto back-reference algorithm; remove @file:Suppress("ClassName")
  • src/commonMain/kotlin/loxonedocs/LoxoneDocsProvider.kt — Add HttpTimeout plugin to Ktor client; wrap downloadFromUrl in runBlocking(Dispatchers.Default) { withTimeout(...) }
  • src/linuxMain/kotlin/Platform.linux.kt — Remove redundant .toLong() casts
  • src/jvmTest/kotlin/ — Move all test files from commonTest to jvmTest (tests use JVM-only dependencies: mockk, kotest, java.util.zip, java.nio)

Task

task: SHS-1298

Copilot AI review requested due to automatic review settings June 8, 2026 18:22

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR migrates lox-mcp from a JVM-only Gradle project to Kotlin Multiplatform (KMP), aiming to support JVM plus Linux native (x64/arm64) while refactoring core MCP registration/config loading, LoxCC decompression, and docs fetching into common code.

Changes:

  • Migrates build + sources to KMP (commonMain/jvmMain/linuxMain) and updates dependency versions/catalog entries.
  • Introduces platform abstractions (Platform.kt) and moves MCP YAML config into commonMain/resources.
  • Refactors core server pieces (tools/resources registries, dynamic handlers) and adds/relocates JVM-only tests into jvmTest.

Reviewed changes

Copilot reviewed 21 out of 37 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
src/main/resources/mcp-config.yaml Removed old JVM-only embedded MCP config YAML.
src/commonMain/resources/mcp-config.yaml Added new shared MCP config YAML for KMP builds.
src/main/kotlin/LoxoneXmlProcessor.kt Removed old JVM-only XML processor implementation.
src/commonMain/kotlin/LoxoneXmlProcessor.kt Reintroduced XML sanitization in common code; delegates slimming to platform actual.
src/jvmMain/kotlin/slimXml.jvm.kt Adds JVM actual XML slimming implementation using DOM.
src/linuxMain/kotlin/Platform.linux.kt Adds Linux actual implementations for env/stdin/stdout/shutdown/resources/xml slimming (currently stubbed for resources + slimming).
src/jvmMain/kotlin/Platform.jvm.kt Adds JVM actual implementations for env/stdin/stdout/shutdown/resource loading.
src/commonMain/kotlin/Platform.kt Introduces expect/actual API for env, IO, shutdown, resources, and XML slimming.
src/main/kotlin/LoxCC.kt Removed old JVM-only LoxCC decompressor.
src/commonMain/kotlin/LoxCC.kt Adds KMP-friendly LoxCC decompressor (byte-array based).
src/commonMain/kotlin/server/McpServer.kt Switches stdio transport to platform stdin/stdout sources/sinks.
src/commonMain/kotlin/server/ToolsRegistry.kt New tool registry: loads YAML tools + registers built-in get_loxone_xml.
src/commonMain/kotlin/server/ResourcesRegistry.kt New resource registry driven by YAML config.
src/commonMain/kotlin/server/ResourcesAsToolsRegistry.kt Adds optional “resources as tools” compatibility layer.
src/commonMain/kotlin/server/GetLoxoneXmlHandler.kt Updates ZIP extraction to use kmp-zip + KMP-friendly decoding.
src/commonMain/kotlin/server/DynamicToolHandler.kt Minor safety cleanup (removes unnecessary !! for defaults).
src/commonMain/kotlin/server/DynamicResourceHandler.kt URL decoding + locale handling adjusted for KMP (ktor decodeURLPart, uppercase()).
src/commonMain/kotlin/server/LoxoneQueryHelper.kt Adds shared query helpers for rooms/categories/controls and JSON formatting.
src/commonMain/kotlin/loxonedocs/Models.kt Adds serializable docs models for parsed structure-file docs.
src/commonMain/kotlin/loxonedocs/LoxoneDocsProvider.kt Moves from Java HttpClient to Ktor client; adds timeouts; loads docs via readResourceBytes.
src/commonMain/kotlin/LoxoneAdapter.kt Adds KMP-compatible adapter wrapper around loxone-client-kotlin APIs.
src/commonMain/kotlin/credentials/CredentialSource.kt Switches env var reads to platform getEnv.
src/commonMain/kotlin/credentials/CredentialResolver.kt Adds CLI-based credential source resolution.
src/commonMain/kotlin/config/Models.kt Adds serializable YAML config model types.
src/commonMain/kotlin/config/McpServerProperties.kt Adds cached runtime properties + config loading orchestration.
src/commonMain/kotlin/config/ConfigLoader.kt Moves YAML parsing to yamlkt + uses platform FS/resource reads.
src/commonMain/kotlin/Constants.kt Switches versioning to generated SERVER_VERSION constant.
src/commonMain/kotlin/Application.kt Switches HTTP engine Netty→CIO and shutdown hook to platform callback.
src/jvmTest/kotlin/server/LoxoneQueryHelperTest.kt Adds unit tests for room/category lookup helpers.
src/jvmTest/kotlin/server/GetLoxoneXmlHandlerTest.kt Adds LoxCC backref tests + get_loxone_xml handler tests incl. ZIP cases.
src/jvmTest/kotlin/server/DynamicResourceHandlerStatisticsTest.kt Adds tests for statistics resource parsing/validation/success paths.
src/jvmTest/kotlin/loxonedocs/LoxoneDocsProviderTest.kt Adds docs version parsing/resolution tests.
src/jvmTest/kotlin/LoxoneAdapterTest.kt Adds tests for address type resolution.
src/jvmTest/kotlin/credentials/CredentialResolverTest.kt Adds tests for credential source resolution and error cases.
src/jvmTest/kotlin/config/ConfigLoaderTest.kt Updates YAML parsing library usage and expected URIs.
gradle/libs.versions.toml Updates Kotlin/Ktor/coroutines versions; adds KMP-related libs (yamlkt, okio, kmp-zip, etc.).
build.gradle.kts Migrates to Kotlin Multiplatform plugin, adds JVM + Linux targets, generated version source, and resource wiring for docs.

Comment thread src/linuxMain/kotlin/Platform.linux.kt
Comment thread src/linuxMain/kotlin/Platform.linux.kt Outdated
Comment thread src/linuxMain/kotlin/Platform.linux.kt Outdated
Comment thread src/commonMain/kotlin/LoxCC.kt
@knotekt knotekt requested a review from jimirocks June 8, 2026 20:14

@jimirocks jimirocks left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Opravte 4 kritické issues (data loss, null resource loading, no-op slimXml, bounds errors) a zvažte graceful shutdown nuance na Linux signal handleru.

Comment thread src/linuxMain/kotlin/Platform.linux.kt
Comment thread src/linuxMain/kotlin/Platform.linux.kt Outdated
Comment thread src/linuxMain/kotlin/Platform.linux.kt Outdated
Comment thread src/commonMain/kotlin/LoxCC.kt
Comment thread src/linuxMain/kotlin/Platform.linux.kt Outdated
@knotekt knotekt merged commit 86c8885 into main Jun 9, 2026
5 checks passed
@knotekt knotekt deleted the knot/kmp branch June 9, 2026 16:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants