Kotlin & Java Library Sources

io.github.aoreshkov由 GitHub 账号 aoreshkov 发布v0.10.1更新于 Oct 29, 2026

Kotlin/Java library sources, public API and KDoc from the real Maven sources jar, for AI agents

已验证STDIO仅桌面知识与记忆开发者工具

概览

AI 生成的概览

下载 Kotlin/Java 库的 Maven 源码包,并向 AI 助手提供解析后的 API 签名、KDoc、源码与版本差异。

可以做什么
  • 从 Maven 仓库抓取并缓存库的源码包,解析版本号并列出已发布版本
  • 浏览包与声明,获取解析后的 API 签名、弃用说明与 KDoc
  • 读取原始源码文件或单个声明,并在其中执行有界的子串或正则搜索
  • 对比两个已抓取版本,生成源码统一差异或公共 API 变更报告
  • 从 pom 与 Gradle 模块元数据查看依赖树
适用场景
适合需要依据真实发布源码而非渲染文档来回答 Kotlin 或 Java 库问题的场景:核对真实签名、阅读 KDoc、在源码中查找用法,或通过 API 差异规划版本升级。
运行要求
以 stdio 在本地运行,可用 Docker 镜像,或用需要 Java 25 及以上运行时的发布压缩包或 Claude Code 插件。首次抓取每个坐标需要访问 Maven Central 及额外配置的仓库,结果缓存在本地磁盘。无需账号、API 密钥或认证。
安装前请注意
对外请求只发往你配置的 Maven 仓库,这些仓库会看到坐标和你的 IP。可选的 HTTP 传输没有内置认证,默认仅绑定回环地址;若要对外提供需在前面加认证反向代理。可选遥测会把追踪数据发送到你配置的收集器。恢复的任务 ID 可充当持有者令牌。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Kotlin & Java Library Sources,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

kotlin-lib-mcp

[CI] [CodeQL] [Release] [License] [Kotlin] [GitHub MCP Registry]

Give your AI agent the real sources of any Maven-published Kotlin/Java library.

An MCP server that, on request, downloads the sources of a library (e.g. io.ktor:ktor-client-core:3.5.1), parses them with the Kotlin Analysis API (standalone K2/FIR mode), and exposes structured information — public API surface, KDoc, dependencies/metadata, raw source + search — to MCP clients: Claude Code, Claude Desktop, IntelliJ IDEA (AI Assistant / Junie), VS Code and GitHub Copilot. An optional Compose Desktop dashboard runs the same server in-process.

Twelve tools — fetch_library · list_packages · list_declarations · get_api_signature · get_kdoc · get_source · search_source · diff_versions · diff_api · get_dependencies · list_versions · get_latest_version — plus MCP resources and a prompt.

[Install in VS Code] [Install in VS Code Insiders]

Those install the Docker image. For the Claude Code plugin (which runs on your JDK), IntelliJ IDEA, or to run the release zip without Docker, see Quick start.

[Claude Code fetching a library and reading KDoc via kotlin-lib-mcp]

Compose Desktop dashboard

[The dashboard: in-process MCP server, pre-warm form, cache browser and live logs]

Why this and not a docs-lookup server?

Most documentation MCP servers scrape rendered doc sites or feed the model pre-digested summaries. This one works from the published sources jar — the ground truth:

  • Resolved signatures, not regex guesses. Declarations are analyzed with the same Analysis API that powers the Kotlin IDE, so get_api_signature returns real, type-resolved signatures (with graceful best-effort fallback when transitive dependencies are missing).
  • KMP-aware. Kotlin Multiplatform libraries publish per-target sources jars; these are resolved properly via .module Gradle metadata, and every symbol is tagged with its targets.
  • KDoc as data. Summaries, descriptions and tags are extracted per declaration — not whole HTML pages.
  • Exact version you asked for, offline after the first fetch. Everything is cached on disk keyed by group/artifact/version; no re-downloads, no drift between the docs and the version you actually depend on.
  • Raw source when you need it. get_source and bounded search_source let the agent read the actual implementation, not just the API.

