🚀

MCP QuickStart の For Server Developers を Kotlin でやるときにハマったこと & 解決方法

に公開

最近何かと流行りの Model Context Protocol(以降、MCP)。ということで MCP Server の QuickStart (チュートリアル)を Kotlin でやろうと思いましてチャレンジしてみました。(へーしゃ、Server Side Kotlinを実践で使っているのでその影響です)

QuickStart↓

https://modelcontextprotocol.io/quickstart/server#kotlin

チャレンジの中でいくつかハマった(というか愚直に書いてたらエラーに遭遇した)のでエラーについてと解決策をまとめます。

1. Import がない

タイトル通り Import の記述がないので錬金しましょう。以下の通りです。

import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.plugins.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.client.request.get
import io.ktor.http.*
import io.ktor.http.headers
import io.ktor.serialization.kotlinx.json.*
import io.ktor.utils.io.streams.*
import io.modelcontextprotocol.kotlin.sdk.*
import io.modelcontextprotocol.kotlin.sdk.server.Server
import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions
import io.modelcontextprotocol.kotlin.sdk.server.StdioServerTransport
import kotlinx.coroutines.Job
import kotlinx.coroutines.runBlocking
import kotlinx.io.asSink
import kotlinx.io.buffered
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.*

ソースコードの全文は以下のリンクから確認できます。()

https://github.com/yukinissie/us-weather-mcp/blob/main/src/main/kotlin/Main.kt

2. weather-1.0-SNAPSHOT.jarにメイン・マニフェスト属性がありません

正しい Import をなんとか用意してさっそく build を実行し、できた JAR ファイルのパスを claude_desktop_config.json に以下のように設定しました。

{
  "mcpServers": {
    "weather": {
      "command": "java",
      "args": [
        "-jar",
        "/Users/yukinissie/weather/build/libs/weather-1.0-SNAPSHOT.jar"
      ]
    }
  }
}

「よっしゃ、できた早速Claudeで遊んでみるぞ!」と思ってClaude for Desktopを開いたら以下のようにエラーポップアップが出てきました。。

Claude for Desktop を開いたらエラーポップアップが。。

エラーログが見たいのでボタンをぽちぽち押していきます。

MCP設定を開くボタンをクリック

ログフォルダを開くをクリック

開発中のプロジェクト名のログを開く

2025-04-20T23:31:07.328Z [weather] [info] Message from client: {"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"claude-ai","version":"0.1.0"}},"jsonrpc":"2.0","id":0}
/Users/yuki.nishi/yukinissie/us-weather-mcp/build/libs/us-weather-mcp-1.0-SNAPSHOT.jarにメイン・マニフェスト属性がありません

>> メイン・マニフェスト属性がありません <<

設定しましょう。

plugins {
    // ...(省略)
    application
}

application {
    mainClass = "com.example.MainKt"
}

再度 build を実行すると JAR ファイルの名前が若干変わるので claude_desktop_config.json を以下のように変えておきます。

{
  "mcpServers": {
    "weather": {
      "command": "java",
      "args": [
        "-jar",
        "/Users/yukinissie/weather/build/libs/weather-1.0-SNAPSHOT-all.jar"
      ]
    }
  }
}

3. エラー: メイン・クラスcom.example.MainKtのロード中にLinkageErrorが発生しました

Claudeを再び起動すると今度は以下のエラーログが記録されていました。

エラー: メイン・クラスcom.yukinissie.MainKtのロード中にLinkageErrorが発生しました
	java.lang.UnsupportedClassVersionError: com/yukinissie/MainKt has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 55.0

これは実行しようとしているJava RuntimeがサポートしていないJava classをロードしようとした時に発生するエラーですね。完全に私が悪い()

Java 21 で書きましたが、古い Java が呼ばれてしまうようです。うーむ。

苦肉の策で(?)絶対パスで Java 21 で実行するようにclaude_desktop_config.json を以下のように変えておきます。(あくまで例です)

{
  "mcpServers": {
    "weather": {
      "command": "/path/to/yukinissie/java/21/bin/java",
      "args": [
        "-jar",
        "/Users/yukinissie/weather/build/libs/weather-1.0-SNAPSHOT-all.jar"
      ]
    }
  }
}

まとめ

特にMCPの実装では詰まらなかったです!!!

Discussion