Launching today
Keryx
The Fullstack TypeScript Framework for MCP and APIs
3 followers
The Fullstack TypeScript Framework for MCP and APIs
3 followers
Keryx is a TypeScript framework built on Bun where one action class is your HTTP endpoint, your WebSocket handler, your CLI command, your background task, and your MCP tool. Same logic, validation, middleware, and response type. MCP and OAuth 2.1 are built in.




Secure MCP Framework by Arcade.dev
Hi! I'm Evan, the maker.
If you've shipped an MCP server in the last year, you've probably noticed you're writing your API twice. Your REST endpoints have Zod schemas, auth middleware, error handling, logging. Then you write a parallel MCP server that re-declares all of it with slightly different shapes, a different auth model, and its own way of returning errors. The two drift. Bugs only show up in one. It's the same duplication problem REST and WebSocket had a decade ago.
Keryx is the framework I wanted for that. You write one action class, and it's automatically your HTTP endpoint, your WebSocket handler, your CLI command, your background task, and your MCP tool. Same Zod inputs, same middleware chain, same response shape. The only thing that changes is how the request arrives.
That class is now a `PUT /api/user` endpoint, a WebSocket action, a CLI command with `--name` and `--email` flags generated from the schema, a Resque-backed background job, and an MCP tool with OAuth 2.1.
The stack underneath: Bun for runtime (native TS, no build step, fast test runner), Zod for validation, Drizzle for the database with auto-migrations, Resque for jobs, and a Vite + React example frontend with end-to-end typed responses via `ActionResponse`. First-party plugins for OpenTelemetry tracing and a Resque admin UI ship in the same repo.
Quick start:
bunx keryx new my-app
cd my-app && bun install && bun dev
We are pre-1.0, but it's real enough to share now. I'm running it in production, the docs at keryxjs.com are complete, and the example app is a working chat with channels, files, sessions, and the React frontend wired up. (For the Node.js old-timers: this is the spiritual successor to ActionHero, rewritten ground-up on Bun with MCP as a first-class transport.)
Happy to answer anything in the comments, especially curious to hear from people who've hit the "writing MCP twice" wall.
- Evan (@evantahler)