kotlin-sdk/samples/kotlin-mcp-client
Repository files (latest commit first)
Filename Latest commit message Latest commit date
dependabot[bot] be06a71053
chore(deps): bump org.jetbrains.kotlin.jvm from 2.4.10 to 2.4.20 in /samples/kotlin-mcp-client (#989)
Bumps [org.jetbrains.kotlin.jvm](https://github.com/JetBrains/kotlin)
from 2.4.10 to 2.4.20.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/JetBrains/kotlin/releases">org.jetbrains.kotlin.jvm's
releases</a>.</em></p>
<blockquote>
<h2>Kotlin 2.4.20</h2>
<h2>Changelog</h2>
<h3>Analysis API</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-86546"><code>KT-86546</code></a>
Check suspicious when over ConeKotlinType in
ConeTypeCompatibilityChecker</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85418"><code>KT-85418</code></a>
Implement an API for accessing deserialized file annotations in Analysis
API</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-74448"><code>KT-74448</code></a>
K2. False positive MISSING_DEPENDENCY_SUPERCLASS in LinkedListTest.kt,
kotlinx.coroutines</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85856"><code>KT-85856</code></a>
containingSymbol of constructor property differs for local and non-local
classes</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-65417"><code>KT-65417</code></a>
K2 IDE: KTOR false positive expect-actual matching error on enum class
because of implicit clone() in non-JVM source sets</li>
</ul>
<h3>Analysis API. Code Compilation</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-76457"><code>KT-76457</code></a>
K2 IDE / KMP Debugger: KISEWA “Cannot compile a common source without a
JVM counterpart” on evaluating inline fun from common module inside
jvm</li>
</ul>
<h3>Analysis API. FIR</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-70552"><code>KT-70552</code></a>
No expects for actual</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-69727"><code>KT-69727</code></a>
K2 IDE. Wrong error in the editor on calling <code>clone</code> function
of actual enum instance in non-jvm platform</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-69726"><code>KT-69726</code></a>
FP errors on declaring <code>fun clone()</code> in actual enum in
not-jvm source-set</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-86014"><code>KT-86014</code></a>
Types are broken after remove parameter through change signature</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-86363"><code>KT-86363</code></a>
KotlinIllegalArgumentExceptionWithAttachments: No dangling modifier
found on companion blocks</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-86147"><code>KT-86147</code></a>
Drop <code>kotlin.parallel.resolve.under.global.lock</code> registry
key</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85543"><code>KT-85543</code></a>
Avoid lazy resolve for the contracts phase if no constracts might be
resolved</li>
</ul>
<h3>Analysis API. Infrastructure</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-84914"><code>KT-84914</code></a>
Do not publish analysis-api-test-framework</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-86986"><code>KT-86986</code></a>
<code>kotlin-compiler-common-for-ide</code> bundles unrelated Analysis
API modules</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-86186"><code>KT-86186</code></a>
Analysis API: Codebase tests run twice in some analysis modules — pick a
single JUnit runner and migrate</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85360"><code>KT-85360</code></a>
Drop kotlin-compiler-testdata-for-ide artifact</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85585"><code>KT-85585</code></a>
Simplify the dependencies graph for the Analysis API modules</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85381"><code>KT-85381</code></a>
Remove tests for the FE10 implementation</li>
</ul>
<h3>Analysis API. Light Classes</h3>
<h4>New Features</h4>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-84645"><code>KT-84645</code></a>
Support resolving to companion block members &amp; extensions from Java
(light classes)</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-80775"><code>KT-80775</code></a>
Support PsiClass#getRecordComponents in light classes</li>
</ul>
<h4>Fixes</h4>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-57537"><code>KT-57537</code></a>
SLC: propagate default parameter value from (<code>@JvmOverloads</code>)
<code>expect</code> declarations to <code>actual</code>
declarations</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85040"><code>KT-85040</code></a>
[Analysis API] Improve Java / Kotlin interop in KMP projects</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-87301"><code>KT-87301</code></a>
SymbolLightAccessorMethod#isValid returns false for delegated
properties</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-87171"><code>KT-87171</code></a>
SLC: non-mapped Kotlin collection supertype is dropped from supertype
list</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-87250"><code>KT-87250</code></a>
JvmExposeBoxed: light classes shouldn't be autogenerated for private
declarations</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-70428"><code>KT-70428</code></a>
AA: good code is red when a Java class extends a Kotlin class
implementing MutableList by delegation</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-63568"><code>KT-63568</code></a>
Symbol Light Classes:
KtAnnotationApplicationWithArgumentsInfo.normalizedArguments() may work
incorrectly when psi is not set</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md">org.jetbrains.kotlin.jvm's
changelog</a>.</em></p>
<blockquote>
<h2>2.4.20</h2>
<h3>Analysis API</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-86546"><code>KT-86546</code></a>
Check suspicious when over ConeKotlinType in
ConeTypeCompatibilityChecker</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85418"><code>KT-85418</code></a>
Implement an API for accessing deserialized file annotations in Analysis
API</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-74448"><code>KT-74448</code></a>
K2. False positive MISSING_DEPENDENCY_SUPERCLASS in LinkedListTest.kt,
kotlinx.coroutines</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85856"><code>KT-85856</code></a>
containingSymbol of constructor property differs for local and non-local
classes</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-65417"><code>KT-65417</code></a>
K2 IDE: KTOR false positive expect-actual matching error on enum class
because of implicit clone() in non-JVM source sets</li>
</ul>
<h3>Analysis API. Code Compilation</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-76457"><code>KT-76457</code></a>
K2 IDE / KMP Debugger: KISEWA “Cannot compile a common source without a
JVM counterpart” on evaluating inline fun from common module inside
jvm</li>
</ul>
<h3>Analysis API. FIR</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-70552"><code>KT-70552</code></a>
No expects for actual</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-69727"><code>KT-69727</code></a>
K2 IDE. Wrong error in the editor on calling <code>clone</code> function
of actual enum instance in non-jvm platform</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-69726"><code>KT-69726</code></a>
FP errors on declaring <code>fun clone()</code> in actual enum in
not-jvm source-set</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-86014"><code>KT-86014</code></a>
Types are broken after remove parameter through change signature</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-86363"><code>KT-86363</code></a>
KotlinIllegalArgumentExceptionWithAttachments: No dangling modifier
found on companion blocks</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-86147"><code>KT-86147</code></a>
Drop <code>kotlin.parallel.resolve.under.global.lock</code> registry
key</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85543"><code>KT-85543</code></a>
Avoid lazy resolve for the contracts phase if no constracts might be
resolved</li>
</ul>
<h3>Analysis API. Infrastructure</h3>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-84914"><code>KT-84914</code></a>
Do not publish analysis-api-test-framework</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-86986"><code>KT-86986</code></a>
<code>kotlin-compiler-common-for-ide</code> bundles unrelated Analysis
API modules</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-86186"><code>KT-86186</code></a>
Analysis API: Codebase tests run twice in some analysis modules — pick a
single JUnit runner and migrate</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85360"><code>KT-85360</code></a>
Drop kotlin-compiler-testdata-for-ide artifact</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85585"><code>KT-85585</code></a>
Simplify the dependencies graph for the Analysis API modules</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85381"><code>KT-85381</code></a>
Remove tests for the FE10 implementation</li>
</ul>
<h3>Analysis API. Light Classes</h3>
<h4>New Features</h4>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-84645"><code>KT-84645</code></a>
Support resolving to companion block members &amp; extensions from Java
(light classes)</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-80775"><code>KT-80775</code></a>
Support PsiClass#getRecordComponents in light classes</li>
</ul>
<h4>Fixes</h4>
<ul>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-57537"><code>KT-57537</code></a>
SLC: propagate default parameter value from (<code>@JvmOverloads</code>)
<code>expect</code> declarations to <code>actual</code>
declarations</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-85040"><code>KT-85040</code></a>
[Analysis API] Improve Java / Kotlin interop in KMP projects</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-87301"><code>KT-87301</code></a>
SymbolLightAccessorMethod#isValid returns false for delegated
properties</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-87171"><code>KT-87171</code></a>
SLC: non-mapped Kotlin collection supertype is dropped from supertype
list</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-87250"><code>KT-87250</code></a>
JvmExposeBoxed: light classes shouldn't be autogenerated for private
declarations</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-70428"><code>KT-70428</code></a>
AA: good code is red when a Java class extends a Kotlin class
implementing MutableList by delegation</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-63568"><code>KT-63568</code></a>
Symbol Light Classes:
KtAnnotationApplicationWithArgumentsInfo.normalizedArguments() may work
incorrectly when psi is not set</li>
<li><a
href="https://youtrack.jetbrains.com/issue/KT-36740"><code>KT-36740</code></a>
MPP: False-positive incompatible types in .java when using expect-class
returned by non-expect member from common when actual is actual
typealias</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="890ac1d94f"><code>890ac1d</code></a>
Add Changelog for 2.4.20-RC3</li>
<li><a
href="8860aed4ae"><code>8860aed</code></a>
🍒 [FIR] Fix suspend conversion when expected type is nullable (<a
href="https://redirect.github.com/JetBrains/kotlin/issues/7769">#7769</a>)</li>
<li><a
href="ab5bcd9428"><code>ab5bcd9</code></a>
Edit ChangeLog for 2.4.20-RC2</li>
<li><a
href="9464edc097"><code>9464edc</code></a>
Add ChangeLog for 2.4.20-RC2</li>
<li><a
href="0261e43b78"><code>0261e43</code></a>
Cherry-pick &quot;Fix <code>asBodyAndResultVar</code> call in
`visitInlinedLambdaInComposable...</li>
<li><a
href="0763513670"><code>0763513</code></a>
[box-tests] Workaround for klib compatibility tests (<a
href="https://redirect.github.com/JetBrains/kotlin/issues/7626">#7626</a>)</li>
<li><a
href="045aec6647"><code>045aec6</code></a>
[Wasm] Append scripts from webpack.config.d in the end of the file (<a
href="https://redirect.github.com/JetBrains/kotlin/issues/7615">#7615</a>)</li>
<li><a
href="cd7173bf0b"><code>cd7173b</code></a>
🍒 [2.4.20] [K/JS] Keep associated obj annotation only if getInstance
survives...</li>
<li><a
href="d36a2ffbcc"><code>d36a2ff</code></a>
CastsOptimizationPass: break aliases cycles (<a
href="https://redirect.github.com/JetBrains/kotlin/issues/7578">#7578</a>)</li>
<li><a
href="8664983b34"><code>8664983</code></a>
[CLI] Restore custom IC search scope creation</li>
<li>Additional commits viewable in <a
href="https://github.com/JetBrains/kotlin/compare/v2.4.10...v2.4.20">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=org.jetbrains.kotlin.jvm&package-manager=gradle&previous-version=2.4.10&new-version=2.4.20)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

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 this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-15 15:44:06 +02:00
..
gradle chore(deps): bump org.jetbrains.kotlin.jvm from 2.4.10 to 2.4.20 in /samples/kotlin-mcp-client (#989) 2026-09-15 15:44:06 +02:00
src/main docs: update client and server samples (#598) 2026-03-13 10:23:51 +01:00
build.gradle.kts Add Ktor BOM for dependency management across all modules, run Kotlin-MCP-Server Sample (#367) 2025-11-04 11:44:39 +02:00
gradle.properties #302 Update samples build workflow (#330) 2025-10-23 13:02:22 +03:00
gradlew chore(deps): bump the other-dependencies group across 5 directories with 3 updates (#854) 2026-06-24 15:31:46 +02:00
gradlew.bat chore(deps): bump the other-dependencies group across 5 directories with 3 updates (#854) 2026-06-24 15:31:46 +02:00
README.md docs: streamable server sample (#595) 2026-03-10 12:45:21 +01:00
settings.gradle.kts #302 Update samples build workflow (#330) 2025-10-23 13:02:22 +03:00

Kotlin MCP Client

An interactive CLI client that connects to any MCP server over STDIO and pipes queries through Anthropic's Claude API.

Overview

This sample demonstrates a complete MCP client workflow: launching an MCP server as a subprocess, discovering its tools, converting them to Anthropic's tool format, and running an interactive chat loop where Claude can call server tools on behalf of the user.

Prerequisites

  • JDK 17+
  • An ANTHROPIC_API_KEY environment variable set with a valid Anthropic API key
  • An MCP server script to connect to (.js, .py, or .jar)

Build & Run

Run the client, passing the path to an MCP server:

# Connect to a JVM server
./gradlew run --args="path/to/server.jar"

# Connect to a Python server
./gradlew run --args="path/to/server.py"

# Connect to a Node.js server
./gradlew run --args="path/to/build/index.js"

Note

The client uses STDIO transport, so it launches the MCP server as a subprocess. Ensure the server script is executable and is a valid .js, .py, or .jar file.

MCP Capabilities

From the client perspective, this sample demonstrates:

  • Tool discovery — lists tools from the connected server and converts them to Anthropic's tool format.
  • Tool invocation — when Claude's response requests a tool call, the client invokes the corresponding MCP tool and feeds the result back into the conversation.

Additional Resources