MCP QuickStart の For Server Developers を Kotlin でやるときにハマったこと & 解決方法
最近何かと流行りの Model Context Protocol(以降、MCP)。ということで MCP Server の QuickStart (チュートリアル)を Kotlin でやろうと思いましてチャレンジしてみました。(へーしゃ、Server Side Kotlinを実践で使っているのでその影響です)
QuickStart↓
チャレンジの中でいくつかハマった(というか愚直に書いてたらエラーに遭遇した)のでエラーについてと解決策をまとめます。
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.*
ソースコードの全文は以下のリンクから確認できます。()
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を開いたら以下のようにエラーポップアップが出てきました。。
エラーログが見たいのでボタンをぽちぽち押していきます。
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