mcpField
K
kotlin-mcp-server-generator

kotlin-mcp-server-generator

github.com/github開発40.5k8.7k 回インストール1 日前に更新
リポジトリ

kotlin-mcp-server-generator について

Kotlin 開発者向けに、サーバー設定、ツール、テスト、ドキュメントを含む Gradle ベースの MCP サーバープロジェクトを生成します。型安全性とコルーチンを重視し、stdio と SSE のトランスポート例を備えています。

主な機能

  1. 01Gradle プロジェクト構成の生成
  2. 02MCP サーバーとトランスポートの設定
  3. 03型付きツールの例
  4. 04例外処理と検証の追加
  5. 05コルーチンテストとドキュメントの生成

活用シーン

  1. 01Kotlin MCP サーバープロジェクトの開始
  2. 02サーバーへの型付きツールの追加
  3. 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 サーバーを作成します:

  1. プロジェクト構成: Gradle ベースの Kotlin プロジェクトレイアウト
  2. 依存関係: 公式 MCP SDK、Ktor、kotlinx ライブラリ
  3. サーバーセットアップ: トランスポートを構成した MCP サーバー
  4. ツール: 型付きの入力/出力を備えた、少なくとも 2〜3 個の有用なツール
  5. エラー処理: 適切な例外処理とバリデーション
  6. ドキュメント: セットアップと使用方法を記載した README
  7. テスト: コルーチンを用いた基本的なテスト構成

テンプレート構成

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 サーバーを生成する際は:

  1. Gradle セットアップ: すべての依存関係を含む適切な build.gradle.kts を作成します
  2. パッケージ構成: Kotlin のパッケージ規約に従います
  3. 型安全性: データクラスと kotlinx.serialization を使用します
  4. コルーチン: すべての操作はサスペンド関数にします
  5. エラー処理: Kotlin の例外とバリデーションを使用します
  6. JSON スキーマ: ツールのスキーマには buildJsonObject を使用します
  7. テスト: コルーチンのテストユーティリティを含めます
  8. ログ出力: 構造化ログには kotlin-logging を使用します
  9. 設定: データクラスと環境変数を使用します
  10. ドキュメント: 公開 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")
        }
    }
}

コメント