Update badges in README and set version to 0.7.4-SNAPSHOT Not updating the version of sample projects because of #302 ## Motivation and Context <!-- Why is this change needed? What problem does it solve? --> ## How Has This Been Tested? <!-- Have you tested this in a real application? Which scenarios were tested? --> ## Breaking Changes <!-- Will users need to update their code or configurations? --> ## Types of changes <!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply: --> - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [x] Documentation update ## Checklist <!-- Go over all the following points, and put an `x` in all the boxes that apply. --> - [x] I have read the [MCP Documentation](https://modelcontextprotocol.io) - [x] My code follows the repository's style guidelines - [x] New and existing tests pass locally - [ ] I have added appropriate error handling - [ ] I have added or updated documentation as needed ## Additional context <!-- Add any other context, implementation notes, or design decisions -->
209 lines
6.7 KiB
Markdown
209 lines
6.7 KiB
Markdown
# MCP Kotlin SDK
|
||
|
||
|
||
[](https://central.sonatype.com/artifact/io.modelcontextprotocol/kotlin-sdk)
|
||
[](https://github.com/modelcontextprotocol/kotlin-sdk/actions/workflows/build.yml)
|
||
[](http://kotlinlang.org)
|
||
[](https://kotlinlang.org/docs/multiplatform.html)
|
||
[](http://java.com)
|
||
[](LICENSE)
|
||
|
||
Kotlin Multiplatform implementation of the [Model Context Protocol](https://modelcontextprotocol.io) (MCP),
|
||
providing both client and server capabilities for integrating with LLM surfaces across various platforms.
|
||
|
||
## Overview
|
||
|
||
The Model Context Protocol allows applications to provide context for LLMs in a standardized way,
|
||
separating the concerns of providing context from the actual LLM interaction.
|
||
This SDK implements the MCP specification for Kotlin,
|
||
enabling you to build applications that can communicate using MCP on the JVM, WebAssembly and iOS.
|
||
|
||
- Build MCP clients that can connect to any MCP server
|
||
- Create MCP servers that expose resources, prompts and tools
|
||
- Use standard transports like stdio, SSE, and WebSocket
|
||
- Handle all MCP protocol messages and lifecycle events
|
||
|
||
## Samples
|
||
|
||
- [kotlin-mcp-server](./samples/kotlin-mcp-server): demonstrates a multiplatform (JVM, Wasm) MCP server setup with various features and transports.
|
||
- [weather-stdio-server](./samples/weather-stdio-server): shows how to build a Kotlin MCP server providing weather forecast and alerts using STDIO transport.
|
||
- [kotlin-mcp-client](./samples/kotlin-mcp-client): demonstrates building an interactive Kotlin MCP client that connects to an MCP server via STDIO and integrates with Anthropic’s API.
|
||
|
||
## Installation
|
||
|
||
Add the new repository to your build file:
|
||
|
||
```kotlin
|
||
repositories {
|
||
mavenCentral()
|
||
}
|
||
```
|
||
|
||
Add the dependency:
|
||
|
||
```kotlin
|
||
dependencies {
|
||
// See the badge above for the latest version
|
||
implementation("io.modelcontextprotocol:kotlin-sdk:$mcpVersion")
|
||
}
|
||
```
|
||
MCP SDK uses [Ktor](https://ktor.io/), but does not come with a specific engine dependency.
|
||
You should add [Ktor client](https://ktor.io/docs/client-dependencies.html#engine-dependency)
|
||
and/or [Ktor server](https://ktor.io/docs/client-dependencies.html#engine-dependency) dependency
|
||
to your project yourself, e.g.:
|
||
```kotlin
|
||
dependencies {
|
||
// for client:
|
||
implementation("io.ktor:ktor-client-cio:$ktorVersion")
|
||
// for server:
|
||
implementation("io.ktor:ktor-server-netty:$ktorVersion")
|
||
|
||
}
|
||
```
|
||
|
||
## Quick Start
|
||
|
||
### Creating a Client
|
||
|
||
```kotlin
|
||
import io.modelcontextprotocol.kotlin.sdk.client.Client
|
||
import io.modelcontextprotocol.kotlin.sdk.client.StdioClientTransport
|
||
import io.modelcontextprotocol.kotlin.sdk.Implementation
|
||
|
||
val client = Client(
|
||
clientInfo = Implementation(
|
||
name = "example-client",
|
||
version = "1.0.0"
|
||
)
|
||
)
|
||
|
||
val transport = StdioClientTransport(
|
||
inputStream = processInputStream,
|
||
outputStream = processOutputStream
|
||
)
|
||
|
||
// Connect to server
|
||
client.connect(transport)
|
||
|
||
// List available resources
|
||
val resources = client.listResources()
|
||
|
||
// Read a specific resource
|
||
val resourceContent = client.readResource(
|
||
ReadResourceRequest(uri = "file:///example.txt")
|
||
)
|
||
```
|
||
|
||
### Creating a Server
|
||
|
||
```kotlin
|
||
import io.modelcontextprotocol.kotlin.sdk.server.Server
|
||
import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions
|
||
import io.modelcontextprotocol.kotlin.sdk.server.StdioServerTransport
|
||
import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities
|
||
|
||
val server = Server(
|
||
serverInfo = Implementation(
|
||
name = "example-server",
|
||
version = "1.0.0"
|
||
),
|
||
options = ServerOptions(
|
||
capabilities = ServerCapabilities(
|
||
resources = ServerCapabilities.Resources(
|
||
subscribe = true,
|
||
listChanged = true
|
||
)
|
||
)
|
||
)
|
||
){
|
||
"This server provides example resources and demonstrates MCP capabilities."
|
||
}
|
||
|
||
// Add a resource
|
||
server.addResource(
|
||
uri = "file:///example.txt",
|
||
name = "Example Resource",
|
||
description = "An example text file",
|
||
mimeType = "text/plain"
|
||
) { request ->
|
||
ReadResourceResult(
|
||
contents = listOf(
|
||
TextResourceContents(
|
||
text = "This is the content of the example resource.",
|
||
uri = request.uri,
|
||
mimeType = "text/plain"
|
||
)
|
||
)
|
||
)
|
||
}
|
||
|
||
// Start server with stdio transport
|
||
val transport = StdioServerTransport()
|
||
server.connect(transport)
|
||
```
|
||
|
||
### Using SSE Transport
|
||
|
||
Directly in Ktor's `Application`:
|
||
```kotlin
|
||
import io.ktor.server.application.*
|
||
import io.modelcontextprotocol.kotlin.sdk.server.mcp
|
||
|
||
fun Application.module() {
|
||
mcp {
|
||
Server(
|
||
serverInfo = Implementation(
|
||
name = "example-sse-server",
|
||
version = "1.0.0"
|
||
),
|
||
options = ServerOptions(
|
||
capabilities = ServerCapabilities(
|
||
prompts = ServerCapabilities.Prompts(listChanged = null),
|
||
resources = ServerCapabilities.Resources(subscribe = null, listChanged = null)
|
||
)
|
||
),
|
||
) {
|
||
"This SSE server provides prompts and resources via Server-Sent Events."
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
Inside a custom Ktor's `Route`:
|
||
```kotlin
|
||
import io.ktor.server.application.*
|
||
import io.ktor.server.sse.SSE
|
||
import io.modelcontextprotocol.kotlin.sdk.server.mcp
|
||
|
||
fun Application.module() {
|
||
install(SSE)
|
||
|
||
routing {
|
||
route("myRoute") {
|
||
mcp {
|
||
Server(
|
||
serverInfo = Implementation(
|
||
name = "example-sse-server",
|
||
version = "1.0.0"
|
||
),
|
||
options = ServerOptions(
|
||
capabilities = ServerCapabilities(
|
||
prompts = ServerCapabilities.Prompts(listChanged = null),
|
||
resources = ServerCapabilities.Resources(subscribe = null, listChanged = null)
|
||
)
|
||
),
|
||
) {
|
||
"Connect via SSE to interact with this MCP server."
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
## Contributing
|
||
|
||
Please see the [contribution guide](CONTRIBUTING.md) and the [Code of conduct](CODE_OF_CONDUCT.md) before contributing.
|
||
|
||
## License
|
||
|
||
This project is licensed under the MIT License—see the [LICENSE](LICENSE) file for details.
|