kotlin-mcp-server-generator について
Kotlin 開発者向けに、サーバー設定、ツール、テスト、ドキュメントを含む Gradle ベースの MCP サーバープロジェクトを生成します。型安全性とコルーチンを重視し、stdio と SSE のトランスポート例を備えています。
主な機能
- 01Gradle プロジェクト構成の生成
- 02MCP サーバーとトランスポートの設定
- 03型付きツールの例
- 04例外処理と検証の追加
- 05コルーチンテストとドキュメントの生成
活用シーン
- 01Kotlin MCP サーバープロジェクトの開始
- 02サーバーへの型付きツールの追加
- 03コルーチンテスト構成の用意
MCP 対応
生成プロジェクトは Kotlin SDK で MCP サーバーを実装し、stdio と Ktor ベースの SSE トランスポート例を提供します。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ github/ awesome-copilot --skill kotlin-mcp-server-generatorインストール後、Claude Code で/kotlin-mcp-server-generatorを入力して読み込まれたか確認します。
詳細
Kotlin MCP サーバープロジェクトジェネレーター
Kotlin で完全かつ本番環境に対応した Model Context Protocol(MCP)サーバープロジェクトを生成します。
プロジェクトの要件
以下を備えた Kotlin MCP サーバーを作成します:
- プロジェクト構成: Gradle ベースの Kotlin プロジェクトレイアウト
- 依存関係: 公式 MCP SDK、Ktor、kotlinx ライブラリ
- サーバーセットアップ: トランスポートを構成した MCP サーバー
- ツール: 型付きの入力/出力を備えた、少なくとも 2〜3 個の有用なツール
- エラー処理: 適切な例外処理とバリデーション
- ドキュメント: セットアップと使用方法を記載した README
- テスト: コルーチンを用いた基本的なテスト構成
テンプレート構成
myserver/
├── build.gradle.kts
├── settings.gradle.kts
├── gradle.properties
├── src/
│ ├── main/
│ │ └── kotlin/
│ │ └── com/example/myserver/
│ │ ├── Main.kt
│ │ ├── Server.kt
│ │ ├── config/
│ │ │ └── Config.kt
│ │ └── tools/
│ │ ├── Tool1.kt
│ │ └── Tool2.kt
│ └── test/
│ └── kotlin/
│ └── com/example/myserver/
│ └── ServerTest.kt
└── README.md
build.gradle.kts テンプレート
plugins {
kotlin("jvm") version "2.1.0"
kotlin("plugin.serialization") version "2.1.0"
application
}
group = "com.example"
version = "1.0.0"
repositories {
mavenCentral()
}
dependencies {
implementation("io.modelcontextprotocol:kotlin-sdk:0.7.2")
// Ktor for transports
implementation("io.ktor:ktor-server-netty:3.0.0")
implementation("io.ktor:ktor-client-cio:3.0.0")
// Serialization
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
// Coroutines
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
// Logging
implementation("io.github.oshai:kotlin-logging-jvm:7.0.0")
implementation("ch.qos.logback:logback-classic:1.5.12")
// Testing
testImplementation(kotlin("test"))
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.9.0")
}
application {
mainClass.set("com.example.myserver.MainKt")
}
tasks.test {
useJUnitPlatform()
}
kotlin {
jvmToolchain(17)
}
settings.gradle.kts テンプレート
rootProject.name = "{{PROJECT_NAME}}"
Main.kt テンプレート
package com.example.myserver
import io.modelcontextprotocol.kotlin.sdk.server.StdioServerTransport
import kotlinx.coroutines.runBlocking
import io.github.oshai.kotlinlogging.KotlinLogging
private val logger = KotlinLogging.logger {}
fun main() = runBlocking {
logger.info { "Starting MCP server..." }
val config = loadConfig()
val server = createServer(config)
// Use stdio transport
val transport = StdioServerTransport()
logger.info { "Server '${config.name}' v${config.version} ready" }
server.connect(transport)
}
Server.kt テンプレート
package com.example.myserver
import io.modelcontextprotocol.kotlin.sdk.server.Server
import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions
import io.modelcontextprotocol.kotlin.sdk.Implementation
import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities
import com.example.myserver.tools.registerTools
fun createServer(config: Config): Server {
val server = Server(
serverInfo = Implementation(
name = config.name,
version = config.version
),
options = ServerOptions(
capabilities = ServerCapabilities(
tools = ServerCapabilities.Tools(),
resources = ServerCapabilities.Resources(
subscribe = true,
listChanged = true
),
prompts = ServerCapabilities.Prompts(listChanged = true)
)
)
) {
config.description
}
// Register all tools
server.registerTools()
return server
}
Config.kt テンプレート
package com.example.myserver.config
import kotlinx.serialization.Serializable
@Serializable
data class Config(
val name: String = "{{PROJECT_NAME}}",
val version: String = "1.0.0",
val description: String = "{{PROJECT_DESCRIPTION}}"
)
fun loadConfig(): Config {
return Config(
name = System.getenv("SERVER_NAME") ?: "{{PROJECT_NAME}}",
version = System.getenv("VERSION") ?: "1.0.0",
description = System.getenv("DESCRIPTION") ?: "{{PROJECT_DESCRIPTION}}"
)
}
Tool1.kt テンプレート
package com.example.myserver.tools
import io.modelcontextprotocol.kotlin.sdk.server.Server
import io.modelcontextprotocol.kotlin.sdk.CallToolRequest
import io.modelcontextprotocol.kotlin.sdk.CallToolResult
import io.modelcontextprotocol.kotlin.sdk.TextContent
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.put
import kotlinx.serialization.json.putJsonObject
import kotlinx.serialization.json.putJsonArray
fun Server.registerTool1() {
addTool(
name = "tool1",
description = "Description of what tool1 does",
inputSchema = buildJsonObject {
put("type", "object")
putJsonObject("properties") {
putJsonObject("param1") {
put("type", "string")
put("description", "First parameter")
}
putJsonObject("param2") {
put("type", "integer")
put("description", "Optional second parameter")
}
}
putJsonArray("required") {
add("param1")
}
}
) { request: CallToolRequest ->
// Extract and validate parameters
val param1 = request.params.arguments["param1"] as? String
?: throw IllegalArgumentException("param1 is required")
val param2 = (request.params.arguments["param2"] as? Number)?.toInt() ?: 0
// Perform tool logic
val result = performTool1Logic(param1, param2)
CallToolResult(
content = listOf(
TextContent(text = result)
)
)
}
}
private fun performTool1Logic(param1: String, param2: Int): String {
// Implement tool logic here
return "Processed: $param1 with value $param2"
}
tools/ToolRegistry.kt テンプレート
package com.example.myserver.tools
import io.modelcontextprotocol.kotlin.sdk.server.Server
fun Server.registerTools() {
registerTool1()
registerTool2()
// Register additional tools here
}
ServerTest.kt テンプレート
package com.example.myserver
import kotlinx.coroutines.test.runTest
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFalse
class ServerTest {
@Test
fun `test server creation`() = runTest {
val config = Config(
name = "test-server",
version = "1.0.0",
description = "Test server"
)
val server = createServer(config)
assertEquals("test-server", server.serverInfo.name)
assertEquals("1.0.0", server.serverInfo.version)
}
@Test
fun `test tool1 execution`() = runTest {
val config = Config()
val server = createServer(config)
// Test tool execution
// Note: You'll need to implement proper testing utilities
// for calling tools in the server
}
}
README.md テンプレート
# {{PROJECT_NAME}}
A Model Context Protocol (MCP) server built with Kotlin.
## Description
{{PROJECT_DESCRIPTION}}
## Requirements
- Java 17 or higher
- Kotlin 2.1.0
## Installation
Build the project:
\`\`\`bash
./gradlew build
\`\`\`
## Usage
Run the server with stdio transport:
\`\`\`bash
./gradlew run
\`\`\`
Or build and run the jar:
\`\`\`bash
./gradlew installDist
./build/install/{{PROJECT_NAME}}/bin/{{PROJECT_NAME}}
\`\`\`
## Configuration
Configure via environment variables:
- `SERVER_NAME`: Server name (default: "{{PROJECT_NAME}}")
- `VERSION`: Server version (default: "1.0.0")
- `DESCRIPTION`: Server description
## Available Tools
### tool1
{{TOOL1_DESCRIPTION}}
**Input:**
- `param1` (string, required): First parameter
- `param2` (integer, optional): Second parameter
**Output:**
- Text result of the operation
## Development
Run tests:
\`\`\`bash
./gradlew test
\`\`\`
Build:
\`\`\`bash
./gradlew build
\`\`\`
Run with auto-reload (development):
\`\`\`bash
./gradlew run --continuous
\`\`\`
## Multiplatform
This project uses Kotlin Multiplatform and can target JVM, Wasm, and iOS.
See `build.gradle.kts` for platform configuration.
## License
MIT
生成手順
Kotlin MCP サーバーを生成する際は:
- Gradle セットアップ: すべての依存関係を含む適切な
build.gradle.ktsを作成します - パッケージ構成: Kotlin のパッケージ規約に従います
- 型安全性: データクラスと kotlinx.serialization を使用します
- コルーチン: すべての操作はサスペンド関数にします
- エラー処理: Kotlin の例外とバリデーションを使用します
- JSON スキーマ: ツールのスキーマには
buildJsonObjectを使用します - テスト: コルーチンのテストユーティリティを含めます
- ログ出力: 構造化ログには kotlin-logging を使用します
- 設定: データクラスと環境変数を使用します
- ドキュメント: 公開 API には KDoc コメントを付けます
ベストプラクティス
- すべての非同期操作にはサスペンド関数を使用する
- Kotlin の null 安全性と型システムを活用する
- 構造化データにはデータクラスを使用する
- JSON の処理には kotlinx.serialization を適用する
- 結果の型には sealed クラスを使用する
- Result/Either パターンを用いた適切なエラー処理を実装する
- kotlinx-coroutines-test を使用してテストを書く
- テスト容易性のために依存性注入を使用する
- Kotlin のコーディング規約に従う
- 意味のある名前と KDoc コメントを使用する
トランスポートのオプション
Stdio トランスポート
val transport = StdioServerTransport()
server.connect(transport)
SSE トランスポート(Ktor)
embeddedServer(Netty, port = 8080) {
mcp {
Server(/*...*/) { "Description" }
}
}.start(wait = true)
マルチプラットフォーム構成
マルチプラットフォームプロジェクトの場合は、build.gradle.kts に以下を追加します:
kotlin {
jvm()
js(IR) { nodejs() }
wasmJs()
sourceSets {
commonMain.dependencies {
implementation("io.modelcontextprotocol:kotlin-sdk:0.7.2")
}
}
}
コメント
Markdown 対応