| Filename | Latest commit message | Latest commit date |
|---|---|---|
Bumps [io.ktor:ktor-bom](https://github.com/ktorio/ktor) from 3.3.3 to 3.5.1. <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.1</h2> <blockquote> <p>Published 25 June 2026</p> </blockquote> <h3>Improvements</h3> <ul> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9492">KTOR-9492</a> OpenAPI plugin: handle requireXxx functions in compiler plugin</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9569">KTOR-9569</a> Add more details for KDoc of BearerAuthConfig.sendWithoutRequest</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9571">KTOR-9571</a> Add KDoc for BearerAuthConfig.realm</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9570">KTOR-9570</a> Add Kdoc for BearerAuthConfig.refreshTokens</li> </ul> <h3>Bugfixes</h3> <ul> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9646">KTOR-9646</a> Fix Kotlin 2.4.0 compiler plugin breaking changes</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-9591">KTOR-9591</a> OpenAPI: <code>@JsonClassDiscriminator</code> on sealed types is ignored when generating OpenAPI discriminator schema</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9597">KTOR-9597</a> OpenAPI: Schema name collisions because<code>@SerialName</code> of sealed subtypes is used as <code>components.schemas</code> key</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9601">KTOR-9601</a> OpenAPI: nullable <a href="https://github.com/JvmInline"><code>@JvmInline</code></a> value class loses nullability in generated schema</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9620">KTOR-9620</a> Some issues related to digest authentication in 3.5.0</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9623">KTOR-9623</a> Digest Auth: server must respond with one WWW-Authenticate header for each supported algorithm</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9624">KTOR-9624</a> Digest Auth: "Unsupported charset in digest authentication header" for a charset name in lowercase</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9630">KTOR-9630</a> Digest Auth: The plugin sends incorrect nonce when server responds with multiple WWW-Authenticate headers</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9565">KTOR-9565</a> WebRTC: Peer stops receiving messages after a while on iOS</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9610">KTOR-9610</a> WebRtcPeerConnection::close causes ClosedReceiveChannelException for other peer</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9633">KTOR-9633</a> WebRTC statistics fetching race condition</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9603">KTOR-9603</a> Structured concurrency is violated in WebRTC tests</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9671">KTOR-9671</a> Darwin: Semicolons in URL path are sanitized</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9639">KTOR-9639</a> Darwin: WebSocket client crashes the process when a PONG arrives after the session is closed</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9575">KTOR-9575</a> Darwin: findCharset("UTF-16") maps to NSUTF16LittleEndianStringEncoding causing decoding failure for UTF-16 content with BOM</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9661">KTOR-9661</a> HttpCache: InvalidCacheStateException is thrown on 304 when no cached entry matches varyKeys</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9673">KTOR-9673</a> Caching always missing with Content Negotiation</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9596">KTOR-9596</a> HttpTimeout: HttpRequestTimeoutException on any request with runTest and request timeout defined since 3.5.0</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9632">KTOR-9632</a> HttpRequestBuilder.timeout call removes capabilities set in DefaultRequest</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9252">KTOR-9252</a> ContentEncoding: Incomplete gzip response causes client/server to hang indefinitely</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9670">KTOR-9670</a> Compression: The plugin ignores Accept-Encoding q=0 and most-specific matching</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9614">KTOR-9614</a> Zstd Compression: "Destination buffer is too small" exception for a particular sequence of bytes</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9636">KTOR-9636</a> CORS plugin drops OPTIONS preflight requests when allowSameOrigin is on</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9659">KTOR-9659</a> CORS is skipped when the Origin header contains an IPv6 address</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9574">KTOR-9574</a> ContentNegotiation: The charset of <code>Accept-Charset</code> header is used for response deserialization</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9606">KTOR-9606</a> KotlinxSerializationConverter: it fails to deserialize an empty channel closed with a delay</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9617">KTOR-9617</a> OutputStreamContent and WriterContent can exhaust Dispatchers.IO</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9629">KTOR-9629</a> RawSourceChannel: coroutine cancellation is not propagated to the RawSource</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-8870">KTOR-8870</a> File.readChannel: do not close a non-opened file and ignore closing exceptions</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9460">KTOR-9460</a> Curl: Can't build shared library with Ktor 3.4.2</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9607">KTOR-9607</a> Crash on Android 7: NoSuchMethodError getInstanceStrong() since 3.5.0</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9595">KTOR-9595</a> CIO: The engine imports <code>node:net</code> statically and breaks wasmJsBrowser webpack build</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9615">KTOR-9615</a> Apache5: The underlying request is not aborted when coroutine Job is cancelled</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-8443">KTOR-8443</a> RoutingBuilder.contentType does not use parameters when matching</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9425">KTOR-9425</a> SessionTransportTransformerEncrypt init block uses wrong IV size for AES-256 (regression of KTOR-661)</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9621">KTOR-9621</a> RateLimit plugin is bypassed when the nested authenticate block rejects the request</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-8766">KTOR-8766</a> DI: The close method is called twice on cleanup of AutoCloseable</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-8695">KTOR-8695</a> GMTDate() being offset by 369 years on Windows</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9589">KTOR-9589</a> Duplicate PROPERTY_SETTER target in <code>@InternalAPI</code> annotation</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.5.1</h1> <blockquote> <p>Published 25 June 2026</p> </blockquote> <h3>Improvements</h3> <ul> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9492">KTOR-9492</a> OpenAPI plugin: handle requireXxx functions in compiler plugin</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9569">KTOR-9569</a> Add more details for KDoc of BearerAuthConfig.sendWithoutRequest</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9571">KTOR-9571</a> Add KDoc for BearerAuthConfig.realm</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9570">KTOR-9570</a> Add Kdoc for BearerAuthConfig.refreshTokens</li> </ul> <h3>Bugfixes</h3> <ul> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9646">KTOR-9646</a> Fix Kotlin 2.4.0 compiler plugin breaking changes</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-9591">KTOR-9591</a> OpenAPI: <code>@JsonClassDiscriminator</code> on sealed types is ignored when generating OpenAPI discriminator schema</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9597">KTOR-9597</a> OpenAPI: Schema name collisions because<code>@SerialName</code> of sealed subtypes is used as <code>components.schemas</code> key</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9601">KTOR-9601</a> OpenAPI: nullable <a href="https://github.com/JvmInline"><code>@JvmInline</code></a> value class loses nullability in generated schema</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9620">KTOR-9620</a> Some issues related to digest authentication in 3.5.0</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9623">KTOR-9623</a> Digest Auth: server must respond with one WWW-Authenticate header for each supported algorithm</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9624">KTOR-9624</a> Digest Auth: "Unsupported charset in digest authentication header" for a charset name in lowercase</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9630">KTOR-9630</a> Digest Auth: The plugin sends incorrect nonce when server responds with multiple WWW-Authenticate headers</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9565">KTOR-9565</a> WebRTC: Peer stops receiving messages after a while on iOS</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9610">KTOR-9610</a> WebRtcPeerConnection::close causes ClosedReceiveChannelException for other peer</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9633">KTOR-9633</a> WebRTC statistics fetching race condition</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9603">KTOR-9603</a> Structured concurrency is violated in WebRTC tests</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9671">KTOR-9671</a> Darwin: Semicolons in URL path are sanitized</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9639">KTOR-9639</a> Darwin: WebSocket client crashes the process when a PONG arrives after the session is closed</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9575">KTOR-9575</a> Darwin: findCharset("UTF-16") maps to NSUTF16LittleEndianStringEncoding causing decoding failure for UTF-16 content with BOM</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9661">KTOR-9661</a> HttpCache: InvalidCacheStateException is thrown on 304 when no cached entry matches varyKeys</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9673">KTOR-9673</a> Caching always missing with Content Negotiation</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9596">KTOR-9596</a> HttpTimeout: HttpRequestTimeoutException on any request with runTest and request timeout defined since 3.5.0</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9632">KTOR-9632</a> HttpRequestBuilder.timeout call removes capabilities set in DefaultRequest</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9252">KTOR-9252</a> ContentEncoding: Incomplete gzip response causes client/server to hang indefinitely</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9670">KTOR-9670</a> Compression: The plugin ignores Accept-Encoding q=0 and most-specific matching</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9614">KTOR-9614</a> Zstd Compression: "Destination buffer is too small" exception for a particular sequence of bytes</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9636">KTOR-9636</a> CORS plugin drops OPTIONS preflight requests when allowSameOrigin is on</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9659">KTOR-9659</a> CORS is skipped when the Origin header contains an IPv6 address</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9574">KTOR-9574</a> ContentNegotiation: The charset of <code>Accept-Charset</code> header is used for response deserialization</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9606">KTOR-9606</a> KotlinxSerializationConverter: it fails to deserialize an empty channel closed with a delay</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9617">KTOR-9617</a> OutputStreamContent and WriterContent can exhaust Dispatchers.IO</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9629">KTOR-9629</a> RawSourceChannel: coroutine cancellation is not propagated to the RawSource</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-8870">KTOR-8870</a> File.readChannel: do not close a non-opened file and ignore closing exceptions</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9460">KTOR-9460</a> Curl: Can't build shared library with Ktor 3.4.2</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9607">KTOR-9607</a> Crash on Android 7: NoSuchMethodError getInstanceStrong() since 3.5.0</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9595">KTOR-9595</a> CIO: The engine imports <code>node:net</code> statically and breaks wasmJsBrowser webpack build</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9615">KTOR-9615</a> Apache5: The underlying request is not aborted when coroutine Job is cancelled</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-8443">KTOR-8443</a> RoutingBuilder.contentType does not use parameters when matching</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9425">KTOR-9425</a> SessionTransportTransformerEncrypt init block uses wrong IV size for AES-256 (regression of KTOR-661)</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9621">KTOR-9621</a> RateLimit plugin is bypassed when the nested authenticate block rejects the request</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-8766">KTOR-8766</a> DI: The close method is called twice on cleanup of AutoCloseable</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-8695">KTOR-8695</a> GMTDate() being offset by 369 years on Windows</li> <li><a href="https://youtrack.jetbrains.com/issue/KTOR-9589">KTOR-9589</a> Duplicate PROPERTY_SETTER target in <a href="https://github.com/InternalAPI"><code>@InternalAPI</code></a> annotation</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href=" |
||
| .. | ||
| kotlin-mcp-client | ||
| kotlin-mcp-server | ||
| kotlinlang-mcp-server | ||
| notebooks | ||
| simple-streamable-server | ||
| weather-stdio-server | ||
| README.md | ||
Kotlin MCP SDK Samples
Runnable projects demonstrating MCP server and client implementations with the Kotlin MCP SDK. For background on the protocol itself, see the MCP documentation.
Overview
| Sample | Type | Transport | MCP Features |
|---|---|---|---|
| simple-streamable-server | Server | Streamable HTTP | Tools, Resources, Prompts, Logging |
| kotlinlang-mcp-server | Server | Streamable HTTP | Tools |
| kotlin-mcp-server | Server | STDIO, SSE | Tools, Resources, Prompts |
| weather-stdio-server | Server | STDIO | Tools |
| kotlin-mcp-client | Client | STDIO | Tool discovery & invocation |
| notebooks | Client (Notebook) | Streamable HTTP | Tool discovery & invocation |
Getting Started
- Building a server? Start with simple-streamable-server — it uses the recommended Streamable HTTP transport and covers tools, resources, prompts, and logging.
- Building a client? Open the notebooks sample for a step-by-step walkthrough, or see kotlin-mcp-client for a full CLI client with Anthropic API integration.
Samples
Simple Streamable HTTP Server
A minimal Streamable HTTP server with optional Bearer token authentication. Demonstrates tools
(greet, multi-greet), a prompt template, a resource, and server-to-client logging notifications.
Read more →
Kotlinlang MCP Server
A Streamable HTTP server that exposes the official Kotlin documentation (kotlinlang.org) to LLM clients — full-text search via Algolia and page retrieval in markdown. Demonstrates wrapping a real external API in an MCP server with in-memory caching. Read more →
Kotlin MCP Server
A multi-transport server supporting STDIO, SSE (plain), and SSE (Ktor plugin). Useful for exploring different transport modes side by side. Read more →
Weather STDIO Server
A focused STDIO server that exposes weather forecast and alert tools backed by the weather.gov API. Includes Claude Desktop integration instructions. Read more →
Kotlin MCP Client
An interactive CLI client that connects to any MCP server over STDIO and routes queries through Anthropic's Claude API, bridging MCP tools with LLM conversations. Read more →
MCP Client Notebook
A Kotlin notebook that connects to a remote MCP server via Streamable HTTP and demonstrates ping, tool listing, and tool invocation — all in an interactive cell-by-cell format. Read more →