kotlin-sdk/samples/kotlin-mcp-server
Repository files (latest commit first)
Filename Latest commit message Latest commit date
dependabot[bot] 05c5953a18
chore(deps): bump io.ktor:ktor-bom from 3.5.1 to 3.5.2 in /samples/kotlin-mcp-server (#945)
Bumps [io.ktor:ktor-bom](https://github.com/ktorio/ktor) from 3.5.1 to
3.5.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ktorio/ktor/releases">io.ktor:ktor-bom's
releases</a>.</em></p>
<blockquote>
<h2>3.5.2</h2>
<blockquote>
<p>Published 31 July 2026</p>
</blockquote>
<h3>Improvements</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8032">KTOR-8032</a>
RateLimit: Allow limit requests based on authentication result</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9719">KTOR-9719</a>
<code>ApplicationCall.isStaticContent</code> returns false when called
from plugin interceptors</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8450">KTOR-8450</a>
ContentNegotiation: it doesn't handle content type suffixes</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-7892">KTOR-7892</a>
SwaggerUI: Missing oauth2-redirect.html support in the plugin</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9759">KTOR-9759</a>
Reject whitespace in URL hosts during parsing</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9681">KTOR-9681</a>
Update kotlinx-io to 0.9.1</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9743">KTOR-9743</a>
ByteReadChannel.readLineStrict: Misleading definition of limit parameter
in KDocs</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9504">KTOR-9504</a>
Improve KDoc for EmbeddedServer.addShutdownHook</li>
</ul>
<h3>Bugfixes</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9741">KTOR-9741</a> CIO:
request-handler coroutine leak on half-closed idle connection after ≥1MB
response</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-7661">KTOR-7661</a>
Maven + YAML config file does not work</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9585">KTOR-9585</a>
OpenAPI: JsonSchema title is truncated when it contains a dot</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9704">KTOR-9704</a>
UTF-8 encoding in ktor-io bypasses JVM String.getBytes intrinsics,
slowing every text response by 5-7x</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9588">KTOR-9588</a> SSE
client (CIO engine) sends spurious <code>Content-Length: 0</code> on
body-less GET (RFC 9110 § 8.6 violation; rejected by AWS ELB)</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9679">KTOR-9679</a>
ByteReadChannel.readLine corrupts multi-byte UTF-8 by splitting a
character at a buffer boundary</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9767">KTOR-9767</a>
ByteReadChannel.readLineTo: Return read bytes count instead of decoded
characters count <a href="#"><img
src="https://img.shields.io/badge/%5BImpactful%20change%5D-orange?style=flat-square"
alt="" /></a></li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8992">KTOR-8992</a>
HoconConfigLoader is not loaded when ktor-server-config-yaml on the
classpath</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9698">KTOR-9698</a>
OpenAPI: schema for kotlinx.serialization sealed types omits
discriminator property in variant schemas</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9690">KTOR-9690</a>
Netty: in-flight requests are aborted on stop(), ignoring shutdown grace
period</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8903">KTOR-8903</a>
Netty: Close channel connection on errors properly</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9707">KTOR-9707</a>
SaveBody performance regression</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9703">KTOR-9703</a>
Inefficient text reading function in DefaultTransform</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9711">KTOR-9711</a>
Netty HTTP/2: a single client-canceled stream (RST_STREAM) breaks
response flushing for the whole connection</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9688">KTOR-9688</a>
RateLimit: No access to principal when wrapped with authentication since
3.5.1</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9677">KTOR-9677</a>
Auto-reloading: server is reloaded only once since 3.5.0</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9683">KTOR-9683</a>
Sockets: Canceling a SelectorManager job doesn't close it properly</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9671">KTOR-9671</a>
Darwin: Semicolons in URL path are sanitized</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/ktorio/ktor/blob/main/CHANGELOG.md">io.ktor:ktor-bom's
changelog</a>.</em></p>
<blockquote>
<h1>3.5.2</h1>
<blockquote>
<p>Published 31 July 2026</p>
</blockquote>
<h3>Improvements</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8032">KTOR-8032</a>
RateLimit: Allow limit requests based on authentication result</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9719">KTOR-9719</a>
<code>ApplicationCall.isStaticContent</code> returns false when called
from plugin interceptors</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8450">KTOR-8450</a>
ContentNegotiation: it doesn't handle content type suffixes</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-7892">KTOR-7892</a>
SwaggerUI: Missing oauth2-redirect.html support in the plugin</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9759">KTOR-9759</a>
Reject whitespace in URL hosts during parsing</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9681">KTOR-9681</a>
Update kotlinx-io to 0.9.1</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9743">KTOR-9743</a>
ByteReadChannel.readLineStrict: Misleading definition of limit parameter
in KDocs</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9504">KTOR-9504</a>
Improve KDoc for EmbeddedServer.addShutdownHook</li>
</ul>
<h3>Bugfixes</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9741">KTOR-9741</a> CIO:
request-handler coroutine leak on half-closed idle connection after ≥1MB
response</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-7661">KTOR-7661</a>
Maven + YAML config file does not work</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9585">KTOR-9585</a>
OpenAPI: JsonSchema title is truncated when it contains a dot</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9704">KTOR-9704</a>
UTF-8 encoding in ktor-io bypasses JVM String.getBytes intrinsics,
slowing every text response by 5-7x</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9588">KTOR-9588</a> SSE
client (CIO engine) sends spurious <code>Content-Length: 0</code> on
body-less GET (RFC 9110 § 8.6 violation; rejected by AWS ELB)</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9679">KTOR-9679</a>
ByteReadChannel.readLine corrupts multi-byte UTF-8 by splitting a
character at a buffer boundary</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9767">KTOR-9767</a>
ByteReadChannel.readLineTo: Return read bytes count instead of decoded
characters count <a href="#"><img
src="https://img.shields.io/badge/%5BImpactful%20change%5D-orange?style=flat-square"
alt="" /></a></li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8992">KTOR-8992</a>
HoconConfigLoader is not loaded when ktor-server-config-yaml on the
classpath</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9698">KTOR-9698</a>
OpenAPI: schema for kotlinx.serialization sealed types omits
discriminator property in variant schemas</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9690">KTOR-9690</a>
Netty: in-flight requests are aborted on stop(), ignoring shutdown grace
period</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8903">KTOR-8903</a>
Netty: Close channel connection on errors properly</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9707">KTOR-9707</a>
SaveBody performance regression</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9703">KTOR-9703</a>
Inefficient text reading function in DefaultTransform</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9711">KTOR-9711</a>
Netty HTTP/2: a single client-canceled stream (RST_STREAM) breaks
response flushing for the whole connection</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9688">KTOR-9688</a>
RateLimit: No access to principal when wrapped with authentication since
3.5.1</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9677">KTOR-9677</a>
Auto-reloading: server is reloaded only once since 3.5.0</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9683">KTOR-9683</a>
Sockets: Canceling a SelectorManager job doesn't close it properly</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9671">KTOR-9671</a>
Darwin: Semicolons in URL path are sanitized</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="01c469a85f"><code>01c469a</code></a>
Release 3.5.2 (<a
href="https://redirect.github.com/ktorio/ktor/issues/5781">#5781</a>)</li>
<li><a
href="c965a0ce85"><code>c965a0c</code></a>
KTOR-9741 Prevent CIO request handler leak (<a
href="https://redirect.github.com/ktorio/ktor/issues/5783">#5783</a>)</li>
<li><a
href="74df4585b8"><code>74df458</code></a>
chore: fix some comments to improve readability</li>
<li><a
href="2672567708"><code>2672567</code></a>
[KTOR-9704] Optimized encoding flow for UTF-8 (<a
href="https://redirect.github.com/ktorio/ktor/issues/5743">#5743</a>)</li>
<li><a
href="d5680edbe6"><code>d5680ed</code></a>
KTOR-5391: Document ECDSA certificate limitation for client
authentication (#...</li>
<li><a
href="9b0f356877"><code>9b0f356</code></a>
<code>something::javaClass.name</code> is not the name of the class of
something but `&quot;j...</li>
<li><a
href="58256cd084"><code>58256cd</code></a>
KTOR-9743 Clarify readLine documentation</li>
<li><a
href="088bd60702"><code>088bd60</code></a>
KTOR-9679 Fix regressions caused by adding buffering</li>
<li><a
href="167176a8d9"><code>167176a</code></a>
KTOR-9588 Do not send Content-Length: 0 for body-less GET requests (<a
href="https://redirect.github.com/ktorio/ktor/issues/5620">#5620</a>)</li>
<li><a
href="7fb0844702"><code>7fb0844</code></a>
KTOR-9585 Fix schema title trimming</li>
<li>Additional commits viewable in <a
href="https://github.com/ktorio/ktor/compare/3.5.1...3.5.2">compare
view</a></li>
</ul>
</details>
<br />

<details>
<summary>Most Recent Ignore Conditions Applied to This Pull
Request</summary>

| Dependency Name | Ignore Conditions |
| --- | --- |
| io.ktor:ktor-bom | [>= 3.4.a, < 3.5] |
</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-10 16:11:51 +02:00
..
gradle chore(deps): bump io.ktor:ktor-bom from 3.5.1 to 3.5.2 in /samples/kotlin-mcp-server (#945) 2026-08-10 16:11:51 +02:00
src Fix kotlin-mcp-server sample (#459) 2025-12-08 23:25:55 +02:00
build.gradle.kts Update Kotlin-MCP-Server with STDIO support, logging & CORS (#371) 2025-11-06 18:18:04 +02:00
gradle.properties #302 Update samples build workflow (#330) 2025-10-23 13:02:22 +03:00
gradlew chore(deps): bump the other-dependencies group across 5 directories with 3 updates (#854) 2026-06-24 15:31:46 +02:00
gradlew.bat chore(deps): bump the other-dependencies group across 5 directories with 3 updates (#854) 2026-06-24 15:31:46 +02:00
mcp-inspector-config.json Update Kotlin-MCP-Server with STDIO support, logging & CORS (#371) 2025-11-06 18:18:04 +02:00
README.md docs: streamable server sample (#595) 2026-03-10 12:45:21 +01:00
settings.gradle.kts #302 Update samples build workflow (#330) 2025-10-23 13:02:22 +03:00

Kotlin MCP Server

A sample MCP server demonstrating multiple transport modes: STDIO, SSE (plain), and SSE (Ktor plugin).

Note: The SSE transport modes are provided for backward compatibility. For new projects, consider using the simple-streamable-server sample, which uses the recommended Streamable HTTP transport.

Overview

This sample registers a prompt, a tool, and a resource, then lets you choose how to expose them. STDIO mode is the default and is best for process-based clients. The two SSE modes show how to serve MCP over HTTP using either a manual Ktor routing setup or the built-in mcp { } Ktor plugin.

Prerequisites

Build & Run

STDIO mode (default)

./gradlew run

Or explicitly:

./gradlew run --args="--stdio"

Connect with the MCP Inspector:

npx @modelcontextprotocol/inspector --config samples/kotlin-mcp-server/mcp-inspector-config.json --server stdio-server

SSE with Ktor plugin

./gradlew run --args="--sse-server-ktor 3002"

Connect with the MCP Inspector:

npx @modelcontextprotocol/inspector --config samples/kotlin-mcp-server/mcp-inspector-config.json --server sse-ktor-server

SSE with plain configuration

Known issue: This mode may not work correctly at this time.

./gradlew run --args="--sse-server 3001"

Connect with the MCP Inspector:

npx @modelcontextprotocol/inspector --config samples/kotlin-mcp-server/mcp-inspector-config.json --server sse-server

MCP Capabilities

Tools

Name Description
kotlin-sdk-tool A test tool that returns a "Hello, world!" greeting.

Prompts

Name Description
Kotlin Developer Generates a prompt to develop a small Kotlin application for a given project name.

Resources

Name URI Description
Web Search https://search.com/ A placeholder resource demonstrating resource handling.