kotlin-sdk/samples/kotlin-mcp-server
Repository files (latest commit first)
Filename Latest commit message Latest commit date
dependabot[bot] 7a95cb7e19
chore(deps): bump io.ktor:ktor-bom from 3.2.3 to 3.3.3 in /samples/kotlin-mcp-server (#652)
Bumps [io.ktor:ktor-bom](https://github.com/ktorio/ktor) from 3.2.3 to
3.3.3.
<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.3.3</h2>
<blockquote>
<p>Published 26 November 2025</p>
</blockquote>
<h3>Improvements</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-6837">KTOR-6837</a>
Discrepancies when parsing URL host with CIO and Darwin engines compared
to the rest engines</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9050">KTOR-9050</a>
Logging: SimpleLogger should be an object, not a class</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9094">KTOR-9094</a>
Jetty Client: Support HTTP/2 over cleartext (h2c)</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9120">KTOR-9120</a>
OpenAPI gen: missing operationId for KDoc fields</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-3019">KTOR-3019</a>
Improve logging for CORS plugin</li>
</ul>
<h3>Bugfixes</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8671">KTOR-8671</a>
Netty: RejectedExecutionException during shutdown on MacOS when dev mode
is enabled</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9096">KTOR-9096</a>
Darwin: New SSE handlers stop responding after canceling few SSE
sessions</li>
<li><a
href="http://youtrack.jetbrains.com/issue/KTOR-9125">KTOR-9125</a>
Double ResponseSent invocation when exception is thrown after
respond</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8878">KTOR-8878</a>
OpenAPI: StackOverflowError when a response object has property with
<code>@Contextual</code> serializer</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8947">KTOR-8947</a>
Java, ContentEncoding: IllegalHeaderNameException is thrown for
&quot;:status&quot; pseudo header with HTTP/2</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9092">KTOR-9092</a>
NettyHttp2Handler throws IllegalArgumentException:
'ktor.ApplicationCall' is already in use</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8924">KTOR-8924</a>
Curl: Client sends both Transfer-Encoding and Content-Length headers for
DELETE requests with body</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8838">KTOR-8838</a>
Exception handling issue in client cache</li>
</ul>
<h2>3.3.2</h2>
<blockquote>
<p>Published 5 November 2025</p>
</blockquote>
<h3>Improvements</h3>
<ul>
<li>WebRTC Client. Remove redundant targets (<a
href="https://youtrack.jetbrains.com/issue/KTOR-9062">KTOR-9062</a>)</li>
<li>Add Socks proxy support to Darwin engine (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8968">KTOR-8968</a>)</li>
<li>Java: Improve error message when SOCKS proxy is used (<a
href="https://youtrack.jetbrains.com/issue/KTOR-2908">KTOR-2908</a>)</li>
</ul>
<h3>Bugfixes</h3>
<ul>
<li>HttpRequestRetry: SendCountExceedException when max retries is more
than maxSendCount of HttpSend (<a
href="https://youtrack.jetbrains.com/issue/KTOR-5850">KTOR-5850</a>)</li>
<li>Darwin: The <code>maxFrameSize</code> option has no effect (<a
href="https://youtrack.jetbrains.com/issue/KTOR-6963">KTOR-6963</a>)</li>
<li>OpenAPI: StackOverflowError when a response object has property with
<code>@Contextual</code> serializer (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8878">KTOR-8878</a>)</li>
<li>OpenAPI gen: missing KDoc fields (<a
href="https://youtrack.jetbrains.com/issue/KTOR-9021">KTOR-9021</a>)</li>
<li>Server call.request.path() returns routing selectors in path (<a
href="https://youtrack.jetbrains.com/issue/KTOR-7639">KTOR-7639</a>)</li>
<li>StaticContent doesn't allow siblings (<a
href="https://youtrack.jetbrains.com/issue/KTOR-9012">KTOR-9012</a>)</li>
<li>HttpCache: FileStorage doesn't use given dispatcher for all file
operations (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8832">KTOR-8832</a>)</li>
<li>Curl: SOCKS proxy doesn't work (<a
href="https://youtrack.jetbrains.com/issue/KTOR-9008">KTOR-9008</a>)</li>
<li>Netty: java.lang.VerifyError is thrown on Android since 3.3.0 (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8916">KTOR-8916</a>)</li>
<li>Response body channel is canceled while the body is being saved when
having HttpRequestRetry and onDownload (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8975">KTOR-8975</a>)</li>
<li>HttpCache: InvalidCacheStateException when varyKeys stored in files
contain uppercase letters since 3.3.0 (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8970">KTOR-8970</a>)</li>
</ul>
<h2>3.3.1</h2>
<blockquote>
<p>Published 8 October 2025</p>
</blockquote>
<h3>Improvements</h3>
<ul>
<li>Add a note about SSE session lifetime in KDoc (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8440">KTOR-8440</a>)</li>
<li>Update Kotlin to 2.2.20 (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8896">KTOR-8896</a>)</li>
</ul>
<h3>Bugfixes</h3>
<ul>
<li>NumberFormatException when Content-Length header value contains null
bytes (<a
href="https://youtrack.jetbrains.com/issue/KTOR-4828">KTOR-4828</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</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.3.3</h1>
<blockquote>
<p>Published 26 November 2025</p>
</blockquote>
<h3>Improvements</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-6837">KTOR-6837</a>
Discrepancies when parsing URL host with CIO and Darwin engines compared
to the rest engines</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9050">KTOR-9050</a>
Logging: SimpleLogger should be an object, not a class</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9094">KTOR-9094</a>
Jetty Client: Support HTTP/2 over cleartext (h2c)</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9120">KTOR-9120</a>
OpenAPI gen: missing operationId for KDoc fields</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-3019">KTOR-3019</a>
Improve logging for CORS plugin</li>
</ul>
<h3>Bugfixes</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8671">KTOR-8671</a>
Netty: RejectedExecutionException during shutdown on MacOS when dev mode
is enabled</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9096">KTOR-9096</a>
Darwin: New SSE handlers stop responding after canceling few SSE
sessions</li>
<li><a
href="http://youtrack.jetbrains.com/issue/KTOR-9125">KTOR-9125</a>
Double ResponseSent invocation when exception is thrown after
respond</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8878">KTOR-8878</a>
OpenAPI: StackOverflowError when a response object has property with <a
href="https://github.com/Contextual"><code>@​Contextual</code></a>
serializer</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8947">KTOR-8947</a>
Java, ContentEncoding: IllegalHeaderNameException is thrown for
&quot;:status&quot; pseudo header with HTTP/2</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-9092">KTOR-9092</a>
NettyHttp2Handler throws IllegalArgumentException:
'ktor.ApplicationCall' is already in use</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8924">KTOR-8924</a>
Curl: Client sends both Transfer-Encoding and Content-Length headers for
DELETE requests with body</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KTOR-8838">KTOR-8838</a>
Exception handling issue in client cache</li>
</ul>
<h1>3.3.2</h1>
<blockquote>
<p>Published 5 November 2025</p>
</blockquote>
<h3>Improvements</h3>
<ul>
<li>WebRTC Client. Remove redundant targets (<a
href="https://youtrack.jetbrains.com/issue/KTOR-9062">KTOR-9062</a>)</li>
<li>Add Socks proxy support to Darwin engine (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8968">KTOR-8968</a>)</li>
<li>Java: Improve error message when SOCKS proxy is used (<a
href="https://youtrack.jetbrains.com/issue/KTOR-2908">KTOR-2908</a>)</li>
</ul>
<h3>Bugfixes</h3>
<ul>
<li>HttpRequestRetry: SendCountExceedException when max retries is more
than maxSendCount of HttpSend (<a
href="https://youtrack.jetbrains.com/issue/KTOR-5850">KTOR-5850</a>)</li>
<li>Darwin: The <code>maxFrameSize</code> option has no effect (<a
href="https://youtrack.jetbrains.com/issue/KTOR-6963">KTOR-6963</a>)</li>
<li>OpenAPI: StackOverflowError when a response object has property with
<a href="https://github.com/Contextual"><code>@​Contextual</code></a>
serializer (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8878">KTOR-8878</a>)</li>
<li>OpenAPI gen: missing KDoc fields (<a
href="https://youtrack.jetbrains.com/issue/KTOR-9021">KTOR-9021</a>)</li>
<li>Server call.request.path() returns routing selectors in path (<a
href="https://youtrack.jetbrains.com/issue/KTOR-7639">KTOR-7639</a>)</li>
<li>StaticContent doesn't allow siblings (<a
href="https://youtrack.jetbrains.com/issue/KTOR-9012">KTOR-9012</a>)</li>
<li>HttpCache: FileStorage doesn't use given dispatcher for all file
operations (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8832">KTOR-8832</a>)</li>
<li>Curl: SOCKS proxy doesn't work (<a
href="https://youtrack.jetbrains.com/issue/KTOR-9008">KTOR-9008</a>)</li>
<li>Netty: java.lang.VerifyError is thrown on Android since 3.3.0 (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8916">KTOR-8916</a>)</li>
<li>Response body channel is canceled while the body is being saved when
having HttpRequestRetry and onDownload (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8975">KTOR-8975</a>)</li>
<li>HttpCache: InvalidCacheStateException when varyKeys stored in files
contain uppercase letters since 3.3.0 (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8970">KTOR-8970</a>)</li>
</ul>
<h1>3.3.1</h1>
<blockquote>
<p>Published 8 October 2025</p>
</blockquote>
<h3>Improvements</h3>
<ul>
<li>Add a note about SSE session lifetime in KDoc (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8440">KTOR-8440</a>)</li>
<li>Update Kotlin to 2.2.20 (<a
href="https://youtrack.jetbrains.com/issue/KTOR-8896">KTOR-8896</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="629d22ca15"><code>629d22c</code></a>
Release 3.3.3 (<a
href="https://redirect.github.com/ktorio/ktor/issues/5219">#5219</a>)</li>
<li><a
href="77bbf108e2"><code>77bbf10</code></a>
Server Netty. Fix rejected execution during engine stop (<a
href="https://redirect.github.com/ktorio/ktor/issues/8671">#8671</a>)</li>
<li><a
href="75439b0a69"><code>75439b0</code></a>
KTOR-9096 Fix SSE cancellation leak on Darwin (<a
href="https://redirect.github.com/ktorio/ktor/issues/5208">#5208</a>)</li>
<li><a
href="62ea8e43fb"><code>62ea8e4</code></a>
KTOR-6837 Fix client URL handling for invalid DefaultRequest.host</li>
<li><a
href="ef09e847da"><code>ef09e84</code></a>
Add stream.demand calls to JettyResponseListener</li>
<li><a
href="47e6049445"><code>47e6049</code></a>
KTOR-9094 Jetty Client: Allow h2c traffic</li>
<li><a
href="e70922ec80"><code>e70922e</code></a>
KTOR-9125 Fix double ResponseSent invocation when exception is thrown
after r...</li>
<li><a
href="589f02dd61"><code>589f02d</code></a>
KTOR-3019 Improve CORS plugin logging to ease troubleshooting (<a
href="https://redirect.github.com/ktorio/ktor/issues/5194">#5194</a>)</li>
<li><a
href="5a66b475d5"><code>5a66b47</code></a>
Update Gradle and Develocity (<a
href="https://redirect.github.com/ktorio/ktor/issues/5201">#5201</a>)</li>
<li><a
href="2ba2f0256a"><code>2ba2f02</code></a>
KTOR-8947 Filter pseudo-headers in Java client (<a
href="https://redirect.github.com/ktorio/ktor/issues/5198">#5198</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/ktorio/ktor/compare/3.2.3...3.3.3">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-03-30 14:22:15 +00:00
..
gradle chore(deps): bump io.ktor:ktor-bom from 3.2.3 to 3.3.3 in /samples/kotlin-mcp-server (#652) 2026-03-30 14:22:15 +00: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 4 directories with 4 updates (#634) 2026-03-27 00:58:15 +00:00
gradlew.bat chore(deps): bump the other-dependencies group across 4 directories with 4 updates (#634) 2026-03-27 00:58:15 +00: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.