Mirror of https://github.com/modelcontextprotocol/kotlin-sdk — The official Kotlin SDK for Model Context Protocol servers and clients. Maintained in collaboration with JetBrains
  • Kotlin 98%
  • TypeScript 1.7%
  • Shell 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
dependabot[bot] 4a82d20192
chore(deps): bump the other-dependencies group across 4 directories with 4 updates (#634)
Bumps the other-dependencies group with 3 updates in the
/samples/kotlin-mcp-client directory:
[gradle-wrapper](https://github.com/gradle/gradle),
[com.anthropic:anthropic-java](https://github.com/anthropics/anthropic-sdk-java)
and [com.gradleup.shadow](https://github.com/GradleUp/shadow).
Bumps the other-dependencies group with 2 updates in the
/samples/kotlin-mcp-server directory:
[gradle-wrapper](https://github.com/gradle/gradle) and
[com.gradleup.shadow](https://github.com/GradleUp/shadow).
Bumps the other-dependencies group with 2 updates in the
/samples/simple-streamable-server directory:
[gradle-wrapper](https://github.com/gradle/gradle) and
[com.gradleup.shadow](https://github.com/GradleUp/shadow).
Bumps the other-dependencies group with 3 updates in the
/samples/weather-stdio-server directory:
[gradle-wrapper](https://github.com/gradle/gradle),
[com.gradleup.shadow](https://github.com/GradleUp/shadow) and
[io.github.oshai:kotlin-logging-jvm](https://github.com/oshai/kotlin-logging).

Updates `gradle-wrapper` from 9.3.1 to 9.4.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/gradle/gradle/releases">gradle-wrapper's
releases</a>.</em></p>
<blockquote>
<h2>9.4.1</h2>
<p>The Gradle team is excited to announce Gradle 9.4.1.</p>
<p>Here are the highlights of this release:</p>
<ul>
<li>Java 26 support</li>
<li>Non-class-based JVM tests</li>
<li>Enhanced console progress bar</li>
</ul>
<p><a href="https://docs.gradle.org/9.4.1/release-notes.html">Read the
Release Notes</a></p>
<p>We would like to thank the following community members for their
contributions to this release of Gradle:
<a href="https://github.com/akankshaa-00">akankshaa-00</a>,
<a href="https://github.com/kelemen">Attila Kelemen</a>,
<a href="https://github.com/Vampire">Björn Kautler</a>,
<a href="https://github.com/dblood">dblood</a>,
<a href="https://github.com/drieks">Dennis Rieks</a>,
<a href="https://github.com/duvvuvenkataramana">duvvuvenkataramana</a>,
<a href="https://github.com/wakingrufus">John Burns</a>,
<a href="https://github.com/Julianw03">Julian</a>,
<a href="https://github.com/kevinstembridge">kevinstembridge</a>,
<a href="https://github.com/NielsDoucet">Niels Doucet</a>,
<a href="https://github.com/hfhbd">Philip Wedemann</a>,
<a href="https://github.com/ploober">ploober</a>,
<a href="https://github.com/rhernandez35">Richard Hernandez</a>,
<a href="https://github.com/rpalcolea">Roberto Perez Alcolea</a>,
<a href="https://github.com/slovdahl">Sebastian Lövdahl</a>,
<a href="https://github.com/stephan2405">stephan2405</a>,
<a href="https://github.com/slandelle">Stephane Landelle</a>,
<a href="https://github.com/usv240">Ujwal Suresh Vanjare</a>,
<a href="https://github.com/urdak">Victor Merkulov</a>,
<a href="https://github.com/Pankraz76">Vincent Potuček</a>,
<a href="https://github.com/vlsi">Vladimir Sitnikov</a>.</p>
<h2>Upgrade instructions</h2>
<p>Switch your build to use Gradle 9.4.1 by updating your wrapper:</p>
<pre><code>./gradlew wrapper --gradle-version=9.4.1 &amp;&amp; ./gradlew
wrapper
</code></pre>
<p>See the Gradle <a
href="https://docs.gradle.org/9.4.1/userguide/upgrading_version_9.html">9.x
upgrade guide</a> to learn about deprecations, breaking changes and
other considerations when upgrading.</p>
<p>For Java, Groovy, Kotlin and Android compatibility, see the <a
href="https://docs.gradle.org/9.4.1/userguide/compatibility.html">full
compatibility notes</a>.</p>
<h2>Reporting problems</h2>
<p>If you find a problem with this release, please file a bug on <a
href="https://github.com/gradle/gradle/issues">GitHub Issues</a>
adhering to our issue guidelines.
If you're not sure you're encountering a bug, please use the <a
href="https://discuss.gradle.org/c/help-discuss">forum</a>.</p>
<p>We hope you will build happiness with Gradle, and we look forward to
your feedback via <a href="https://twitter.com/gradle">Twitter</a> or on
<a href="https://github.com/gradle">GitHub</a>.</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2d63270175"><code>2d63270</code></a>
Ignore test (<a
href="https://redirect.github.com/gradle/gradle/issues/37180">#37180</a>)</li>
<li><a
href="4c15906d6a"><code>4c15906</code></a>
Ignore test</li>
<li><a
href="9759ac1dec"><code>9759ac1</code></a>
Make console/SIGINT test deterministic (<a
href="https://redirect.github.com/gradle/gradle/issues/37178">#37178</a>)</li>
<li><a
href="aaf6ed46ed"><code>aaf6ed4</code></a>
Make console/SIGINT test deterministic</li>
<li><a
href="47cb78328a"><code>47cb783</code></a>
Fix OSC 9;4 progress bar not cleared on SIGINT (<a
href="https://redirect.github.com/gradle/gradle/issues/37038">#37038</a>)</li>
<li><a
href="ef03f1d41b"><code>ef03f1d</code></a>
Fix order-dependent assertion in
CrossBuildScriptCachingIntegrationSpec</li>
<li><a
href="fd26fd36d6"><code>fd26fd3</code></a>
Fix OSC 9;4 taskbar progress bar not cleared on build end or SIGINT</li>
<li><a
href="0a84d67519"><code>0a84d67</code></a>
Release notes for 9.4.1 (<a
href="https://redirect.github.com/gradle/gradle/issues/37148">#37148</a>)</li>
<li><a
href="e569c31320"><code>e569c31</code></a>
cleanup</li>
<li><a
href="9f227defc2"><code>9f227de</code></a>
cleanup</li>
<li>Additional commits viewable in <a
href="https://github.com/gradle/gradle/compare/v9.3.1...v9.4.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `com.anthropic:anthropic-java` from 2.15.0 to 2.18.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-java/releases">com.anthropic:anthropic-java's
releases</a>.</em></p>
<blockquote>
<h2>v2.18.0</h2>
<h2>2.18.0 (2026-03-18)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-java/compare/v2.17.0...v2.18.0">v2.17.0...v2.18.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> manual updates (<a
href="c938f65781">c938f65</a>)</li>
<li><strong>api:</strong> manual updates (<a
href="ea3c82fb01">ea3c82f</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>client:</strong> allow updating header/query affecting
fields in <code>toBuilder()</code> (<a
href="81c22eea98">81c22ee</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> tweak CI branches (<a
href="34b9875680">34b9875</a>)</li>
<li><strong>internal:</strong> update retry delay tests (<a
href="704bc83fb4">704bc83</a>)</li>
</ul>
<h2>v2.17.0</h2>
<h2>2.17.0 (2026-03-16)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-java/compare/v2.16.1...v2.17.0">v2.16.1...v2.17.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> GA thinking-display-setting (<a
href="422b461b86">422b461</a>)</li>
</ul>
<h2>v2.16.1</h2>
<h2>2.16.1 (2026-03-11)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-java/compare/v2.16.0...v2.16.1">v2.16.0...v2.16.1</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>client:</strong> correct &quot;exactly one&quot; check in
JSON schema validator (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-java/issues/309">#309</a>)
(<a
href="6e58ba9550">6e58ba9</a>)</li>
<li><strong>tests:</strong> declare baseUrl field in
RetryingHttpClientTest (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-java/issues/1003">#1003</a>)
(<a
href="4546f83261">4546f83</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> codegen related update (<a
href="7a3a942c81">7a3a942</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="a293049d66">a293049</a>)</li>
</ul>
<h2>v2.16.0</h2>
<h2>2.16.0 (2026-03-06)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-java/compare/v2.15.0...v2.16.0">v2.15.0...v2.16.0</a></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-java/blob/main/CHANGELOG.md">com.anthropic:anthropic-java's
changelog</a>.</em></p>
<blockquote>
<h2>2.18.0 (2026-03-18)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-java/compare/v2.17.0...v2.18.0">v2.17.0...v2.18.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> manual updates (<a
href="c938f65781">c938f65</a>)</li>
<li><strong>api:</strong> manual updates (<a
href="ea3c82fb01">ea3c82f</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>client:</strong> allow updating header/query affecting
fields in <code>toBuilder()</code> (<a
href="81c22eea98">81c22ee</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> tweak CI branches (<a
href="34b9875680">34b9875</a>)</li>
<li><strong>internal:</strong> update retry delay tests (<a
href="704bc83fb4">704bc83</a>)</li>
</ul>
<h2>2.17.0 (2026-03-16)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-java/compare/v2.16.1...v2.17.0">v2.16.1...v2.17.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> GA thinking-display-setting (<a
href="422b461b86">422b461</a>)</li>
</ul>
<h2>2.16.1 (2026-03-11)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-java/compare/v2.16.0...v2.16.1">v2.16.0...v2.16.1</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>client:</strong> correct &quot;exactly one&quot; check in
JSON schema validator (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-java/issues/309">#309</a>)
(<a
href="6e58ba9550">6e58ba9</a>)</li>
<li><strong>tests:</strong> declare baseUrl field in
RetryingHttpClientTest (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-java/issues/1003">#1003</a>)
(<a
href="4546f83261">4546f83</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> codegen related update (<a
href="7a3a942c81">7a3a942</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="a293049d66">a293049</a>)</li>
</ul>
<h2>2.16.0 (2026-03-06)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-java/compare/v2.15.0...v2.16.0">v2.15.0...v2.16.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> change array_format to brackets (<a
href="f9eef6ecfd">f9eef6e</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="54cac60b02"><code>54cac60</code></a>
release: 2.18.0</li>
<li><a
href="26250c8205"><code>26250c8</code></a>
feat(api): manual updates</li>
<li><a
href="be47fc30f9"><code>be47fc3</code></a>
feat(api): manual updates</li>
<li><a
href="39bf190121"><code>39bf190</code></a>
fix(client): allow updating header/query affecting fields in
<code>toBuilder()</code></li>
<li><a
href="06d97c600f"><code>06d97c6</code></a>
chore(internal): update retry delay tests</li>
<li><a
href="be96a0cfed"><code>be96a0c</code></a>
chore(internal): tweak CI branches</li>
<li><a
href="ce725820dc"><code>ce72582</code></a>
release: 2.17.0</li>
<li><a
href="97cadfc270"><code>97cadfc</code></a>
feat(api): GA thinking-display-setting</li>
<li><a
href="cb2f646801"><code>cb2f646</code></a>
release: 2.16.1</li>
<li><a
href="aa13ec719d"><code>aa13ec7</code></a>
fix(tests): declare baseUrl field in RetryingHttpClientTest (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-java/issues/1003">#1003</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/anthropics/anthropic-sdk-java/compare/v2.15.0...v2.18.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `com.gradleup.shadow` from 9.2.2 to 9.4.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/GradleUp/shadow/releases">com.gradleup.shadow's
releases</a>.</em></p>
<blockquote>
<h2>9.4.0</h2>
<h3>Added</h3>
<ul>
<li>Support Isolated Projects. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1139">#1139</a>)</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Allow opting out of adding <code>shadowJar</code> into
<code>assemble</code> lifecycle. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1939">#1939</a>)
<pre lang="kotlin"><code>shadow {
// Disable making `assemble` task depend on `shadowJar`. This is enabled
by default.
  addShadowJarToAssembleLifecycle = false
}
</code></pre>
</li>
<li>Stop catching <code>ZipException</code> when writing entries. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1970">#1970</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix interaction with Gradle artifact transforms. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1345">#1345</a>)</li>
<li>Fix <code>skipStringConstants</code> per-relocator behavior in
<code>mapName</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1968">#1968</a>)</li>
<li>Fix failing for non-existent class directories. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1976">#1976</a>)</li>
</ul>
<h2>9.3.2</h2>
<h3>Changed</h3>
<ul>
<li>Stop moving <code>gradleApi</code> dependency from <code>api</code>
to <code>compileOnly</code> for Gradle 9.4+. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1919">#1919</a>)</li>
<li>Log warnings for duplicates in the final JAR. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1931">#1931</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix relocation patterns not included in task fingerprint. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1933">#1933</a>)</li>
</ul>
<h2>9.3.1</h2>
<h3>Fixed</h3>
<ul>
<li>Use ASM from jdependency embedded. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1898">#1898</a>)<br
/>
This fixes potential classpath conflicts when using Shadow with other
plugins that also use ASM.</li>
</ul>
<h2>9.3.0</h2>
<h3>Added</h3>
<ul>
<li>Add <code>PatternFilterableResourceTransformer</code> to simplify
pattern based <code>ResourceTransformer</code>s. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1849">#1849</a>)</li>
<li>Expose <code>patternSet</code> of
<code>ServiceFileTransformer</code> as <code>public</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1849">#1849</a>)</li>
<li>Expose <code>patternSet</code> of
<code>ApacheLicenseResourceTransformer</code> as <code>public</code>.
(<a
href="https://redirect.github.com/GradleUp/shadow/pull/1850">#1850</a>)</li>
<li>Expose <code>patternSet</code> of
<code>ApacheNoticeResourceTransformer</code> as <code>public</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1850">#1850</a>)</li>
<li>Expose <code>patternSet</code> of
<code>PreserveFirstFoundResourceTransformer</code> as
<code>public</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1855">#1855</a>)</li>
<li>Support overriding output path of
<code>ApacheNoticeResourceTransformer</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1851">#1851</a>)</li>
<li>Add new merge strategy <code>Fail</code> to
<code>PropertiesFileTransformer</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1856">#1856</a>)</li>
<li>Add <code>FindResourceInClasspath</code> task to help with debugging
issues with merged duplicate resources. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1860">#1860</a>)</li>
<li>Add <code>MergeLicenseResourceTransformer</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1858">#1858</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e51f3e74c4"><code>e51f3e7</code></a>
Prepare version 9.4.0</li>
<li><a
href="cf531d45a4"><code>cf531d4</code></a>
Prefer parameterized logging (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1977">#1977</a>)</li>
<li><a
href="85ba389ed2"><code>85ba389</code></a>
Fix failing for non-existent class directories (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1976">#1976</a>)</li>
<li><a
href="3a243696a6"><code>3a24369</code></a>
Update dependency org.apache.maven:maven-model to v3.9.14 (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1973">#1973</a>)</li>
<li><a
href="6e3dfb5167"><code>6e3dfb5</code></a>
Use removePrefix instead of replace for multi-release prefix removal (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1972">#1972</a>)</li>
<li><a
href="49f8c31185"><code>49f8c31</code></a>
Reuse most logic for writing entries (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1971">#1971</a>)</li>
<li><a
href="ed47d0cbd0"><code>ed47d0c</code></a>
Update README.md for clarity and formatting</li>
<li><a
href="d73d94ad59"><code>d73d94a</code></a>
Stop catching ZipException when writing entries (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1970">#1970</a>)</li>
<li><a
href="0564cae7dc"><code>0564cae</code></a>
Fix skipStringConstants per-relocator behavior: use continue instead of
retur...</li>
<li><a
href="8d995b29ef"><code>8d995b2</code></a>
Split relocators remapping (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1967">#1967</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/GradleUp/shadow/compare/9.2.2...9.4.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `gradle-wrapper` from 9.3.1 to 9.4.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/gradle/gradle/releases">gradle-wrapper's
releases</a>.</em></p>
<blockquote>
<h2>9.4.1</h2>
<p>The Gradle team is excited to announce Gradle 9.4.1.</p>
<p>Here are the highlights of this release:</p>
<ul>
<li>Java 26 support</li>
<li>Non-class-based JVM tests</li>
<li>Enhanced console progress bar</li>
</ul>
<p><a href="https://docs.gradle.org/9.4.1/release-notes.html">Read the
Release Notes</a></p>
<p>We would like to thank the following community members for their
contributions to this release of Gradle:
<a href="https://github.com/akankshaa-00">akankshaa-00</a>,
<a href="https://github.com/kelemen">Attila Kelemen</a>,
<a href="https://github.com/Vampire">Björn Kautler</a>,
<a href="https://github.com/dblood">dblood</a>,
<a href="https://github.com/drieks">Dennis Rieks</a>,
<a href="https://github.com/duvvuvenkataramana">duvvuvenkataramana</a>,
<a href="https://github.com/wakingrufus">John Burns</a>,
<a href="https://github.com/Julianw03">Julian</a>,
<a href="https://github.com/kevinstembridge">kevinstembridge</a>,
<a href="https://github.com/NielsDoucet">Niels Doucet</a>,
<a href="https://github.com/hfhbd">Philip Wedemann</a>,
<a href="https://github.com/ploober">ploober</a>,
<a href="https://github.com/rhernandez35">Richard Hernandez</a>,
<a href="https://github.com/rpalcolea">Roberto Perez Alcolea</a>,
<a href="https://github.com/slovdahl">Sebastian Lövdahl</a>,
<a href="https://github.com/stephan2405">stephan2405</a>,
<a href="https://github.com/slandelle">Stephane Landelle</a>,
<a href="https://github.com/usv240">Ujwal Suresh Vanjare</a>,
<a href="https://github.com/urdak">Victor Merkulov</a>,
<a href="https://github.com/Pankraz76">Vincent Potuček</a>,
<a href="https://github.com/vlsi">Vladimir Sitnikov</a>.</p>
<h2>Upgrade instructions</h2>
<p>Switch your build to use Gradle 9.4.1 by updating your wrapper:</p>
<pre><code>./gradlew wrapper --gradle-version=9.4.1 &amp;&amp; ./gradlew
wrapper
</code></pre>
<p>See the Gradle <a
href="https://docs.gradle.org/9.4.1/userguide/upgrading_version_9.html">9.x
upgrade guide</a> to learn about deprecations, breaking changes and
other considerations when upgrading.</p>
<p>For Java, Groovy, Kotlin and Android compatibility, see the <a
href="https://docs.gradle.org/9.4.1/userguide/compatibility.html">full
compatibility notes</a>.</p>
<h2>Reporting problems</h2>
<p>If you find a problem with this release, please file a bug on <a
href="https://github.com/gradle/gradle/issues">GitHub Issues</a>
adhering to our issue guidelines.
If you're not sure you're encountering a bug, please use the <a
href="https://discuss.gradle.org/c/help-discuss">forum</a>.</p>
<p>We hope you will build happiness with Gradle, and we look forward to
your feedback via <a href="https://twitter.com/gradle">Twitter</a> or on
<a href="https://github.com/gradle">GitHub</a>.</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2d63270175"><code>2d63270</code></a>
Ignore test (<a
href="https://redirect.github.com/gradle/gradle/issues/37180">#37180</a>)</li>
<li><a
href="4c15906d6a"><code>4c15906</code></a>
Ignore test</li>
<li><a
href="9759ac1dec"><code>9759ac1</code></a>
Make console/SIGINT test deterministic (<a
href="https://redirect.github.com/gradle/gradle/issues/37178">#37178</a>)</li>
<li><a
href="aaf6ed46ed"><code>aaf6ed4</code></a>
Make console/SIGINT test deterministic</li>
<li><a
href="47cb78328a"><code>47cb783</code></a>
Fix OSC 9;4 progress bar not cleared on SIGINT (<a
href="https://redirect.github.com/gradle/gradle/issues/37038">#37038</a>)</li>
<li><a
href="ef03f1d41b"><code>ef03f1d</code></a>
Fix order-dependent assertion in
CrossBuildScriptCachingIntegrationSpec</li>
<li><a
href="fd26fd36d6"><code>fd26fd3</code></a>
Fix OSC 9;4 taskbar progress bar not cleared on build end or SIGINT</li>
<li><a
href="0a84d67519"><code>0a84d67</code></a>
Release notes for 9.4.1 (<a
href="https://redirect.github.com/gradle/gradle/issues/37148">#37148</a>)</li>
<li><a
href="e569c31320"><code>e569c31</code></a>
cleanup</li>
<li><a
href="9f227defc2"><code>9f227de</code></a>
cleanup</li>
<li>Additional commits viewable in <a
href="https://github.com/gradle/gradle/compare/v9.3.1...v9.4.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `com.gradleup.shadow` from 9.2.2 to 9.4.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/GradleUp/shadow/releases">com.gradleup.shadow's
releases</a>.</em></p>
<blockquote>
<h2>9.4.0</h2>
<h3>Added</h3>
<ul>
<li>Support Isolated Projects. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1139">#1139</a>)</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Allow opting out of adding <code>shadowJar</code> into
<code>assemble</code> lifecycle. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1939">#1939</a>)
<pre lang="kotlin"><code>shadow {
// Disable making `assemble` task depend on `shadowJar`. This is enabled
by default.
  addShadowJarToAssembleLifecycle = false
}
</code></pre>
</li>
<li>Stop catching <code>ZipException</code> when writing entries. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1970">#1970</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix interaction with Gradle artifact transforms. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1345">#1345</a>)</li>
<li>Fix <code>skipStringConstants</code> per-relocator behavior in
<code>mapName</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1968">#1968</a>)</li>
<li>Fix failing for non-existent class directories. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1976">#1976</a>)</li>
</ul>
<h2>9.3.2</h2>
<h3>Changed</h3>
<ul>
<li>Stop moving <code>gradleApi</code> dependency from <code>api</code>
to <code>compileOnly</code> for Gradle 9.4+. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1919">#1919</a>)</li>
<li>Log warnings for duplicates in the final JAR. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1931">#1931</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix relocation patterns not included in task fingerprint. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1933">#1933</a>)</li>
</ul>
<h2>9.3.1</h2>
<h3>Fixed</h3>
<ul>
<li>Use ASM from jdependency embedded. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1898">#1898</a>)<br
/>
This fixes potential classpath conflicts when using Shadow with other
plugins that also use ASM.</li>
</ul>
<h2>9.3.0</h2>
<h3>Added</h3>
<ul>
<li>Add <code>PatternFilterableResourceTransformer</code> to simplify
pattern based <code>ResourceTransformer</code>s. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1849">#1849</a>)</li>
<li>Expose <code>patternSet</code> of
<code>ServiceFileTransformer</code> as <code>public</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1849">#1849</a>)</li>
<li>Expose <code>patternSet</code> of
<code>ApacheLicenseResourceTransformer</code> as <code>public</code>.
(<a
href="https://redirect.github.com/GradleUp/shadow/pull/1850">#1850</a>)</li>
<li>Expose <code>patternSet</code> of
<code>ApacheNoticeResourceTransformer</code> as <code>public</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1850">#1850</a>)</li>
<li>Expose <code>patternSet</code> of
<code>PreserveFirstFoundResourceTransformer</code> as
<code>public</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1855">#1855</a>)</li>
<li>Support overriding output path of
<code>ApacheNoticeResourceTransformer</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1851">#1851</a>)</li>
<li>Add new merge strategy <code>Fail</code> to
<code>PropertiesFileTransformer</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1856">#1856</a>)</li>
<li>Add <code>FindResourceInClasspath</code> task to help with debugging
issues with merged duplicate resources. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1860">#1860</a>)</li>
<li>Add <code>MergeLicenseResourceTransformer</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1858">#1858</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e51f3e74c4"><code>e51f3e7</code></a>
Prepare version 9.4.0</li>
<li><a
href="cf531d45a4"><code>cf531d4</code></a>
Prefer parameterized logging (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1977">#1977</a>)</li>
<li><a
href="85ba389ed2"><code>85ba389</code></a>
Fix failing for non-existent class directories (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1976">#1976</a>)</li>
<li><a
href="3a243696a6"><code>3a24369</code></a>
Update dependency org.apache.maven:maven-model to v3.9.14 (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1973">#1973</a>)</li>
<li><a
href="6e3dfb5167"><code>6e3dfb5</code></a>
Use removePrefix instead of replace for multi-release prefix removal (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1972">#1972</a>)</li>
<li><a
href="49f8c31185"><code>49f8c31</code></a>
Reuse most logic for writing entries (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1971">#1971</a>)</li>
<li><a
href="ed47d0cbd0"><code>ed47d0c</code></a>
Update README.md for clarity and formatting</li>
<li><a
href="d73d94ad59"><code>d73d94a</code></a>
Stop catching ZipException when writing entries (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1970">#1970</a>)</li>
<li><a
href="0564cae7dc"><code>0564cae</code></a>
Fix skipStringConstants per-relocator behavior: use continue instead of
retur...</li>
<li><a
href="8d995b29ef"><code>8d995b2</code></a>
Split relocators remapping (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1967">#1967</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/GradleUp/shadow/compare/9.2.2...9.4.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `gradle-wrapper` from 9.3.1 to 9.4.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/gradle/gradle/releases">gradle-wrapper's
releases</a>.</em></p>
<blockquote>
<h2>9.4.1</h2>
<p>The Gradle team is excited to announce Gradle 9.4.1.</p>
<p>Here are the highlights of this release:</p>
<ul>
<li>Java 26 support</li>
<li>Non-class-based JVM tests</li>
<li>Enhanced console progress bar</li>
</ul>
<p><a href="https://docs.gradle.org/9.4.1/release-notes.html">Read the
Release Notes</a></p>
<p>We would like to thank the following community members for their
contributions to this release of Gradle:
<a href="https://github.com/akankshaa-00">akankshaa-00</a>,
<a href="https://github.com/kelemen">Attila Kelemen</a>,
<a href="https://github.com/Vampire">Björn Kautler</a>,
<a href="https://github.com/dblood">dblood</a>,
<a href="https://github.com/drieks">Dennis Rieks</a>,
<a href="https://github.com/duvvuvenkataramana">duvvuvenkataramana</a>,
<a href="https://github.com/wakingrufus">John Burns</a>,
<a href="https://github.com/Julianw03">Julian</a>,
<a href="https://github.com/kevinstembridge">kevinstembridge</a>,
<a href="https://github.com/NielsDoucet">Niels Doucet</a>,
<a href="https://github.com/hfhbd">Philip Wedemann</a>,
<a href="https://github.com/ploober">ploober</a>,
<a href="https://github.com/rhernandez35">Richard Hernandez</a>,
<a href="https://github.com/rpalcolea">Roberto Perez Alcolea</a>,
<a href="https://github.com/slovdahl">Sebastian Lövdahl</a>,
<a href="https://github.com/stephan2405">stephan2405</a>,
<a href="https://github.com/slandelle">Stephane Landelle</a>,
<a href="https://github.com/usv240">Ujwal Suresh Vanjare</a>,
<a href="https://github.com/urdak">Victor Merkulov</a>,
<a href="https://github.com/Pankraz76">Vincent Potuček</a>,
<a href="https://github.com/vlsi">Vladimir Sitnikov</a>.</p>
<h2>Upgrade instructions</h2>
<p>Switch your build to use Gradle 9.4.1 by updating your wrapper:</p>
<pre><code>./gradlew wrapper --gradle-version=9.4.1 &amp;&amp; ./gradlew
wrapper
</code></pre>
<p>See the Gradle <a
href="https://docs.gradle.org/9.4.1/userguide/upgrading_version_9.html">9.x
upgrade guide</a> to learn about deprecations, breaking changes and
other considerations when upgrading.</p>
<p>For Java, Groovy, Kotlin and Android compatibility, see the <a
href="https://docs.gradle.org/9.4.1/userguide/compatibility.html">full
compatibility notes</a>.</p>
<h2>Reporting problems</h2>
<p>If you find a problem with this release, please file a bug on <a
href="https://github.com/gradle/gradle/issues">GitHub Issues</a>
adhering to our issue guidelines.
If you're not sure you're encountering a bug, please use the <a
href="https://discuss.gradle.org/c/help-discuss">forum</a>.</p>
<p>We hope you will build happiness with Gradle, and we look forward to
your feedback via <a href="https://twitter.com/gradle">Twitter</a> or on
<a href="https://github.com/gradle">GitHub</a>.</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2d63270175"><code>2d63270</code></a>
Ignore test (<a
href="https://redirect.github.com/gradle/gradle/issues/37180">#37180</a>)</li>
<li><a
href="4c15906d6a"><code>4c15906</code></a>
Ignore test</li>
<li><a
href="9759ac1dec"><code>9759ac1</code></a>
Make console/SIGINT test deterministic (<a
href="https://redirect.github.com/gradle/gradle/issues/37178">#37178</a>)</li>
<li><a
href="aaf6ed46ed"><code>aaf6ed4</code></a>
Make console/SIGINT test deterministic</li>
<li><a
href="47cb78328a"><code>47cb783</code></a>
Fix OSC 9;4 progress bar not cleared on SIGINT (<a
href="https://redirect.github.com/gradle/gradle/issues/37038">#37038</a>)</li>
<li><a
href="ef03f1d41b"><code>ef03f1d</code></a>
Fix order-dependent assertion in
CrossBuildScriptCachingIntegrationSpec</li>
<li><a
href="fd26fd36d6"><code>fd26fd3</code></a>
Fix OSC 9;4 taskbar progress bar not cleared on build end or SIGINT</li>
<li><a
href="0a84d67519"><code>0a84d67</code></a>
Release notes for 9.4.1 (<a
href="https://redirect.github.com/gradle/gradle/issues/37148">#37148</a>)</li>
<li><a
href="e569c31320"><code>e569c31</code></a>
cleanup</li>
<li><a
href="9f227defc2"><code>9f227de</code></a>
cleanup</li>
<li>Additional commits viewable in <a
href="https://github.com/gradle/gradle/compare/v9.3.1...v9.4.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `com.gradleup.shadow` from 9.2.2 to 9.4.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/GradleUp/shadow/releases">com.gradleup.shadow's
releases</a>.</em></p>
<blockquote>
<h2>9.4.0</h2>
<h3>Added</h3>
<ul>
<li>Support Isolated Projects. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1139">#1139</a>)</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Allow opting out of adding <code>shadowJar</code> into
<code>assemble</code> lifecycle. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1939">#1939</a>)
<pre lang="kotlin"><code>shadow {
// Disable making `assemble` task depend on `shadowJar`. This is enabled
by default.
  addShadowJarToAssembleLifecycle = false
}
</code></pre>
</li>
<li>Stop catching <code>ZipException</code> when writing entries. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1970">#1970</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix interaction with Gradle artifact transforms. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1345">#1345</a>)</li>
<li>Fix <code>skipStringConstants</code> per-relocator behavior in
<code>mapName</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1968">#1968</a>)</li>
<li>Fix failing for non-existent class directories. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1976">#1976</a>)</li>
</ul>
<h2>9.3.2</h2>
<h3>Changed</h3>
<ul>
<li>Stop moving <code>gradleApi</code> dependency from <code>api</code>
to <code>compileOnly</code> for Gradle 9.4+. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1919">#1919</a>)</li>
<li>Log warnings for duplicates in the final JAR. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1931">#1931</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix relocation patterns not included in task fingerprint. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1933">#1933</a>)</li>
</ul>
<h2>9.3.1</h2>
<h3>Fixed</h3>
<ul>
<li>Use ASM from jdependency embedded. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1898">#1898</a>)<br
/>
This fixes potential classpath conflicts when using Shadow with other
plugins that also use ASM.</li>
</ul>
<h2>9.3.0</h2>
<h3>Added</h3>
<ul>
<li>Add <code>PatternFilterableResourceTransformer</code> to simplify
pattern based <code>ResourceTransformer</code>s. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1849">#1849</a>)</li>
<li>Expose <code>patternSet</code> of
<code>ServiceFileTransformer</code> as <code>public</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1849">#1849</a>)</li>
<li>Expose <code>patternSet</code> of
<code>ApacheLicenseResourceTransformer</code> as <code>public</code>.
(<a
href="https://redirect.github.com/GradleUp/shadow/pull/1850">#1850</a>)</li>
<li>Expose <code>patternSet</code> of
<code>ApacheNoticeResourceTransformer</code> as <code>public</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1850">#1850</a>)</li>
<li>Expose <code>patternSet</code> of
<code>PreserveFirstFoundResourceTransformer</code> as
<code>public</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1855">#1855</a>)</li>
<li>Support overriding output path of
<code>ApacheNoticeResourceTransformer</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1851">#1851</a>)</li>
<li>Add new merge strategy <code>Fail</code> to
<code>PropertiesFileTransformer</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1856">#1856</a>)</li>
<li>Add <code>FindResourceInClasspath</code> task to help with debugging
issues with merged duplicate resources. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1860">#1860</a>)</li>
<li>Add <code>MergeLicenseResourceTransformer</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1858">#1858</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e51f3e74c4"><code>e51f3e7</code></a>
Prepare version 9.4.0</li>
<li><a
href="cf531d45a4"><code>cf531d4</code></a>
Prefer parameterized logging (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1977">#1977</a>)</li>
<li><a
href="85ba389ed2"><code>85ba389</code></a>
Fix failing for non-existent class directories (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1976">#1976</a>)</li>
<li><a
href="3a243696a6"><code>3a24369</code></a>
Update dependency org.apache.maven:maven-model to v3.9.14 (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1973">#1973</a>)</li>
<li><a
href="6e3dfb5167"><code>6e3dfb5</code></a>
Use removePrefix instead of replace for multi-release prefix removal (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1972">#1972</a>)</li>
<li><a
href="49f8c31185"><code>49f8c31</code></a>
Reuse most logic for writing entries (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1971">#1971</a>)</li>
<li><a
href="ed47d0cbd0"><code>ed47d0c</code></a>
Update README.md for clarity and formatting</li>
<li><a
href="d73d94ad59"><code>d73d94a</code></a>
Stop catching ZipException when writing entries (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1970">#1970</a>)</li>
<li><a
href="0564cae7dc"><code>0564cae</code></a>
Fix skipStringConstants per-relocator behavior: use continue instead of
retur...</li>
<li><a
href="8d995b29ef"><code>8d995b2</code></a>
Split relocators remapping (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1967">#1967</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/GradleUp/shadow/compare/9.2.2...9.4.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `gradle-wrapper` from 9.3.1 to 9.4.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/gradle/gradle/releases">gradle-wrapper's
releases</a>.</em></p>
<blockquote>
<h2>9.4.1</h2>
<p>The Gradle team is excited to announce Gradle 9.4.1.</p>
<p>Here are the highlights of this release:</p>
<ul>
<li>Java 26 support</li>
<li>Non-class-based JVM tests</li>
<li>Enhanced console progress bar</li>
</ul>
<p><a href="https://docs.gradle.org/9.4.1/release-notes.html">Read the
Release Notes</a></p>
<p>We would like to thank the following community members for their
contributions to this release of Gradle:
<a href="https://github.com/akankshaa-00">akankshaa-00</a>,
<a href="https://github.com/kelemen">Attila Kelemen</a>,
<a href="https://github.com/Vampire">Björn Kautler</a>,
<a href="https://github.com/dblood">dblood</a>,
<a href="https://github.com/drieks">Dennis Rieks</a>,
<a href="https://github.com/duvvuvenkataramana">duvvuvenkataramana</a>,
<a href="https://github.com/wakingrufus">John Burns</a>,
<a href="https://github.com/Julianw03">Julian</a>,
<a href="https://github.com/kevinstembridge">kevinstembridge</a>,
<a href="https://github.com/NielsDoucet">Niels Doucet</a>,
<a href="https://github.com/hfhbd">Philip Wedemann</a>,
<a href="https://github.com/ploober">ploober</a>,
<a href="https://github.com/rhernandez35">Richard Hernandez</a>,
<a href="https://github.com/rpalcolea">Roberto Perez Alcolea</a>,
<a href="https://github.com/slovdahl">Sebastian Lövdahl</a>,
<a href="https://github.com/stephan2405">stephan2405</a>,
<a href="https://github.com/slandelle">Stephane Landelle</a>,
<a href="https://github.com/usv240">Ujwal Suresh Vanjare</a>,
<a href="https://github.com/urdak">Victor Merkulov</a>,
<a href="https://github.com/Pankraz76">Vincent Potuček</a>,
<a href="https://github.com/vlsi">Vladimir Sitnikov</a>.</p>
<h2>Upgrade instructions</h2>
<p>Switch your build to use Gradle 9.4.1 by updating your wrapper:</p>
<pre><code>./gradlew wrapper --gradle-version=9.4.1 &amp;&amp; ./gradlew
wrapper
</code></pre>
<p>See the Gradle <a
href="https://docs.gradle.org/9.4.1/userguide/upgrading_version_9.html">9.x
upgrade guide</a> to learn about deprecations, breaking changes and
other considerations when upgrading.</p>
<p>For Java, Groovy, Kotlin and Android compatibility, see the <a
href="https://docs.gradle.org/9.4.1/userguide/compatibility.html">full
compatibility notes</a>.</p>
<h2>Reporting problems</h2>
<p>If you find a problem with this release, please file a bug on <a
href="https://github.com/gradle/gradle/issues">GitHub Issues</a>
adhering to our issue guidelines.
If you're not sure you're encountering a bug, please use the <a
href="https://discuss.gradle.org/c/help-discuss">forum</a>.</p>
<p>We hope you will build happiness with Gradle, and we look forward to
your feedback via <a href="https://twitter.com/gradle">Twitter</a> or on
<a href="https://github.com/gradle">GitHub</a>.</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2d63270175"><code>2d63270</code></a>
Ignore test (<a
href="https://redirect.github.com/gradle/gradle/issues/37180">#37180</a>)</li>
<li><a
href="4c15906d6a"><code>4c15906</code></a>
Ignore test</li>
<li><a
href="9759ac1dec"><code>9759ac1</code></a>
Make console/SIGINT test deterministic (<a
href="https://redirect.github.com/gradle/gradle/issues/37178">#37178</a>)</li>
<li><a
href="aaf6ed46ed"><code>aaf6ed4</code></a>
Make console/SIGINT test deterministic</li>
<li><a
href="47cb78328a"><code>47cb783</code></a>
Fix OSC 9;4 progress bar not cleared on SIGINT (<a
href="https://redirect.github.com/gradle/gradle/issues/37038">#37038</a>)</li>
<li><a
href="ef03f1d41b"><code>ef03f1d</code></a>
Fix order-dependent assertion in
CrossBuildScriptCachingIntegrationSpec</li>
<li><a
href="fd26fd36d6"><code>fd26fd3</code></a>
Fix OSC 9;4 taskbar progress bar not cleared on build end or SIGINT</li>
<li><a
href="0a84d67519"><code>0a84d67</code></a>
Release notes for 9.4.1 (<a
href="https://redirect.github.com/gradle/gradle/issues/37148">#37148</a>)</li>
<li><a
href="e569c31320"><code>e569c31</code></a>
cleanup</li>
<li><a
href="9f227defc2"><code>9f227de</code></a>
cleanup</li>
<li>Additional commits viewable in <a
href="https://github.com/gradle/gradle/compare/v9.3.1...v9.4.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `com.gradleup.shadow` from 9.2.2 to 9.4.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/GradleUp/shadow/releases">com.gradleup.shadow's
releases</a>.</em></p>
<blockquote>
<h2>9.4.0</h2>
<h3>Added</h3>
<ul>
<li>Support Isolated Projects. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1139">#1139</a>)</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Allow opting out of adding <code>shadowJar</code> into
<code>assemble</code> lifecycle. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1939">#1939</a>)
<pre lang="kotlin"><code>shadow {
// Disable making `assemble` task depend on `shadowJar`. This is enabled
by default.
  addShadowJarToAssembleLifecycle = false
}
</code></pre>
</li>
<li>Stop catching <code>ZipException</code> when writing entries. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1970">#1970</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix interaction with Gradle artifact transforms. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1345">#1345</a>)</li>
<li>Fix <code>skipStringConstants</code> per-relocator behavior in
<code>mapName</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1968">#1968</a>)</li>
<li>Fix failing for non-existent class directories. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1976">#1976</a>)</li>
</ul>
<h2>9.3.2</h2>
<h3>Changed</h3>
<ul>
<li>Stop moving <code>gradleApi</code> dependency from <code>api</code>
to <code>compileOnly</code> for Gradle 9.4+. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1919">#1919</a>)</li>
<li>Log warnings for duplicates in the final JAR. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1931">#1931</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fix relocation patterns not included in task fingerprint. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1933">#1933</a>)</li>
</ul>
<h2>9.3.1</h2>
<h3>Fixed</h3>
<ul>
<li>Use ASM from jdependency embedded. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1898">#1898</a>)<br
/>
This fixes potential classpath conflicts when using Shadow with other
plugins that also use ASM.</li>
</ul>
<h2>9.3.0</h2>
<h3>Added</h3>
<ul>
<li>Add <code>PatternFilterableResourceTransformer</code> to simplify
pattern based <code>ResourceTransformer</code>s. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1849">#1849</a>)</li>
<li>Expose <code>patternSet</code> of
<code>ServiceFileTransformer</code> as <code>public</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1849">#1849</a>)</li>
<li>Expose <code>patternSet</code> of
<code>ApacheLicenseResourceTransformer</code> as <code>public</code>.
(<a
href="https://redirect.github.com/GradleUp/shadow/pull/1850">#1850</a>)</li>
<li>Expose <code>patternSet</code> of
<code>ApacheNoticeResourceTransformer</code> as <code>public</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1850">#1850</a>)</li>
<li>Expose <code>patternSet</code> of
<code>PreserveFirstFoundResourceTransformer</code> as
<code>public</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1855">#1855</a>)</li>
<li>Support overriding output path of
<code>ApacheNoticeResourceTransformer</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1851">#1851</a>)</li>
<li>Add new merge strategy <code>Fail</code> to
<code>PropertiesFileTransformer</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1856">#1856</a>)</li>
<li>Add <code>FindResourceInClasspath</code> task to help with debugging
issues with merged duplicate resources. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1860">#1860</a>)</li>
<li>Add <code>MergeLicenseResourceTransformer</code>. (<a
href="https://redirect.github.com/GradleUp/shadow/pull/1858">#1858</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e51f3e74c4"><code>e51f3e7</code></a>
Prepare version 9.4.0</li>
<li><a
href="cf531d45a4"><code>cf531d4</code></a>
Prefer parameterized logging (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1977">#1977</a>)</li>
<li><a
href="85ba389ed2"><code>85ba389</code></a>
Fix failing for non-existent class directories (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1976">#1976</a>)</li>
<li><a
href="3a243696a6"><code>3a24369</code></a>
Update dependency org.apache.maven:maven-model to v3.9.14 (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1973">#1973</a>)</li>
<li><a
href="6e3dfb5167"><code>6e3dfb5</code></a>
Use removePrefix instead of replace for multi-release prefix removal (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1972">#1972</a>)</li>
<li><a
href="49f8c31185"><code>49f8c31</code></a>
Reuse most logic for writing entries (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1971">#1971</a>)</li>
<li><a
href="ed47d0cbd0"><code>ed47d0c</code></a>
Update README.md for clarity and formatting</li>
<li><a
href="d73d94ad59"><code>d73d94a</code></a>
Stop catching ZipException when writing entries (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1970">#1970</a>)</li>
<li><a
href="0564cae7dc"><code>0564cae</code></a>
Fix skipStringConstants per-relocator behavior: use continue instead of
retur...</li>
<li><a
href="8d995b29ef"><code>8d995b2</code></a>
Split relocators remapping (<a
href="https://redirect.github.com/GradleUp/shadow/issues/1967">#1967</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/GradleUp/shadow/compare/9.2.2...9.4.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `io.github.oshai:kotlin-logging-jvm` from 7.0.13 to 8.0.01
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/oshai/kotlin-logging/releases">io.github.oshai:kotlin-logging-jvm's
releases</a>.</em></p>
<blockquote>
<h2>8.0.01</h2>
<h2>What's Changed</h2>
<ul>
<li>Refactor: Unified Logger Provider Architecture by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/584">oshai/kotlin-logging#584</a></li>
<li>refactor: Refine initialization logic by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/585">oshai/kotlin-logging#585</a></li>
<li>KLogger API Cleanup &amp; Ambiguity Fix by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/586">oshai/kotlin-logging#586</a></li>
<li>fix action by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/593">oshai/kotlin-logging#593</a></li>
<li>feat: add timestamp to KLoggingEvent by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/591">oshai/kotlin-logging#591</a></li>
<li>Fix Darwin historical logs redaction using public format string by
<a href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/590">oshai/kotlin-logging#590</a></li>
<li>feat: add configuration to suppress startup message by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/589">oshai/kotlin-logging#589</a></li>
<li>Feature: Add JPMS Support (Issue <a
href="https://redirect.github.com/oshai/kotlin-logging/issues/365">#365</a>)
by <a href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/592">oshai/kotlin-logging#592</a></li>
<li>Fix Darwin OSLog composition failure in historical logs by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/594">oshai/kotlin-logging#594</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/oshai/kotlin-logging/compare/7.0.14...8.0.01">https://github.com/oshai/kotlin-logging/compare/7.0.14...8.0.01</a></p>
<h2>8.0.00-beta-04</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix Darwin OSLog composition failure in historical logs by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/594">oshai/kotlin-logging#594</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/oshai/kotlin-logging/compare/8.0.00-beta-03...8.0.00-beta-04">https://github.com/oshai/kotlin-logging/compare/8.0.00-beta-03...8.0.00-beta-04</a></p>
<h2>8.0.00-beta-03</h2>
<h2>What's Changed</h2>
<ul>
<li>Feature: Add JPMS Support (Issue <a
href="https://redirect.github.com/oshai/kotlin-logging/issues/365">#365</a>)
by <a href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/592">oshai/kotlin-logging#592</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/oshai/kotlin-logging/compare/8.0.00-beta-02...8.0.00-beta-03">https://github.com/oshai/kotlin-logging/compare/8.0.00-beta-02...8.0.00-beta-03</a></p>
<h2>8.0.00-beta-02</h2>
<h2>What's Changed</h2>
<ul>
<li>refactor: Refine initialization logic by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/585">oshai/kotlin-logging#585</a></li>
<li>KLogger API Cleanup &amp; Ambiguity Fix by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/586">oshai/kotlin-logging#586</a></li>
<li>fix action by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/593">oshai/kotlin-logging#593</a></li>
<li>feat: add timestamp to KLoggingEvent by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/591">oshai/kotlin-logging#591</a></li>
<li>Fix Darwin historical logs redaction using public format string by
<a href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/590">oshai/kotlin-logging#590</a></li>
<li>feat: add configuration to suppress startup message by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/589">oshai/kotlin-logging#589</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/oshai/kotlin-logging/compare/8.0.00-beta-01...8.0.00-beta-02">https://github.com/oshai/kotlin-logging/compare/8.0.00-beta-01...8.0.00-beta-02</a></p>
<h2>8.0.00-beta-01</h2>
<h2>What's Changed</h2>
<ul>
<li>Refactor: Unified Logger Provider Architecture by <a
href="https://github.com/oshai"><code>@​oshai</code></a> in <a
href="https://redirect.github.com/oshai/kotlin-logging/pull/584">oshai/kotlin-logging#584</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/oshai/kotlin-logging/compare/7.0.14...8.0.00-beta-01">https://github.com/oshai/kotlin-logging/compare/7.0.14...8.0.00-beta-01</a></p>
<h2>7.0.14</h2>
<h2>What's Changed</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b1eb9fc35c"><code>b1eb9fc</code></a>
bump version to 8.0.01</li>
<li><a
href="ff436aa5cc"><code>ff436aa</code></a>
bump version to 8.0.00-beta-05</li>
<li><a
href="36e56c3707"><code>36e56c3</code></a>
Fix Darwin OSLog composition failure in historical logs (<a
href="https://redirect.github.com/oshai/kotlin-logging/issues/594">#594</a>)</li>
<li><a
href="4ff0b7d229"><code>4ff0b7d</code></a>
bump version to 8.0.00-beta-04</li>
<li><a
href="283f30c206"><code>283f30c</code></a>
Feature: Add JPMS Support (Issue <a
href="https://redirect.github.com/oshai/kotlin-logging/issues/365">#365</a>)
(<a
href="https://redirect.github.com/oshai/kotlin-logging/issues/592">#592</a>)</li>
<li><a
href="e5366c25bf"><code>e5366c2</code></a>
bump version to 8.0.00-beta-03</li>
<li><a
href="eb267abdc8"><code>eb267ab</code></a>
feat: add configuration to suppress startup message</li>
<li><a
href="6a67a6fc63"><code>6a67a6f</code></a>
Fix Darwin historical logs redaction using public format string</li>
<li><a
href="aa51a0d9e3"><code>aa51a0d</code></a>
feat: add timestamp to KLoggingEvent</li>
<li><a
href="733deaa6b3"><code>733deaa</code></a>
fix action</li>
<li>Additional commits viewable in <a
href="https://github.com/oshai/kotlin-logging/compare/7.0.13...8.0.01">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-27 00:58:15 +00:00
.claude/skills/mcp-docs feat: add mcp documentation skill for spec-aware development (#609) 2026-03-18 17:53:26 +01:00
.github chore(deps): bump the all-actions group with 3 updates (#631) 2026-03-26 21:28:37 +00:00
.idea chore: relax Detekt rules for tests (#582) 2026-03-03 23:46:32 +02:00
buildSrc refactor(core): Fix Kotlin language and api version to 2.1 in build config (#620) 2026-03-26 17:36:01 +02:00
config/detekt refactor(integration-test): modernize ts tests, update versions, rename SSE -> HTTP (#618) 2026-03-26 13:19:10 +01:00
conformance-test feat: #502 resource templates with basic template matcher (#606) 2026-03-19 12:30:22 +02:00
docs docs: streamable server sample (#595) 2026-03-10 12:45:21 +01:00
gradle chore(deps): bump the infrastructure group with 2 updates (#632) 2026-03-26 23:11:06 +02:00
integration-test chore(deps): bump the all-dependencies group across 1 directory with 4 updates (#627) 2026-03-27 00:38:30 +00:00
kotlin-sdk Kotlin-MCP can't be used without ktor-bom starting from 0.7.5 (#390) (#392) 2025-11-12 15:32:54 +02:00
kotlin-sdk-client refactor(core): Fix Kotlin language and api version to 2.1 in build config (#620) 2026-03-26 17:36:01 +02:00
kotlin-sdk-core docs: add missing KDoc comments for public functions, properties, and classes (#621) 2026-03-26 18:25:13 +02:00
kotlin-sdk-server docs: add missing KDoc comments for public functions, properties, and classes (#621) 2026-03-26 18:25:13 +02:00
kotlin-sdk-testing feat: Add kotlin-sdk-testing module with channel-based transport implementation (#505) 2026-02-16 14:10:56 +02:00
samples chore(deps): bump the other-dependencies group across 4 directories with 4 updates (#634) 2026-03-27 00:58:15 +00:00
test-utils refactor(integration-test): modernize ts tests, update versions, rename SSE -> HTTP (#618) 2026-03-26 13:19:10 +01:00
.editorconfig Detekt configuration (#501) 2026-02-04 17:02:58 +02:00
.gitignore feat: add mcp documentation skill for spec-aware development (#609) 2026-03-18 17:53:26 +01:00
AGENTS.md docs: update AGENTS.md (#612) 2026-03-20 15:01:58 +01:00
build.gradle.kts feat!: add mcp conformance test infra (#585); add SSE reconnection with retry support (#596) (#585) 2026-03-12 15:44:59 +02:00
CLAUDE.md docs: update AGENTS.md (#612) 2026-03-20 15:01:58 +01:00
CODE_OF_CONDUCT.md Update license 2024-12-16 21:20:35 +01:00
codecov.yml ci: add Codecov coverage upload and XML report generation (#579) 2026-03-02 16:19:53 +02:00
context7.json docs: context7 config file (#605) 2026-03-18 00:34:50 +01:00
CONTRIBUTING.md Update package name across the project (#2) 2024-12-17 07:28:51 +01:00
gradle.properties chore: bump project version to 0.10.0 in gradle.properties (#623) 2026-03-26 21:00:09 +02:00
gradlew chore(deps): bump gradle-wrapper from 9.3.1 to 9.4.1 (#614) 2026-03-23 13:18:41 +02:00
gradlew.bat Update Gradle to version 9.2.0 across all projects (#377) 2025-11-07 17:07:20 +02:00
knit.properties docs: Update readme, enable Knit (#162) (#510) 2026-02-06 18:40:31 +02:00
LICENSE chore: update licensing to Apache 2.0 for new contributions (#481) 2026-01-13 14:21:52 +02:00
README.md docs: context7 config file (#605) 2026-03-18 00:34:50 +01:00
SECURITY.md Update SECURITY.md to use GitHub Security Advisories (#536) 2026-02-18 23:03:42 +02:00
settings.gradle.kts feat: Add kotlin-sdk-testing module with channel-based transport implementation (#505) 2026-02-16 14:10:56 +02:00

MCP Kotlin SDK

Maven Central Build

Kotlin Kotlin Multiplatform JVM License

Kotlin Multiplatform SDK for the Model Context Protocol. It enables Kotlin applications targeting JVM, Native, JS, and Wasm to implement MCP clients and servers using a standardized protocol interface.

Table of Contents

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 Kotlin SDK implements the MCP specification, making it easy to:

  • Build MCP clients that can connect to any MCP server
  • Create MCP servers that expose resources, prompts, and tools
  • Target JVM, Native, JS, and Wasm from a single codebase
  • Use standard transports like stdio, SSE, Streamable HTTP, and WebSocket
  • Handle MCP protocol messages and lifecycle events with coroutine-friendly APIs

Installation

Artifacts

  • io.modelcontextprotocol:kotlin-sdk – umbrella SDK (client + server APIs)
  • io.modelcontextprotocol:kotlin-sdk-client – client-only APIs
  • io.modelcontextprotocol:kotlin-sdk-server – server-only APIs

Gradle setup (JVM)

Add the Maven Central repository and the SDK dependency:

repositories {
    mavenCentral()
}

dependencies {
    // See the badge above for the latest version
    implementation("io.modelcontextprotocol:kotlin-sdk:$mcpVersion")
}

Use kotlin-sdk-client or kotlin-sdk-server if you only need one side of the API:

dependencies {
    implementation("io.modelcontextprotocol:kotlin-sdk-client:$mcpVersion")
    implementation("io.modelcontextprotocol:kotlin-sdk-server:$mcpVersion")
}

Multiplatform

In a Kotlin Multiplatform project you can add the SDK to commonMain:

commonMain {
    dependencies {
        // Works as a common dependency as well as the platform one
        implementation("io.modelcontextprotocol:kotlin-sdk:$mcpVersion")
    }
}

Ktor dependencies

The Kotlin MCP SDK uses Ktor, but it does not add Ktor engine dependencies transitively. You need to declare Ktor client/server dependencies yourself (or reuse the ones already used in your project), for example:

dependencies {
    // MCP client with Ktor
    implementation("io.ktor:ktor-client-cio:$ktorVersion")
    implementation("io.modelcontextprotocol:kotlin-sdk-client:$mcpVersion")

    // MCP server with Ktor
    implementation("io.ktor:ktor-server-netty:$ktorVersion")
    implementation("io.modelcontextprotocol:kotlin-sdk-server:$mcpVersion")
}

Quickstart

Let's create a simple MCP client and server to demonstrate the basic usage of the Kotlin SDK.

Creating a Client

Create an MCP client that connects to a server via Streamable HTTP transport and lists available tools:

import io.ktor.client.HttpClient
import io.ktor.client.plugins.sse.SSE
import io.modelcontextprotocol.kotlin.sdk.client.Client
import io.modelcontextprotocol.kotlin.sdk.client.StreamableHttpClientTransport
import io.modelcontextprotocol.kotlin.sdk.types.Implementation
import kotlinx.coroutines.runBlocking

fun main(args: Array<String>) = runBlocking {
    val url = args.firstOrNull() ?: "http://localhost:3000/mcp"

    val httpClient = HttpClient { install(SSE) }

    val client = Client(
        clientInfo = Implementation(
            name = "example-client",
            version = "1.0.0"
        )
    )

    val transport = StreamableHttpClientTransport(
        client = httpClient,
        url = url
    )

    // Connect to server
    client.connect(transport)

    // List available tools
    val tools = client.listTools().tools

    println(tools)
}

Creating a Server

Create an MCP server that exposes a simple tool and runs on an embedded Ktor server with Streamable HTTP transport. For a full working project with all required dependencies, see the simple-streamable-server sample.

import io.ktor.serialization.kotlinx.json.json
import io.ktor.server.application.install
import io.ktor.server.cio.CIO
import io.ktor.server.engine.embeddedServer
import io.ktor.server.plugins.contentnegotiation.ContentNegotiation
import io.modelcontextprotocol.kotlin.sdk.server.Server
import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions
import io.modelcontextprotocol.kotlin.sdk.server.mcpStreamableHttp
import io.modelcontextprotocol.kotlin.sdk.types.CallToolResult
import io.modelcontextprotocol.kotlin.sdk.types.Implementation
import io.modelcontextprotocol.kotlin.sdk.types.McpJson
import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities
import io.modelcontextprotocol.kotlin.sdk.types.TextContent
import io.modelcontextprotocol.kotlin.sdk.types.ToolSchema
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.put


fun main(args: Array<String>) {
    val port = args.firstOrNull()?.toIntOrNull() ?: 3000
    val mcpServer = Server(
        serverInfo = Implementation(
            name = "example-server",
            version = "1.0.0"
        ),
        options = ServerOptions(
            capabilities = ServerCapabilities(
                tools = ServerCapabilities.Tools(listChanged = true),
            ),
        )
    )

    mcpServer.addTool(
        name = "example-tool",
        description = "An example tool",
        inputSchema = ToolSchema(
            properties = buildJsonObject {
                put("input", buildJsonObject { put("type", "string") })
            }
        )
    ) { request ->
        CallToolResult(content = listOf(TextContent("Hello, world!")))
    }

    embeddedServer(CIO, host = "127.0.0.1", port = port) {
        install(ContentNegotiation) {
            json(McpJson)
        }
        mcpStreamableHttp {
            mcpServer
        }
    }.start(wait = true)
}

You can run the server and then connect to it using the client or test with the MCP Inspector:

npx -y @modelcontextprotocol/inspector

In the inspector UI, connect to http://localhost:3000/mcp.

Core Concepts

MCP Primitives

The MCP protocol defines core primitives that enable communication between servers and clients:

Primitive Server Role Client Role Description
Prompts Provides prompt templates with optional arguments Requests and uses prompts Interactive templates for LLM interactions
Resources Exposes data sources (files, API responses, etc.) Reads and subscribes to resources Contextual data for augmenting LLM context
Tools Defines executable functions Calls tools to perform actions Functions the LLM can invoke to take actions
Sampling Requests LLM completions from client Executes LLM calls and returns results Server-initiated LLM requests (reverse direction)

Capabilities

Capabilities define what features a server or client supports. They are declared during initialization and determine what operations are available.

Server Capabilities

Servers declare their capabilities to inform clients what features they provide:

Capability Feature Flags Description
prompts listChanged Prompt template management and notifications
resources subscribe
listChanged
Resource exposure, subscriptions, and update notifications
tools listChanged Tool discovery, execution, and list change notifications
logging - Server logging to client console
completions - Argument autocompletion suggestions
experimental Custom properties Non-standard experimental features

Client Capabilities

Clients declare their capabilities to inform servers what features they support:

Capability Feature Flags Description
sampling - Client can sample from an LLM (execute model requests)
roots listChanged Client exposes root directories and can notify of changes
elicitation - Client can display schema/form dialogs for structured input
experimental Custom properties Non-standard experimental features

Server Features

The Server API lets you wire prompts, resources, and tools with only a few lines of Kotlin. Each feature is registered up front and then resolved lazily when a client asks for it, so your handlers stay small and suspendable.

Prompts

Prompts are user-controlled templates that clients discover via prompts/list and fetch with prompts/get when a user chooses one (think slash commands or saved flows). They’re best for repeatable, structured starters rather than ad-hoc model calls.

val server = Server(
    serverInfo = Implementation(
        name = "example-server",
        version = "1.0.0"
    ),
    options = ServerOptions(
        capabilities = ServerCapabilities(
            prompts = ServerCapabilities.Prompts(listChanged = true),
        ),
    )
)

server.addPrompt(
    name = "code-review",
    description = "Ask the model to review a diff",
    arguments = listOf(
        PromptArgument(name = "diff", description = "Unified diff", required = true),
    ),
) { request ->
    GetPromptResult(
        description = "Quick code review helper",
        messages = listOf(
            PromptMessage(
                role = Role.User,
                content = TextContent(text = "Review this change:\n${request.arguments?.get("diff")}"),
            ),
        ),
    )
}

Use prompts for anything that deserves a template: bug triage questions, onboarding checklists, or saved searches. Set listChanged = true only if your prompt catalog can change at runtime and your server will emit notifications/prompts/list_changed when it does.

Resources

Resources are application-driven context that clients discover via resources/list or resources/templates/list, then fetch with resources/read. Register each one with a stable URI and return a ReadResourceResult when asked—contents can be text or binary blobs.

val server = Server(
    serverInfo = Implementation(
        name = "example-server",
        version = "1.0.0"
    ),
    options = ServerOptions(
        capabilities = ServerCapabilities(
            resources = ServerCapabilities.Resources(subscribe = true, listChanged = true),
        ),
    )
)

server.addResource(
    uri = "note://release/latest",
    name = "Release notes",
    description = "Last deployment summary",
    mimeType = "text/markdown",
) { request ->
    ReadResourceResult(
        contents = listOf(
            TextResourceContents(
                text = "Ship 42 reached production successfully.",
                uri = request.uri,
                mimeType = "text/markdown",
            ),
        ),
    )
}

Resources can be static text, generated JSON, or blobs—anything the client can surface to the user or inject into the model context. Set subscribe = true if you emit notifications/resources/updated for changes to specific URIs, and listChanged = true if you’ll send notifications/resources/list_changed when the catalog itself changes.

Tools

Tools are model-controlled capabilities the client exposes to the model. Clients discover them via tools/list, invoke them with tools/call, and your handlers receive JSON arguments, can emit streaming logs or progress, and return a CallToolResult. Keep a human in the loop for sensitive operations.

val server = Server(
    serverInfo = Implementation(
        name = "example-server",
        version = "1.0.0"
    ),
    options = ServerOptions(
        capabilities = ServerCapabilities(
            tools = ServerCapabilities.Tools(listChanged = true),
        ),
    )
)

server.addTool(
    name = "echo",
    description = "Return whatever the user sent back to them",
) { request ->
    val text = request.arguments?.get("text")?.jsonPrimitive?.content ?: "(empty)"
    CallToolResult(content = listOf(TextContent(text = "Echo: $text")))
}

Register as many tools as you need—long-running jobs can report progress via the request context, and tools can also trigger sampling (see below) when they need the client’s LLM. Set listChanged = true only if your tool catalog can change at runtime and your server will emit notifications/tools/list_changed when it does.

Completion

Completion provides argument suggestions for prompts or resource templates. Declare the completions capability and handle completion/complete requests to return up to 100 ranked values (include total/hasMore if you paginate).

val server = Server(
    serverInfo = Implementation(
        name = "example-server",
        version = "1.0.0"
    ),
    options = ServerOptions(
        capabilities = ServerCapabilities(
            completions = ServerCapabilities.Completions,
        ),
    )
)

val session = server.createSession(
    StdioServerTransport(
        inputStream = System.`in`.asSource().buffered(),
        outputStream = System.out.asSink().buffered()
    )
)

session.setRequestHandler<CompleteRequest>(Method.Defined.CompletionComplete) { request, _ ->
    val options = listOf("kotlin", "compose", "coroutine")
    val matches = options.filter { it.startsWith(request.argument.value.lowercase()) }

    CompleteResult(
        completion = CompleteResult.Completion(
            values = matches.take(3),
            total = matches.size,
            hasMore = matches.size > 3,
        ),
    )
}

Use context.arguments to refine suggestions for dependent fields (e.g., framework list filtered by chosen language).

Logging

Logging lets the server stream structured log notifications to the client using RFC 5424 levels (debug → emergency). Declare the logging capability; clients can raise the minimum level with logging/setLevel, and the server emits notifications/message with severity, optional logger name, and JSON data.

val server = Server(
    serverInfo = Implementation("example-server", "1.0.0"),
    options = ServerOptions(
        capabilities = ServerCapabilities(
            logging = ServerCapabilities.Logging,
        ),
    )
)

val session = server.createSession(
    StdioServerTransport(
        inputStream = System.`in`.asSource().buffered(),
        outputStream = System.out.asSink().buffered()
    )
)

session.sendLoggingMessage(
    LoggingMessageNotification(
        LoggingMessageNotificationParams(
            level = LoggingLevel.Info,
            logger = "startup",
            data = buildJsonObject { put("message", "Server started") },
        ),
    ),
)

Keep logs free of sensitive data, and expect clients to surface them in their own UI.

Pagination

List operations return paginated results with an opaque nextCursor, clients echo that cursor to fetch the next page. Supported list calls: resources/list, resources/templates/list, prompts/list, and tools/list. Treat cursors as opaque—don’t parse or persist them across sessions.

val server = Server(
    serverInfo = Implementation("example-server", "1.0.0"),
    options = ServerOptions(
        capabilities = ServerCapabilities(
            resources = ServerCapabilities.Resources(),
        ),
    )
)

val session = server.createSession(
    StdioServerTransport(
        inputStream = System.`in`.asSource().buffered(),
        outputStream = System.out.asSink().buffered()
    )
)

val resources = listOf(
    Resource(uri = "note://1", name = "Note 1", description = "First"),
    Resource(uri = "note://2", name = "Note 2", description = "Second"),
    Resource(uri = "note://3", name = "Note 3", description = "Third"),
)
val pageSize = 2

session.setRequestHandler<ListResourcesRequest>(Method.Defined.ResourcesList) { request, _ ->
    val start = request.params?.cursor?.toIntOrNull() ?: 0
    val page = resources.drop(start).take(pageSize)
    val next = if (start + page.size < resources.size) (start + page.size).toString() else null

    ListResourcesResult(
        resources = page,
        nextCursor = next,
    )
}

Include nextCursor only when more items remain an absent cursor ends pagination.

Client Features

Clients advertise their capabilities (roots, sampling, elicitation, etc.) during initialization. After that they can serve requests from the server while still initiating calls such as listTools or callTool.

Roots

Roots let the client declare where the server is allowed to operate. Declare the roots capability, respond to roots/list, and emit notifications/roots/list_changed if you set listChanged = true. URIs must be file:// paths.

val client = Client(
    clientInfo = Implementation("demo-client", "1.0.0"),
    options = ClientOptions(
        capabilities = ClientCapabilities(roots = ClientCapabilities.Roots(listChanged = true)),
    ),
)

client.addRoot(
    uri = "file:///Users/demo/projects",
    name = "Projects",
)
client.sendRootsListChanged()

Call addRoot/removeRoot whenever your file system view changes, and use sendRootsListChanged() to notify the server. Keep root lists user-controlled and revoke entries that are no longer authorized.

Sampling

Sampling lets the server ask the client to call its preferred LLM. Declare the sampling capability (and sampling.tools if you allow tool-enabled sampling), and handle sampling/createMessage. Keep a human in the loop for approvals.

val client = Client(
    clientInfo = Implementation("demo-client", "1.0.0"),
    options = ClientOptions(
        capabilities = ClientCapabilities(
            sampling = buildJsonObject { putJsonObject("tools") { } }, // drop tools if you don't support tool use
        ),
    ),
)

client.setRequestHandler<CreateMessageRequest>(Method.Defined.SamplingCreateMessage) { request, _ ->
    val content = request.messages.lastOrNull()?.content
    val prompt = if (content is TextContent) content.text else "your topic"
    CreateMessageResult(
        model = "gpt-4o-mini",
        role = Role.Assistant,
        content = TextContent(text = "Here is a short note about $prompt"),
    )
}

Inside the handler you can pick any model/provider, require approvals, or reject the request. If you don’t support tool use, omit sampling.tools from capabilities.

Transports

All transports share the same API surface, so you can change deployment style without touching business logic. Pick the transport that best matches where the server runs.

STDIO Transport

StdioClientTransport and StdioServerTransport tunnel MCP messages over stdin/stdout—perfect for editor plugins or CLI tooling that spawns a helper process. No networking setup is required.

Streamable HTTP Transport

StreamableHttpClientTransport and the Ktor mcpStreamableHttp() / mcpStatelessStreamableHttp() helpers expose MCP over a single HTTP endpoint with optional JSON-only or SSE streaming responses. This is the recommended choice for remote deployments and integrates nicely with proxies or service meshes. Both accept a path parameter (default: "/mcp") to mount the endpoint at any URL:

embeddedServer(CIO, port = 3000) {
    mcpStreamableHttp(path = "/api/mcp") {
        MyServer()
    }
}.start(wait = true)

SSE Transport

Server-Sent Events remain available for backwards compatibility with older MCP clients. Two Ktor helpers are provided:

  • Application.mcp { } — installs the SSE plugin automatically and registers MCP endpoints at /.
  • Route.mcp { } — registers MCP endpoints at the current route path; requires install(SSE) in the application first. Use this to host MCP alongside other routes or under a path prefix:
embeddedServer(CIO, port = 3000) {
    install(SSE)
    routing {
        route("/api/mcp") {
            mcp { MyServer() }
        }
    }
}.start(wait = true)

Prefer Streamable HTTP for new projects.

WebSocket Transport

WebSocketClientTransport plus the matching server utilities provide full-duplex, low-latency connections—useful when you expect lots of notifications or long-running sessions behind a reverse proxy that already terminates WebSockets.

ChannelTransport (testing)

ChannelTransport provides a simple, non-networked transport for testing and local development. It uses Kotlin coroutines channels to provide a full-duplex connection between a client and server, allowing for easy testing of MCP functionality without the need for network setup.

Connecting your server

  1. Start a sample HTTP server on port 3000:

    ./gradlew :samples:kotlin-mcp-server:run
    
  2. Connect with the MCP Inspector or Claude Desktop/Code:

    npx -y @modelcontextprotocol/inspector --connect http://localhost:3000
    # or
    claude mcp add --transport http kotlin-mcp http://localhost:3000
    
  3. In the Inspector, confirm prompts, tools, resources, completions, and logs show up. Iterate locally until you’re ready to host the server wherever you prefer.

Examples

The samples directory contains runnable projects demonstrating MCP server and client implementations with various transports. See the samples overview for a comparison table and detailed descriptions.

Documentation

Ask DeepWiki

Contributing

Please see the contribution guide and the Code of conduct before contributing.

License

This project is licensed under Apache 2.0 for new contributions, with existing code under MIT—see the LICENSE file for details.