Quick start (no build required)

Option 1 — Claude Code plugin. The server plus skills that make Claude reach for it, two commands (/kotlin-lib:api, /kotlin-lib:migrate) and a setup helper. Needs a JDK 25+ — the one on your PATH, or any other set by path in the plugin's java option; no Docker. It downloads the release zip on first use:

/plugin marketplace add aoreshkov/kotlin-lib-mcp/plugin install kotlin-lib@kotlin-lib-mcp

See plugin/README.md for what it bundles.

Option 2 — release zip. Download the latest release, unzip (needs a Java 25+ runtime), then:

sh
claude mcp add kotlin-lib -- /path/to/kotlin-lib-mcp-server-<version>/bin/server --transport stdio

Option 3 — Docker.

sh
claude mcp add kotlin-lib -- docker run -i --rm -v kotlin-lib-mcp-cache:/home/mcp/.cache ghcr.io/aoreshkov/kotlin-lib-mcp

Option 4 — IntelliJ IDEA / Android Studio. JetBrains IDEs are MCP clients too — which is where most Kotlin gets written. Open Settings | Tools | AI Assistant | Model Context Protocol (MCP), click Add, pick the stdio transport and paste:

json
{  "mcpServers": {    "kotlin-lib": {      "command": "docker",      "args": ["run", "-i", "--rm", "-v", "kotlin-lib-mcp-cache:/home/mcp/.cache", "ghcr.io/aoreshkov/kotlin-lib-mcp"]    }  }}

Choose global or project level, Apply, and the tools appear in the AI Assistant chat. Junie takes the same JSON in its own MCP settings. Swap command/args for the release-zip launcher (bin/server --transport stdio) if you'd rather not use Docker.

