关于 kotlin-mcp-server-generator
为 Kotlin 开发者生成基于 Gradle 的 MCP 服务项目,包含服务器配置、工具、测试和文档。模板强调类型安全、协程及可选的 stdio 或 SSE 传输。
主要功能
- 01生成 Gradle 项目结构
- 02配置 MCP 服务器与传输
- 03提供类型化工具示例
- 04包含异常处理与校验
- 05生成协程测试和文档
适用场景
- 01启动 Kotlin 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 Schema:使用
buildJsonObject构建工具 schema - 测试:包含协程测试工具
- 日志:使用 kotlin-logging 进行结构化日志记录
- 配置:使用数据类和环境变量
- 文档:为公共 API 编写 KDoc 注释
最佳实践
- 所有异步操作都使用挂起函数
- 利用 Kotlin 的空安全和类型系统
- 使用数据类表示结构化数据
- 应用 kotlinx.serialization 处理 JSON
- 使用密封类表示结果类型
- 使用 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