# Show HN: Java MCP Runtime for virtual threads

> Source: <https://tachyonmcp.dev>
> Published: 2026-09-12 13:35:09+00:00

### Protocol handling

Tools, resources and templates, prompts, completions, logging, elicitation, cancellation, progress, pagination, and subscriptions — conformance-tested against MCP **2025-11-25** and **2026-07-28**.

[Read the features guide](/docs/features/)

Java and Kotlin Model Context Protocol server runtime built on Netty. Write your handlers — Tachyon handles transport and protocol details.

Your first MCP server

```
 1var server = TachyonServer.builder()
 2    .name("weather-mcp")
 3    .withTools(tools -> tools.register(
 4            b -> b.name("get_forecast")
 5                .description("Get weather forecast")
 6                .inputSchema("""
 7                {"type":"object","properties":{"city":{"type":"string"}},"required":["city"]}
 8                """),
 9            (ctx, request) -> ToolResult.text("☀️ 22°C")))
10    .port(8080)
11    .build();
12server.start();
1import dev.tachyonmcp.kotlin.server.TachyonServer
2import dev.tachyonmcp.api.server.features.tools.ToolResult
3
4val server = TachyonServer(port = 8080) {
5    info { name = "weather-mcp"; version = "1.0" }
6    tool(name = "get_forecast", description = "Get weather forecast") {
7        ToolResult.text("☀️ 22°C, clear skies")
8    }
9}
```

Run synchronous Java handlers on **virtual threads**, or suspending Kotlin handlers — never on the Netty event loop.

Netty owns the socket and connection lifecycle. A localhost-only `Host`/` Origin` guard is **enabled by default**; deployments explicitly allow additional authorities.

Choose the Java builder or Kotlin DSL, register a tool, and start the server. [Open the quickstart](/docs/quickstart/)
