{"id":51365921,"url":"https://github.com/kpavlov/tachyon","last_synced_at":"2026-07-03T07:34:42.127Z","repository":{"id":366639638,"uuid":"1270386613","full_name":"kpavlov/tachyon","owner":"kpavlov","description":"💫 Tachyon MCP Runtime for JVM - a Java Model Context Protocol server with Streamable HTTP, native Netty transports, tasks, resources, prompts, resumable sessions, and stateless deployment support.","archived":false,"fork":false,"pushed_at":"2026-07-02T00:13:43.000Z","size":660,"stargazers_count":21,"open_issues_count":1,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-02T01:23:33.060Z","etag":null,"topics":["ai","ai-agent-tools","ai-agents","ai-agents-mcp","java","java-21","java-25","java-26","llm-tools","mcp","model-context-protocol","netty","server"],"latest_commit_sha":null,"homepage":"https://deepwiki.com/kpavlov/tachyon","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kpavlov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-15T16:59:19.000Z","updated_at":"2026-07-01T23:55:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kpavlov/tachyon","commit_stats":null,"previous_names":["kpavlov/tachyon"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/kpavlov/tachyon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kpavlov%2Ftachyon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kpavlov%2Ftachyon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kpavlov%2Ftachyon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kpavlov%2Ftachyon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kpavlov","download_url":"https://codeload.github.com/kpavlov/tachyon/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kpavlov%2Ftachyon/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35077511,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-03T02:00:05.635Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","ai-agent-tools","ai-agents","ai-agents-mcp","java","java-21","java-25","java-26","llm-tools","mcp","model-context-protocol","netty","server"],"created_at":"2026-07-03T02:00:33.831Z","updated_at":"2026-07-03T07:34:42.122Z","avatar_url":"https://github.com/kpavlov.png","language":"Java","funding_links":[],"categories":["人工智能"],"sub_categories":["MCP"],"readme":"\u003cdiv\u003e\n\u003c/div\u003e\n\n[![Maven Central](https://img.shields.io/maven-central/v/dev.tachyonmcp/tachyon-server)](https://repo1.maven.org/maven2/dev/tachyonmcp/tachyon-server/)\n[![Java 21+](https://img.shields.io/badge/Java-21+-orange.svg?logo=jvm)](http://java.com)\n[![Build](https://github.com/kpavlov/tachyon/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/kpavlov/tachyon/actions/workflows/build.yml)\n[![Conformance: v0.1.16](https://img.shields.io/badge/Conformance-v0.1.16-green?logo=modelcontextprotocol)](https://github.com/modelcontextprotocol/conformance)\n[![codecov](https://codecov.io/gh/kpavlov/tachyon/graph/badge.svg?token=WUMD9A8T2T)](https://codecov.io/gh/kpavlov/tachyon)\n\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/kpavlov/tachyon)\n\n**Tachyon MCP** is a Java 21 [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server built on [Netty](https://netty.io). Implements the **2025-11-25** Streamable HTTP transport, protocol extensions, and stateless mode.\n\n**TL;DR**\n\n1. Add dependency:\n\n    ```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003edev.tachyonmcp\u003c/groupId\u003e\n        \u003cartifactId\u003etachyon-server\u003c/artifactId\u003e\n        \u003cversion\u003e1.0.0-beta.3\u003c/version\u003e\n    \u003c/dependency\u003e\n    ```\n\n2. Create MCP server:\n\n    ```java\n    import dev.tachyonmcp.server.TachyonServer;\n    import dev.tachyonmcp.server.features.tools.AbstractSyncToolHandler;\n    import dev.tachyonmcp.server.features.tools.ToolArgs;\n    import dev.tachyonmcp.server.features.tools.ToolDescriptor;\n    import dev.tachyonmcp.server.features.tools.ToolResult;\n    import dev.tachyonmcp.server.session.McpContext;\n    import tools.jackson.databind.node.JsonNodeFactory;\n\n    void main() {\n        var schema = JsonNodeFactory.instance.objectNode();\n        schema.put(\"type\", \"object\");\n        schema.putObject(\"properties\").putObject(\"city\").put(\"type\", \"string\");\n\n        TachyonServer.builder()\n            .name(\"weather-mcp\")\n            .tool(new AbstractSyncToolHandler(\n                ToolDescriptor.builder(\"get_forecast\")\n                    .description(\"Get weather forecast\")\n                    .inputSchema(schema)\n                    .build()) {\n\n                @Override\n                public ToolResult handle(McpContext ctx, ToolArgs args) {\n                    return ToolResult.text(\"☀️ 22°C\");\n                }\n            })\n            .session(cfg -\u003e cfg.stateless(true))\n            .port(8080)\n            .start();\n    }\n    ```\n\n## Documentation\n\n| Guide | Description |\n|---|---|\n| [Quickstart](docs/quickstart.md) | Build a working server in 5 minutes |\n| [Tools](docs/tools.md) | Sync/async handlers, input schema, `ToolResult` |\n| [Resources](docs/resources.md) | Static URIs, dynamic handlers, URI templates |\n| [Tasks](docs/tasks.md) | Long-running operations, state machine, `TasksExtension` |\n| [Extensions](docs/extensions.md) | Custom protocol extensions, negotiation |\n| [Kotlin DSL](docs/kotlin.md) | Coroutine-first DSL, `TachyonServer { }`, scope reference |\n| [Kotlin module](tachyon-server-kotlin/README.md) | `tachyon-server-kotlin` module overview |\n\n## Agent Skill\n\nAdd agent skill to write better code using this SDK:\n\n```shell\nnpx skills add kpavlov/tachyon --skill tachyon-mcp\n```\n\nThe skill includes compilable Java and Kotlin example sources under `.agents/skills/tachyon-mcp/resources/`.\nThey are linked into `e2e/src/skill/` and compiled during `mvn test` to keep them valid.\n\nCheck out [Skills CLI](https://github.com/vercel-labs/skills) for more options.\n\n## Features\n\n### Core Protocol (46/46 conformance tests passing)\n\n- JSON-RPC 2.0 — request/response/error/notification\n- Streamable HTTP — POST, GET (SSE), DELETE, OPTIONS\n- Lifecycle — initialize → initialized → ACTIVE\n- Pagination — cursor-based across all list methods\n- Session state machine — INITIALIZING → ACTIVE → CLOSED\n- CORS \u0026 origin validation\n- DNS rebinding protection\n- Accept header strict validation (406)\n- Pending request timeout (60s)\n- Extensions ([SEP-2133](https://modelcontextprotocol.io/seps/2133-extensions))\n\n### Tools\n\n- `tools/list` — paginated with `nextCursor`\n- `tools/call` — returns `CallToolResult` with `isError`\n- `outputSchema` in listing\n- `annotations` field\n- `execution.taskSupport` (forbidden/optional/required)\n- Synchronous \u0026 asynchronous handler interfaces\n- Tool name validation ([SEP-986](https://modelcontextprotocol.io/seps/986-specify-format-for-tool-names))\n- `notifications/tools/list_changed` on add/remove\n- Inline notifications + logging during tool call\n- Input JSON Schema 2020-12 validation ([SEP-1613](https://modelcontextprotocol.io/seps/1613-establish-json-schema-2020-12-as-default-dialect-f))\n\n### Resources\n\n- `resources/list` — paginated\n- `resources/read` — text \u0026 blob content\n- `resources/templates/list` — URI templates\n- `resources/subscribe` / `unsubscribe`\n- `notifications/resources/list_changed`\n- `notifications/resources/updated` to subscribers\n- Dynamic content via `ResourceHandler` interface\n\n### Prompts\n\n- `prompts/list` — paginated with `nextCursor`\n- `prompts/get` — invokes prompt resolver\n- `notifications/prompts/list_changed`\n\n### Tasks\n\n- `tasks/list`, `tasks/get`, `tasks/cancel`, `tasks/result`\n- State machine enforcement — SUBMITTED → WORKING → INPUT_REQUIRED → COMPLETED/FAILED/CANCELLED, plus REJECTED/AUTH_REQUIRED\n- `notifications/tasks/status` broadcast on every transition\n- Task Janitor for stale tasks\n- `execution.taskSupport` per tool (forbidden/optional/required)\n- `TasksExtension` ([SEP-1686](https://modelcontextprotocol.io/seps/1686-tasks)) — negotiable extension exposing `create_task` tool + `task://{id}` resource template\n- Extension-gated tool visibility (hidden from un-negotiated clients)\n\n### Logging \u0026 Observability\n\n- `logging/setLevel` per session\n- `notifications/message` emitted above threshold\n- Progress notifications\n\n### Client Communication\n\n- `sampling/createMessage` — server → client request\n- Elicitation — ✅ form mode; ❌ url mode\n- `notifications/cancelled` — bidirectional\n- `notifications/tasks/status` from client\n\n### Transport \u0026 I/O\n\n- Netty 4.2\n- io_uring / epoll / kqueue / nio auto-detection\n- Platform-thread event loops + virtual-thread handlers\n- TCP_NODELAY, SO_KEEPALIVE\n- Channel writability backpressure (`setAutoRead`)\n- Configurable idle timeouts (reader/writer)\n\n### Session Management\n\n- SSE resumability via Last-Event-ID\n- **Stateless mode** — skip sessions for serverless\n- IN_MEMORY session store (ConcurrentHashMap)\n- Session Janitor — 5s sweep, 30s TTL\n- SSE disconnect ≠ session removal (supports reconnect)\n- Event log replay on reconnection\n\n---\n\n## Installation\n\n**Requirements**: JDK 21+\n\n### Build from source\n```bash\ngit clone https://github.com/kpavlov/tachyon.git\ncd tachyon\nmvn install -pl tachyon-server -DskipTests\n```\n\n## Quick Start\n\nSee [docs/quickstart.md](docs/quickstart.md) for a full walkthrough with Java and Kotlin examples, curl test, and next-step links.\n\n### TasksExtension (SEP-1686)\n\n```java\nvar handle = TachyonServer.builder()\n    .extension(TasksExtension.instance())  // exposes create_task tool + task://{id} resource\n    .port(8080)\n    .start();\n```\n\nClients that include `\"extensions\": {\"io.modelcontextprotocol/tasks\": {}}` in their `initialize` capabilities receive the extension's tool and resource template. Clients that don't negotiate it see standard `tasks/*` methods. See [docs/tasks.md](docs/tasks.md).\n\n### Protocol isolation\n\nHandler interfaces (`ToolHandler`, `ResourceHandler`, `PromptHandler`) and descriptor types use stable domain types. When Tachyon upgrades to a new protocol version, only the internal mapper layer changes; handler implementations are unaffected. Domain types track the 2026-07-28 spec shape where it improves on 2025-11-25 (e.g. `Annotations.lastModified`, `ResourceLink` in `ContentBlock`).\n\n## Performance\n\n- **Native transports** — io_uring \u003e epoll \u003e kqueue \u003e NIO auto-detect\n- **Write buffer watermarks** — 32 KB low / 128 KB high, backpressure wired\n- **Batch flushing** — `ctx.write()` accumulates, single `ctx.flush()` on boundary\n- **Minimal allocations** — `McpEndpointHandler` is `@Sharable`, no per-request handler creation\n- **Virtual threads** — handlers offloaded from event loop, no manual thread pools\n- **JSON-RPC** — Jackson streaming codec, no ObjectMapper.\n\n## Gaps \u0026 Limitations\n\n- [ ] **Rate limiting** — Not yet implemented\n- [ ] **2026-07-28 draft protocol version** — High priority\n- [ ] **Stale session on re-initialize** — 30s TTL lingering, affects reconnect only\n\n---\n\n## FAQ\n\n### Can I deploy to AWS Lambda?\nYes. Use `.session(cfg -\u003e cfg.stateless(true))` to skip session persistence. Each invocation processes one request independently.\n\n### Does it support HTTP/2?\nNot yet. The current transport targets HTTP/1.1.\n\n### How do I write a tool?\nSee [docs/tools.md](docs/tools.md) — covers lambda and class-based handlers, input schema, and `ToolResult` factories.\n\n### How do I expose a resource?\nSee [docs/resources.md](docs/resources.md) — covers static URIs, dynamic handlers, URI templates, and subscriptions.\n\n## License\n\n**Tachyon MCP** is available under the terms of the [Apache 2.0](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkpavlov%2Ftachyon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkpavlov%2Ftachyon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkpavlov%2Ftachyon/lists"}