Option 5 — MCP Registry. The server is published to the official MCP registry as io.github.aoreshkov/kotlin-lib-mcp, and listed in the GitHub MCP Registry; registry-aware clients can install it from there. The entry declares two optional arguments a client can ask you for when it installs: --repo, for each extra Maven repository (a private one, or https://maven.google.com for AndroidX), and --max-concurrent-fetches.

Or in .mcp.json / Claude Desktop config:

json
{  "mcpServers": {    "kotlin-lib": {      "command": "C:/path/to/kotlin-lib-mcp-server-<version>/bin/server.bat",      "args": ["--transport", "stdio"]    }  }}

Streamable HTTP. Run --transport http --port 3000 and point the client at http://127.0.0.1:3000/mcp. Out of the box it is reachable from this machine only: the server binds to loopback, and DNS-rebinding protection rejects any Host (or Origin) header other than localhost, 127.0.0.1 or [::1]. There is no built-in authentication, so to serve other machines put an authenticating reverse proxy in front, then bind wider with --host (e.g. 0.0.0.0) and name the public host with --allowed-host (plus --allowed-origin for browser clients).

In Docker, loopback is the container's own, which a published port cannot reach. Bind every interface inside the container and publish the port on the host's loopback instead — the endpoint is still http://127.0.0.1:3000/mcp, and still unreachable from other machines:

sh
docker run --rm -p 127.0.0.1:3000:3000 -v kotlin-lib-mcp-cache:/home/mcp/.cache \  ghcr.io/aoreshkov/kotlin-lib-mcp --transport http --host 0.0.0.0 --port 3000

CLI flags — server --help lists them all with their defaults, the OTEL_* variables and examples: --transport stdio|http; --port, --host, --allowed-host and --allowed-origin, which apply to the http transport only, so passing one with stdio is a usage error; --cache-dir; --repo (repeatable, searched after Maven Central) and --no-maven-central (only the --repo repositories, for a mirror that proxies Central); --max-concurrent-fetches; and the opt-ins --forward-logs-to-client (stdio only), --otel (see Telemetry) and --tasks (see Tasks). --version prints the server's version. A command-line mistake exits 2 and an internal error 70 (sysexits.h). SIGTERM or Ctrl-C stops the server cleanly within 5 seconds: task records are saved and buffered traces flushed before the process ends.

Tools

All tools take a Maven coordinate (group:artifact:version). Call fetch_library first — it downloads, extracts and analyzes the sources once; every other tool answers from the cached index. fetch_library, list_versions and get_latest_version also accept group:artifact, and fetch_library accepts group:artifact:latest to resolve the latest stable release.

ToolPurpose
fetch_libraryDownload + analyze + cache; returns a summary. Idempotent. Version may be omitted or latest
list_packagesPackages with declaration counts and KMP targets; paged
list_declarationsDeclarations with signatures and deprecations; filter by package, visibility and deprecated; paged
get_api_signatureResolved signature of one declaration by FQ name, with its deprecation and ReplaceWith
get_kdocKDoc (summary, description, tags) of one declaration
get_sourceRaw source of a file (path) or one declaration (fqName); paged by line
search_sourceSubstring/regex search; bounded, returns file:line snippets
diff_versionsUnified diff between two fetched versions; summary-first, paged, path-filtered
diff_apiPublic-API changes between two fetched versions — added, removed, changed, deprecated (with ReplaceWith); summary-first, paged, package- and change-filtered
get_dependenciesDependency tree from .pom/.module; bounded depth and maxNodes
list_versionsPublished versions from maven-metadata.xml, newest-first; paged
get_latest_versionLatest stable release (and newest overall) from maven-metadata.xml

Every tool ships the metadata the MCP spec encourages clients to use: a display title, behavior annotations (readOnlyHint: true everywhere except fetch_library, which is additive-only — destructiveHint: false, idempotentHint: true; tools that reach Maven repositories set openWorldHint: true, cache-only tools false), a typed outputSchema derived from the response DTO's serializer, and an icon. Results carry both compact JSON text and the matching structuredContent object, so structured-output clients and plain-text clients see the same payload.

fetch_library also reports progress notifications (download → analyze → cache) when the client sends a progressToken. Logs go to stderr by default (which the spec blesses for all stdio logging); the deprecated MCP logging capability — mirroring logs to clients as notifications/message (respecting logging/setLevel) — is opt-in via --forward-logs-to-client, for stdio clients that surface MCP log messages but drop stderr. It is refused with --transport http, where every session would receive every other session's logs.

Elicitation

When fetch_library is called without a version (io.ktor:ktor-client-core, or …:latest) it has to guess. If the client advertised the elicitation capability, it asks instead: an elicitation/create form-mode request carrying a single-select version picker — the titled oneOf shape from SEP-1330, with the latest stable release pre-selected as the schema default.

The userThe server
accepts a versionfetches exactly that one
declinesfetches the latest stable release, as it always did
cancels (dismissed the dialog)downloads nothing and returns a tool error saying to call fetch_library again with an explicit group:artifact:version

There is no flag: capability negotiation is the opt-in. A client that advertises nothing — or advertises url-mode only, which servers must not answer with a form — keeps the previous silent latest-stable behavior exactly. Only public Maven version numbers are ever requested, so form mode is appropriate; URL mode exists for credentials and third-party authorization, and is deliberately unused here. Accepted values are validated against the offered list before they reach a repository URL, and a client that errors mid-question falls back to the default rather than failing the fetch.

Under --tasks, a task-augmented fetch_library parks in the input_required status while the question is outstanding and returns to working once answered; the elicitation/create carries the io.modelcontextprotocol/related-task _meta tying it to the task.

Tasks

Pass --tasks to accept task-augmented tools/call for fetch_library (SEP-1686) and answer tasks/get / tasks/result / tasks/list / tasks/cancel. Works on both transports.

Task records are persisted under <cache-dir>/tasks, so a completed task and its result are still retrievable after the server restarts. A task that was still running when the server stopped comes back as failed — its work did not survive, only the record did. Records are dropped once their TTL elapses (10 minutes by default, 1 hour maximum). Servers sharing a cache directory, such as one per Claude Code session, keep their tasks apart: a server picks up only the records of a server that has stopped, never those of one still running.

Task IDs are bearer tokens for tasks that outlive their session. A task belongs to the MCP session that created it, and while that session is connected no other session can read, list or cancel it. But a session ID is per-connection: after a restart your client reconnects with a new one, so a recovered task is instead reachable by anyone presenting its exact task ID. That is the model the MCP spec prescribes for servers with no authorization context — which this one is, being loopback-first with no auth — and task IDs are 122-bit SecureRandom UUIDs accordingly. tasks/list never returns recovered tasks, only the calling session's own. If you expose this server beyond loopback, put authentication in front of it.

Note on concurrency. A server-initiated request from inside a tool call only works because the SDK dispatches inbound requests concurrently once the session is initialized — otherwise the client's reply would be stuck behind the very handler waiting for it. Besides making elicitation possible, this means ping, tasks/get and notifications/cancelled are answered promptly during a long fetch_library instead of queueing behind it, and a fetch_library the client cancels actually stops.

Telemetry

Pass --otel to export a trace span for every MCP request (tools/call, resources/read, prompts/get, completion/complete) over OTLP/HTTP. It is off by default, and off means inert: no SDK, no exporter threads, no network.

Configuration is the standard OpenTelemetry environment surface — there are no bespoke flags:

bash
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318   # '/v1/traces' is appended for youexport OTEL_SERVICE_NAME=kotlin-lib-mcp                    # this is also the defaultexport OTEL_RESOURCE_ATTRIBUTES=deployment.environment=devserver --transport stdio --otel

The protocol defaults to http/protobuf, the endpoint to http://localhost:4318, and the exporter uses the JDK's built-in HTTP client (no OkHttp on the classpath). Everything is overridable: OTEL_EXPORTER_OTLP_HEADERS for a hosted collector's API key, OTEL_TRACES_EXPORTER, OTEL_BSP_SCHEDULE_DELAY, and so on.

Endpoint gotcha. With the generic OTEL_EXPORTER_OTLP_ENDPOINT, /v1/traces is appended automatically. With the per-signal OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, the URL is used as-is — you must spell out the path yourself. This is the most common OTLP misconfiguration.

Spans follow the MCP semantic conventions: named {method} {target} (e.g. tools/call fetch_library), SpanKind.SERVER, and carrying mcp.method.name, gen_ai.tool.name, mcp.session.id, and network.transport (pipe for stdio, tcp for http). A tool that returns isError is marked error.type=tool_error. Inbound trace context is picked up from the JSON-RPC params._meta bag (traceparent/tracestate, per SEP-414), so a client that traces its own work gets one connected trace.

Those mcp.* and gen_ai.* attributes are still Development status upstream and may be renamed — one more reason the whole feature is opt-in.

Resources: each cached library is readable at kotlinlib://{group}/{artifact}/{version}/index — a summary as JSON: KMP targets, declaration, file and package counts, and its packages (up to 200). Each package's public API (signature and KDoc summary per declaration, up to 200) is readable at kotlinlib://{group}/{artifact}/{version}/package/{package}; the tools page through anything past those caps. The resource list updates as libraries are fetched, both URI shapes are published as resource templates so any cached coordinate is directly addressable, and template variables — including package — autocomplete from the cache. Tools point at them too: fetch_library returns a resource_link to the library's index, and list_packages links the first 20 packages of each page, so a client can attach them without another lookup. Prompt: explain_public_api(coordinate, package?) renders an explanation request grounded in the cached signatures and KDoc.

Icons: the server, every tool, the prompt and the library-index resource/template each declare an SEP-973 icon, so a client can show the surface visually instead of as a wall of snake_case. They are inlined as data: URIs rather than hosted URLs — a stdio server has no origin, and the spec asks consumers to prefer same-origin icons and fetch them without credentials, so inlining removes the third-party fetch entirely and keeps the icons working offline and inside the container image. The payload is PNG, the one format icon-rendering clients must support (image/svg+xml is only a SHOULD, and the spec warns it may carry executable content). The glyphs are drawn by tools/src/main/kotlin/GenerateIcons.kt (./gradlew :tools:generateIcons) and kept small — about 800 bytes encoded each, since they ride in every tools/list. The same geometry also writes the vector brand mark, assets/icon.svg, and a test fails if any committed icon stops matching it.

Building from source

sh
./gradlew build                                    # build everything./gradlew test                                     # unit tests./gradlew :server:run --args="--transport stdio"   # local MCP over stdio (default)./gradlew :server:run --args="--transport http --port 3000"   # Streamable HTTP at /mcp./gradlew :dashboard:run                           # Compose Desktop UI./gradlew :server:installDist                      # standalone launcher in server/build/install/server/bin

Requires JDK 25 (a Gradle toolchain: an installed JDK 25 is detected, otherwise Gradle downloads one).

ModuleWhat it is
core/KMP library: domain model + ports (commonMain); Maven fetcher, zip extractor, Analysis API analyzer, on-disk cache (jvmMain)
server/JVM app: MCP tools/resources/prompts + stdio and Streamable HTTP transports
dashboard/Compose Desktop control panel embedding the server (optional)
tools/Generator for the SEP-973 icon PNGs the server advertises and the brand SVG. The module never ships; its output does

Cache

Downloads and the parsed index live under the OS cache dir + kotlin-lib-mcp (%LOCALAPPDATA%\kotlin-lib-mcp on Windows, ~/Library/Caches/kotlin-lib-mcp on macOS, $XDG_CACHE_HOME/kotlin-lib-mcp elsewhere), keyed by group/artifact/version — browsable and safe to delete. --cache-dir overrides it. Under --tasks, task records live in a tasks/ subdirectory of the same root.

Notes

  • stdio rule: stdout carries only MCP protocol frames; all logging goes to stderr (Kermit → SLF4J → Logback, logback.xml).
  • Kotlin and the Analysis API artifacts are version-locked in gradle/libs.versions.toml — bump them together. Symbols whose types can't be resolved (missing transitive deps) degrade to bestEffort: true PSI signatures instead of failing.

Privacy

Nothing about you is collected, stored remotely, or shared. There is no analytics, no phone-home, no account, and no credential of any kind.

  • What leaves your machine. Only requests to the Maven repositories you point it at (Maven Central, plus any --repo; --no-maven-central drops Central): the maven-metadata.xml, .pom/.module metadata and sources jar for the coordinates you ask about. Those repositories see the coordinate and your IP, under their own privacy policies. Pulling the Docker image likewise talks to GHCR, and the Claude Code plugin's launcher talks to this repository's GitHub releases (the releases API at most once a day, and a download when there is a new server). That is the complete list of outbound traffic.
  • What it reads. Downloaded library sources only. It does not read, index or transmit your project's code — it has no access to it.
  • What it stores, and where. Downloaded artifacts and the parsed index, on your disk only, under the OS cache directory (see Cache) or --cache-dir. Under --tasks, task records live in a tasks/ subdirectory. Nothing is written anywhere else.
  • Retention. Cached libraries stay until you delete them — the directory is browsable and safe to remove at any time. Task records are dropped once their TTL elapses (10 minutes by default, 1 hour maximum).
  • Logs. stderr on your machine. --forward-logs-to-client (opt-in) mirrors them to your MCP client; --otel (opt-in) exports trace spans to the OTLP collector you configure, and carries no personal data — method names, tool names, session id, transport. Both are off by default.
  • Contact. Questions: open an issue. Security or privacy reports: private vulnerability reporting.

Contributing

Contributions welcome — see CONTRIBUTING.md. Release history lives in CHANGELOG.md; security reports go through private vulnerability reporting.

Support

If kotlin-lib-mcp saves you time, consider sponsoring its maintenance. Sponsorship funds keeping the Analysis API version-lock current with new Kotlin releases and the supply-chain-hardened release pipeline. Every tier is appreciated.

License

Apache-2.0

来源:README.md,提交 7afa13c

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

5
  1. v0.10.1最新Oct 29, 2026
  2. v0.9.0Oct 20, 2026
  3. v0.8.0Oct 19, 2026
  4. v0.7.0Oct 2, 2026
  5. v0.6.0Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分